精华内容
下载资源
问答
  • Matlab串口通信

    千次阅读 2019-11-13 10:14:51
    matlab 2019对串口部分操作函数进行了升级,提升了性能和可靠性 主要替代关系如下 Theserialfunction, its object functions, and its properties are not recommended. Useserialportinstead. serialInterface ...

    matlab 2019对串口部分操作函数进行了升级,提升了性能和可靠性

    主要替代关系如下

    The serial function, its object functions, and its properties are not recommended. Use serialport instead.

    serial Interface serialport Interface Example
    seriallist serialportlist Discover Serial Port Devices
    serial serialport Connect to Serial Port Device
    fwrite and fread write and read Read and Write
    fprintf writeline Send a Command
    fscanffgetl, and fgets readline Read a Terminated String
    flushinput and flushoutput flush Flush Data from Memory
    Terminator configureTerminator Set Terminator
    BytesAvailableFcnCountBytesAvailableFcnMode,BytesAvailableFcn, and BytesAvailable configureCallback Set Up a Callback Function
    PinStatus getpinstatus Read Serial Pin Status
    DataTerminalReady and RequestToSend setDTR and setRTS Set Serial DTR and RTS Pin States

     

     

    搜索串口

    2019之前

    显示串行端口的列表
    seriallist 函数显示系统上所有串行端口的列表。

    显示可用的串行端口。

    seriallist
    ans = 

      1×2 string array

      "COM1"    "COM3"
    现在,您可以创建 serial 对象,并通过串行端口通信。

    2019之后推荐的方法

    serialportlist

    serialportlist("all")

    serialportlist("available")

    举例

    识别电脑上的串口

    ports = serialportlist
    ports = 

      1×4 string array

        "COM1"    "COM3"    "COM11"    "COM12"
    识别目前可用的串口

    freeports = serailportlist("available")
    freeports = 

      1×2 string array

        "COM1"    "COM12"

     

     

    使用串口

     

    2019之前

    s = serial("COM1");
    s.BaudRate = 115200;
    fopen(s)

    2019之后推荐的方法

    s = serialport("COM1",115200);

    读写串口

    2019之前

    % s is a serial object
    fwrite(s,1:5,"uint32")
    data = fread(s,5,"uint32")
    % s is a serial object
    command = "start";
    fwrite(s,command,"char")
    % s is a serial object
    length = 5;
    resp = fread(s,length,"char")

    2019之后推荐的方法

    % s is a serialport object
    write(s,1:5,"uint32")
    data = read(s,5,"uint32")
    % s is a serialport object
    command = "start";
    write(s,command,"char")
    % s is a serialport object
    command = "start";
    write(s,command,"string")
    % s is a serialport object
    length = 5;
    resp = read(s,length,"string")

     

    发送SCPI命令

    之前

    % s is a serial object
    s.Terminator = "CR/LF"
    channel = 1;
    level = 3.44;
    fprintf(s,"TRIGGER%d:LEVEL2 %1.2f",[channel,level]);

    现在推荐的方法

    % s is a serialport object
    configureTerminator(s,"CR/LF")
    channel = 1;
    level = 3.44;
    cmd = sprintf("TRIGGER%d:LEVEL2 %1.2f",[channel,level]);
    writeline(s,cmd)

     

    接收SCPI

    % s is a serial object
    fprintf(s,"MEASUREMENT:IMMED:TYPE PK2PK")
    a = fscanf(s,"%e",6)
    % s is a serial object
    fprintf(s,"*IDN?")
    a = fgetl(s)
    % s is a serial object
    fprintf(s,"*IDN?")
    a = fgets(s)

     

    现在推荐的方法

    % s is a serialport object
    writeline(s,"MEASUREMENT:IMMED:TYPE PK2PK")
    a = readline(s)
    sscanf(a,"%e")
    % s is a serialport object
    writeline(s,"*IDN?")
    a = readline(s)

     

    设置结束符

    之前

    % s is a serial object
    s.Terminator = "CR/LF";
    % s is a serial object
    s.Terminator = {"CR/LF" [10]};

    现在推荐的方法

    % s is a serialport object
    configureTerminator(s,"CR/LF")
    % s is a serialport object
    configureTerminator(s,"CR/LF",10)

     

    回调函数

    之前

    s = serial("COM5","BaudRate",115200)
    s.BytesAvailableFcnCount = 5
    s.BytesAvailableFcnMode = "byte"
    s.BytesAvailableFcn = @instrcallback
    
    fopen(s)
    
    function instrcallback(src,evt)
       data = fread(src,src.BytesAvailable)
       disp(evt)
       disp(evt.Data)
    end

    现在推荐的方法

    s = serialport("COM5",115200)
    configureCallback(s,"byte",5,@instrcallback);
    
    function instrcallback(src,evt)
       data = read(src,src.NumBytesAvailable,"uint8")
       disp(evt)
    end

     

    API

    2019之前   https://ww2.mathworks.cn/help/matlab/serial-port-devices.html?s_tid=CRUX_lftnav

    2019  https://ww2.mathworks.cn/help/matlab/serial-port-devices.html?lang=en

    串口api变化  https://ww2.mathworks.cn/help/matlab/matlab_external/transition-your-code-to-serialport-interface.html

     

    Matlab工具箱介绍

    https://ww2.mathworks.cn/help/index.html?s_tid=CRUX_lftnav

     

     

    2019之前通过串口发送十六进制数据

    try
    controller1=serial('com9');
    controller1.BaudRate=9600;
    set(controller1,'Baudrate',9600,'DataBits',8,'Parity','none','StopBits',1);

    fopen(controller1);

    %method 1
    Str = 'FF0101003F';     %string defines the hexadecimal content to be sent
    D = sscanf(Str, '%2x'); %converts a string to hex data
    fwrite(controller1, D, 'uint8') %Send this data to the defined serial port s

    %method 2
    sendbuff=zeros(1,6);
    sendbuff(1)= hex2dec('FF');
    sendbuff(2)= hex2dec('01');
    sendbuff(3)= hex2dec('01');
    sendbuff(4)= hex2dec('00');
     
    fwrite(controller1, sendbuff, 'uint8');


    fclose(controller1);
    catch ME
        fprintf('%s\n',ME.message);
    end

        num = ['FF';'01';'01';'00';'30';'CF'];  
        num = hex2dec(num );
    fwrite(controller1, num, 'uint8');


    test = [164 0 0 14 8 49  2 51 52 164];
    [x,y] = size(test);
    %test_hex = dec2hex(test);
    fwrite(scom1, test, 'uint8');

    val = [170 180 val 85]; 
    fwrite(scom, val, 'uint8', 'async'); %数据写入串口 PC机上位机发送 这是当年做智能车时的Matlab_GUI 串口上位机 自己help fwrite看下就好 我也忘了这什么意思了 这是当时一段的代码 单片机接收的就是16进制数 数值为val 中的4个数 
    PC机接收单片机传来数据:
    n_bytes = get(obj,'BytesAvailable');     %% 数据总数量
       if n_bytes      %% 有效读取 防止Matlab延迟进入或误进入
       Data = fread(obj, n_bytes, 'uchar')';     %% 读走数据并存入Data中 直接为十进制数值形式
     

         num = ['FF';'01';'01';'00';'30';'CF'];  
        num = hex2dec(num );
        fprintf(sr3,num );

    原理就是把16进制转化为10进制,再以十进制发送,串口以十六进制接收的时候就是接受的原始数据, 

     


    最近在做串口通信的实验,串口连接都已经完成,我的仪器需要发送一个16位进制数才能返回一个数据,我需要发送的16进制数为‘4053 0000 0d0a’,我用fwrite来发送,用fread来读取,未能成功,请教罗老师该怎么修改?!书中的串口实例我也用过,不成功,但是我用VC版的串口小精灵能调通,希望罗老师能帮我指引一下,非常感谢!

    fwrite(scom,val,'uint8','async');    %其中val就是我要发送的命令


    已经自己解决了,原来fwrite可以输入数字矩阵,只要把‘4053 0000 0d0a’以一个字节为单位转换为十进制的数字矩阵就可以了,转换后为[64 83 00 00 13 10]就可以了,之前一直以为是把16进制统一转换成10进制。

    fwrite(scom,[64 83 00 00 13 10],'unit8','async')


    out=fread(s,10,'uint8');   %一次读出10个字符  
    fprintf('%3c',out);        %一个字符占三位输出,%c字符,%d整型


     

    展开全文
  • MATLAB串口通信

    万次阅读 多人点赞 2015-05-20 16:28:36
    Matlab并不具备直接访问硬件的能力,但是支持面向对象技术,通过调用Instrument Control Toolbox中的serial类函数来创建串口对象,对串口对象操作就是对串口操作,使用起非常方便。同时,Matlab封装的串口对象支持对...
     Matlab并不具备直接访问硬件的能力,但是支持面向对象技术,通过调用Instrument Control Toolbox中的serial类函数来创建串口对象,对串口对象操作就是对串口操作,使用起非常方便。同时,Matlab封装的串口对象支持对串口的异步读写操作,使得计算机在读写串口时能同时进行其他处理工作,因而能大大提高计算机执行效率。Matlab用多线程技术实现这种异步操作,通过异步读写设置,计算机在执行读写串口函数时能立即返回不必等待串口把数据传输完毕,当指定的数据传输结束时就触发事件,执行事件回调函数,可以在事件回调函数中编程,进行数据处理,这样就不会造成因等待串口传输数据引起的时间浪费。
    

    MATLAB的Instrument Control Toolbox提供了 MATLAB与仪器仪表通信的功能 ,它支持 GPIB 通用接口总线 、VISA、TCP/ IP、UDP、RS2232等多个协议 ,具有同步和异步读写功能以及事件处理和回调操作功能,可读写和记录二进制和ASCII文本数据。与串口有关的主要函数如下[3]:

    1)建立串口对象函数:obj=seril(’port’,’property name’,propertyvalue……),其中主要的属性有:baudrate(波特率),databits(数据位),parity(校验方式),stopbits(终止位)等,可以在初始化时进行赋值或者使用set函数。
    (2)打开串口设备对象:fopen(obj)
    (3)串口读写操作:当matlab通信数据采用二进制格式时,读写串口设备的命令为fread()和fwrite();当通行数据采用文本(ASCII)格式时,读写串口设备的命令为fscanf()和fprintf()。
    (4)关闭并清除设备对象:
    Fclose(obj);%关闭串口设备对象
    Delete(obj);%删除内存中的串口设备对象

    基于本系统串口通信协议,对串口对象的读写部分程序如下(简单例程),查询方式

    Obj=serial(’com1’,’baudrate’,9600,’parity’,’none’,’databits’,8,’stopbits’,1);%初始化串口
    Fopen(obj);%打开串口对象
    Fwrite(obj,256);%向串口发送握手信号0xff
    TMP=fread(obj,3,’unit8’);%从串口读取3字节数据,后2个即是16bit温度数据
    If TMP(1)= =256   %判断第一个字节受否是握手信号
    For i = 13
    Dat(i)=TMP(i+1);%剔除第一个握手信号字节
    End
    End
    Fclose(obj);%关闭串口设备对象
    Delete(obj);%删除内存中的串口设备对象 

    2.中断方式通信
    参考:http://blog.sina.com.cn/s/blog_62de76a90100fhbw.html
    从Matlab6.0版本开始,Mathworks公司在软件中增加了设备控制箱(instrument control toolbox),提供了对RS-232/RS-485通信标准串口通信正式支持。利用该工具箱serial类及instrcallback()回调函数,能可靠地进行实时串地通信。为此,笔者充分结合单片机和Matlab优点,基于事件驱动中断通信机制,提出了一种Matlab环境下PC机与单片机实时串行通信数据处理方法,极大地简化开发流程,提高了系统开发效率。另外,与目前普遍采用基于Matlab查询方式下非实时串行通信技术相比,这种方法实用性也大大增强了
    在Matlab6.0中新增设备控制工具条(instrument control toolbox)用来负责上、下位机之间通信。该设备控制工具箱特色如下:

    ①支持基于串行接口(RS-232、RS-422、RS-485)、GPIB总线(IEEE2488、HPIB标准)、VISA总线通信;

    ②通信数据支持二进制和文本(ASCII)两种方式,文本方式支持SCPI(Standard Commands for Programmable Instruments)语言;

    ③支持异步通信和同步通信;

    ④支持基于事件驱动通信。

    从以上Matlab设备控制工具箱特点可以看到,Matlab完全可以满足我们实现串行通信要求。

    3.1 Matlab对串行口控制基础知识

    Matlab对串行口编程控制主要分为四个步骤。

    ①创建串口设备对象并设置其属性。

    scom=serial(‘com1’);%创建串口1设备对象scom

    scom.Terminator=’CR’;%设置终止符为CR(回车符),缺省为LF(换行符)

    scom.InputBufferSize=1024;%输入缓冲区为256B,缺省值为512B

    scom.OutputBufferSize=1024;%输出缓冲区为256B,缺省值为512B

    scom.Timeout=0.5;%Y设置一次读或写操作最大完成时间为0.5s,缺省值为10s

    s.ReadAsyncMode=’continuous’(缺省方式);%在异步通信模式方式下,读取串口数据采用连续接收数据(continuous)缺省方式,那么下位机返回数据会自动地存入输入缓冲区中.

    注意:在些属性只有在对象没有被打开时才能改变其值,如InputBufferSize、OutputBufferSize属性等。对于一个RS-232/RS-422/RS-485串口设备对象,其属性缺省值为波特率9 600b/s,异步方式,通信数据格式为8位数据位,无奇偶校验位,1位停止位。如果要设置串口设置对象属性值与缺省值属性值相同,用户可以不用另行设置。

    另外,设置串口设置对象属性也可以用一条指令完成,如:scom=serial(‘COM1’,’BaudRate’,38400,’Parity’,’none’,’DataBits’,8,’StopBits’,1)。也可以用set命令,如set(scom,’BaudRate’,19200,’Parity’,’even’)。创建了对象后可以在Matlab命令窗口直接敲对象名并回车,看到其基本属性和当前状态。若需要知道其全部属性,可以用get(scom)命令。

    ②打开串口设备对象。

    fopen(scom);

    ③读写串口操作。初始化并打开串口调协对象之后,现在可以对串口设备对象进行读写操作,串口读写操作支持二进制和文本(ASCII)两种方式。当Matlab通信数据采用西方(ASCII)方式时,读写串口设备命令分别是fscanf、fpritf;当Matlab通信数据采用二进制方式时,读写串口设备命令分别是fread、fwrite。下面以文本方式读写串口为例:

    a.读串口。A=fscanf(scom,’%d’,[10,100];%从串口设备对象scom中读入10*100个数据填充到数组A[10,100]中,并以整型数据格式存放。PCbfans.cn提示请看下图:Matlab环境下PC与单片机的串行通信及数据处理 - huzoy - mylearning

    h.写串口。Fprintf(scom,’%s’,’RS232’,’async’);%将字符串‘RS232?’以字符数据格式写入到串口设备scom,写操作以异步方式进行。

    ④关闭并清除设备对象。

    fclose(scom);%关闭串口设备对象

    delete(scom);%删除内存中串口设备对象

    clear scom; %清除工作空间中串口设备对象

    当不再使用该串口设备对象时,顺序使用以上3条命令,可以将所创建串口对象对象清除,以免占用系统资源。

    可以看出,在Matlab中进行串行通信是十分方便,编程较为简单。而且,在Matlab中串行通信失误率很低,通信较为可靠,也可以采用增加握手信号以及数据校验等方式进一步增加通信可靠性。

    3.2 Matlab实现串行通信软件设计

    在Matlab环境下,读取串口数据方式可以分为两种—查询和中断。以查询方式进行串行通信时,如下位单片机有大量数据分时分批传送给PC机,就需要不停查询串行口缓冲区,有数据就读取;虽然编程容易,但这样做不能对数据进行实时处理,系统实时性不高,而且会极大地占用系统资源。以中断方式对串口进行控制实现串行通信,就可以实时处理下位机传送数据;但编程相对复杂一些,需要采用Matlab事件和回调函数机制。

    (1)基于Matlab查询方式异步串行通信编程

    Matlab查询方式串行通信编程虽然简单,但这种方法在实际应用中实用价值不高,下面只作简单介绍。通信源程序如下:

    clc;%初始化串口设备对象,设置串口属性为:PC机com2口,输入缓冲区为1024,读写最大完成时间为0.6s,波特率为115 200b/s,1位停止位,遇到换行符中止,硬件流控制

    g=serial(‘com2’);

    g.InputBufferSize=4096;

    g.timeout=0.6;

    g.BaudRate=115200;

    g.Parity=’none’;

    g.StopBits=1;

    g.Terminator=’LF’;

    g.FlowControl=’hardware’;

    fopen(g);%打开串口设备对象s

    fwrite(g,255);%以二进制方式发送握手信号0xFF,缺省为异步通信方式

    out=fread(g,33,’uint8’)%接收单片机发送33个数据(8位),并存入out数组中

    %释放串口设备对象

    fclose(g);

    delete(g);

    clear g;

    (2)基于Matlab中断方式实时串行通信编程

    在Matlab环境下以中断方式进行串行通信,实际上是采用事件驱动方法实现。Matlab提供了instrcallback(obj,event)回调函数,用户根据需要可以自行设置具体串行通信事件。Matlab常用串行口通信中断事件有:缓冲区有指定字节数目数据可用事件(bytes-available event)、串口接收到数据长时间处于非激活状态事件(break-interrupt event)、串行口引脚状态改变事件(pin-status event)、输出缓冲区为空事件(output empty event)等。当串口上有监视事件发生时,Matlab会自动调用回调函数进行通信事件处理。因此,事件驱动实质上是一种中断机制,而回调函数实质上相当于一个中断服务子程序。Matlab端实时串行通信程序流程如图4所示。以下是具体编程步骤。

    ①建立一个串行通信主程序:serial.m文件,在主程序中进行串口设备初始化操作,并指定回调函数中串行通信事件。

    程序主要源代码如下(创建串口设备对象、设备串口设备属性及打开串口等初始化操作代码与前述查询方式下初始化代码相同):

    %设置回调函数触发事件—当串口缓冲区中有33字节数据时,触发中断事件,此后主程序自动调用instrcallback(obj,event)回调函数

    g.BytesAvaibleFcnMode=’byte’;%中断触发事件为‘bytes-available Event’

    g.BytesAvailableFcnCount=33;%接收缓冲区每收到33个字节时,触发回调函数

    g.BytesAvailableFcn=@instrcallback;%得到回调函数句柄

    fopen(g);%连接串口设备对象

    fwrite(g,255);%写串口,发送握手信号0xFF(等价于十进制下数值255)

    ②修改instrcallback(obj,event)回调函数,对所发生串口通信事件进行处理。

    Matlab缺省回调函数instrcallback(obj,event)存在于instrcallback.m文件中。该文件实际上是一个有待于用户修改程序模块。其中只有一些最基本程序代码,能够显示导致串口中断发生是哪一类事件,中断事件所发生时间以及导致事件发生对象名等信息(修改回调函数文件时,注意要取消文件中相应信息后分号,才能够在Matlab命令窗口(command window)中将这些信息显示出来)。中断发生后通信事件处理以及通信数据分析处理任务,需要用户自行添加相应服务程序代码。

    PCbfans.cn提示请看下图:Matlab环境下PC与单片机的串行通信及数据处理 - huzoy - mylearning

    Matlab安装目标下有两个instrcallback.m文件,我们只需要修改@instrument目录下instrcallback.m文件即可。当然,在修改instrcallback.m文件之前,最好对其做一个备份。另外,需要注意是:程序调试过程中如果再次修改了该回调函数,要重新启动Matlab配置该文件,才能使得新回调函数文件生效。

    修改后instrcallback.m文件见网站www.dpj.com.cn。该修改后回调函数能够完成如下任务:

    ①实时接收单片机实时5ms发送33个串行通信数据,其中包括1个握手信号和32个A/D转换数据(这些数据是PIC单片机系统采集到传感器信号,每个数据占1字节),并存储在out数组中;

    ②对接收到数据进行处理,由于PIC单片机A/D转换值为10位,占2字节,而单片机每次只能传送1个字节数据,故将收到每两个通信数据整合成为1个真实A/D转换数据,共16个A/D转换数据,并存储在Dataout数组中;

    ③将接收到串口数据存储到serialdata.txt文件中,将整合后单片机A/D转换数据存储到一个以中断事件发生时间为文件名txt文件中;

    ④根据A/D转换数据,利用Matlab求其最大值、最小值和平均值,并利用FIR滤波器对传感器信号A/D转换值作FIR滤波处理,得到窗格为5滑动滤波平均值;

    ⑤利用Matlab中plot()函数实时绘制单片机采集到传感器信号原始波形图和FIR滤波后波形图,如图5所示,可以看到经过FIR滤波后传感器动态信号值较为稳定,精度大幅提高。

    实验证明,基于Matlab中断方式PC机与单片机实时串行通信稳定可靠,处理数据方便,编程简单,开发效率大大提高。

    4 结论

    本文介绍基于Matlab环境下PC机与PIC单片机串行通信实现方法,利用MatlabInstrument Control Tollboxserial类及instrcallback()回调函数,实现基于事件驱动实时中断通信。使开发人员可以充分利用Matlab工具箱中现有函数,方便地实现串行通信、数据分析处理和图形显示,大大简化系统上位机软件编程工作量。

    1. matlab串口GUI实现
      参考:http://blog.sina.com.cn/s/blog_4b94ff130100e7wt.html
      http://blog.sina.com.cn/s/blog_62de76a90100fhbz.html
    展开全文
  • MATLAB串口通信MATLAB本身是支持Serial Port Devices,即串口设备。通过自带的一些函数可以操作串口(读取、写入等)官方英文教程然而在实际使用中,我的和官方给出的例子有一些不同。下面给出一个完整的串口读取的...

    MATLAB串口通信

    MATLAB本身是支持Serial Port Devices,即串口设备。通过自带的一些函数可以操作串口(读取、写入等)

    官方英文教程

    然而在实际使用中,我的和官方给出的例子有一些不同。

    下面给出一个完整的串口读取的例子:

    %新建串口对象

    s1=serial('COM15','BaudRate',9600);

    %尝试代开串口

    try

    fopen(s1); %打开串口对象

    catch err

    fclose(instrfind); %关闭被占用的串口

    error('请确认选择了正确的串口'); %输出错误提示

    end

    a=fscanf(s1,'%d'); %读取数据

    fclose(s1); %关闭串口

    动态绘图

    要实现读取一个数据,然后实时更新图像。而不是已知所有点坐标再进行绘图。

    动态曲线

    h = animatedline; %创建空白动态曲线

    axis([0 40 5 30]) %设置坐标系范围

    x = linspace(0,40,800);

    xlabel('时间');

    ylabel('距离');

    for k = 1:length(x)

    y = (fscanf(arduino,'%d')/100.0);

    addpoints(h,x(k),y);

    drawnow

    end

    可以实现从串口实时读取数据并进行显示。最终效果类似心电图。

    动态点坐标

    这个挺头疼的。因为我不需要两点之间连线,而是类似随机的散点。

    最终用clf的命令解决了问题。代码如下

    n = 500;

    for i=1:n

    clf; %清空

    a = (fscanf(s1,'%d')/100.0);

    b = (fscanf(s2,'%d')/100.0);

    plot(px,py,'or','MarkerSize',5,'MarkerFaceColor','r');

    axis([0 40 0 40]);

    drawnow;

    end

    还有其他动态绘图的方法,比如comet()函数、hold on等用法。可以自行百度。但我之所以不采用这些方法的原因是因为它们的坐标系是会变化的,不固定。

    MATLAB初学者,若有不足,请指正。

    展开全文
  • TI C6678 DSP与PC Matlab 串口通信研究

    千次阅读 2015-03-15 18:25:51
    该文档用以记录并说明DSP开发板TMDSEVM6678LE与PC机通信的内容,要达到的目的在于使DSP开发板能与PC中的Matlab对象实时交换数据,从而实现DSP里控制算法对Matlab里的对象模型的仿真控制。...DSP端的串口通信函数

    该文档用以记录并说明DSP开发板TMDSEVM6678LE与PC机通信的内容,要达到的目的在于使DSP开发板能与PC中的Matlab对象实时交换数据,从而实现DSP里控制算法对Matlab里的对象模型的仿真控制。

    • 实现C6678 DSP 与Matlab间的串口通信

    目录


    1 数据在PC与DSP内的存储形式

    浮点数的存储 IEEE 754

    浮点数的存储一般依据IEEE二进制浮点数算术标准(IEEE 754)进行存储,如图1所示,即最高位为符号位,中间为指数位,低位为尾数位。

    图1

    以32位单精度浮点数为例,指数域为8个bit,即能表示的指数范围为 -127 ~ 128。尾数域有23个bit,同时由于隐藏位的存在,尾数域的精度为24个bit。
    按照IEEE 754的格式,浮点数12.5的表示形式即为0100 0001 0100 1000 0000 0000 0000 0000
    关于浮点数存储的详细讨论,可以参看:
    浮点数在计算机中存储方式
    Wiki

    小端模式与大端模式

    在几乎所有的机器上,多字节对象都被存储为连续的字节序列。关于字节序列的排列方式,有小端序和大端序两种模式。小端序就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。大端序就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
    在一般小端序的PC机内,上面讨论的浮点数12.5的存储方式即为:

    内存地址 小端序存储内容
    0x4001 0000 0000
    0x4002 0000 0000
    0x4003 0100 1000
    0x4004 0100 0001

    在Matlab内,令f = 12.5,用f = single(f)将f从double型转换为single型,然后用typecast(f, ’uint8’)可以得到内存中的存储的内容,即[0 0 72 65],即从地址低位向高位读取转化为无符号整形。
    DSP开发板可调整为小端模式或大端模式,当调为小端模式时,数据在内存中的存储形式如上表。
    关于小端和大端的更多讨论可参见:
    详解大端模式和小端模式
    字节序

    2 串口通信基本原理

    串口一般用来在PC和其他设备之间传输ASCII码,按位(bit)发送和接收字节。
    在通信时需要设置的参数包括:
    波特率:为保证速度,DSP与PC间的波特率一般设为115200
    校验:无 数据位:8 停止位:1

    3 DSP端的串口通信函数与调用

    在PDK6678的Post工程里,TI提供了两个用于串口读写的函数,分别是post_write_uart()和post_read_uart()。
    其中,post_write_uart()可以将任意长度的一个字符串写到串口端口中去,post_read_uart()可以把任意长度的字符串从串口端口读出。

    int post_write_uart(char*  msg)
    {
        uint32_t i;
        uint32_t msg_len = strlen(msg);
        /* Write the message to the UART */
        for (i = 0; i < msg_len; i++)
        {
            if (platform_uart_write(msg[i]) != Platform_EOK)
            {
                return -1;
            }
        }
        return 0;
    }
    
    int post_read_uart(char * msg, uint32_t delay)
    {
        uint32_t i;
        uint32_t msg_len = strlen(msg);
        for(i=0;i<msg_len;i++)
        {
            if(platform_uart_read(&(msg[i]),delay) != Platform_EOK)
            {
                return -1;
            }
        }
        return 0;
    }
    

    因为在DSP内部主要通过单精度浮点数进行计算,而串口只能按字节传输字符串。因此在DSP中要在串口写浮点数时要先将浮点数转换成字符串格式,然后将四个字节的字符串调用函数进行传送;在串口读取浮点数时要一次读入四个字节的字符串,在转成浮点数的格式。

    浮点数转成字符串的过程为:

    char write_char[sizeof(float)];
    memcpy(write_char,&write_float,sizeof(float));

    字符串转成浮点数的过程为:

    float read_float;
    memcpy(read_float,&read_char,sizeof(float));

    因为DSP内的数据也是小端模式存储的,因此从PC端发来的四个字节可以直接转成float型。

    在调用读写串口的函数前,要先加入以下语句

       // 开发板初始化
       platform_init(&init_flags, &init_config);
       // 串口初始化
       platform_uart_init();
       // 设定波特率
       platform_uart_set_baudrate(115200);
    

    4 Matlab端的串口通信函数与调用

    关于串口通信,Matlab内置了如下函数:

    s=serial('COM5');            % 创建串口对象s,串口端号COM5
    set(s,'BaudRate',115200);    % 设定串口s的波特率
    set(s,'Timeout',10);         % 设定串口s失效时间
    fopen(s);                    % 打开串口s
    fwrite(s, buffer, 'uint32'); % 将buffer里的数据以'uint32'的格式写入串口s
    buffer=uint32(fread(s,12,'uint32'));  
    % 以'uint32'的格式从串口s读出12个数据,并强制转化成'uint32'格式写入buffer
    % 其中的12是指12个32位的数据,而不是12个字节
    

    因为Matlab里的数值格式默认为64bit的双精度浮点型,因此在串口传送前要进行格式转换。以浮点数12.5为例,串口传送前的转换过程如下:

    转换形式 Matlab命令 Matlab结果 内存内容
    0x4001 0x4002 0x4003 0x4004
    双精度到单精度 f = single(12.5); f = 12.5000 00000000 00000000 01001000 01000001
    强制转化为uint32格式 f_uint32=typecast(f,’uint32’); f_uint32= 1095237632 00000000 00000000 01001000 01000001

    同样的,对于从串口接收到的数据,也要用typecast(f_read, ’single’)进行格式转换。

    5 主从通信模式

    在通信过程中,DSP作主机,对串口发出读或写的指令,当Matlab收到相应的指令后,将准备好的数据写入串口中,或从串口中读出。

    Matlab端的通信程序流程为: DSP端的通信流程为:
    这里写图片描述 这里写图片描述

    参数说明:
    Read指令:0xFF(1byte)
    Write指令:0xF0(1byte)
    count_read:DSP读校验。每个读周期加1,初始值为1.
    count_write:DSP写校验。每个写周期加1,初始值为1.

    根据以上流程图撰写Matlab端与DSP端的程序,并通过实验进行测试。
    (上面的方法我自己做过几个测试,都没问题,测试内容有点繁琐,就不放上来了,有兴趣了解的再联系我。)

    展开全文
  • MATLAB串口通信与实时数据处理

    万次阅读 2018-10-11 09:19:48
    % 没有写GUI的程序,若用VC或.NET写串口通讯的界面程序,需要考虑到多线程任务的处理,比较复杂,因为MATLAB有中断响应事件instrcallback,大大简化了程序的编写; % 设置串口号,字符串形式 strSerialPortNum = ...
  • 单片机与Matlab串口通信# t& Z+ u# ^2 r! K" F5 x' d( l; i: p4 S; n2 f3 a7 ~! A6 bMatlab提供了对串口进行打开、关闭、以及串口参数设置等操作的一系列函数。利用这些函数可以选择串口号、 设置串口通信参数...
  • 以上两个函数设置为当串口检测到输入缓存中达到了3个字符的数据时,则触发串口中断。② 串口中断处理函数串口中断处理函数可以根据用户需要自行定义。如串口读中断处理函数可以这样定义:obj....
  • 1、要实现串口通信,第一步必须要创建一个串口对象,MATLAB中提供了serial函数来创建一个串口对象。具体用法为: object = serial('port'......);%其中object为串口的一个句柄 串口中的参数有很多例如:parity 校验...
  • 2 串口数据发送与接收功能实现2.1 建立串口通信流程的基本步骤Matlab提供了对串口进行打开、关闭、以及串口参数设置等操作的一系列函数。利用这些函数可以选择串口号、设置串口通信参数(波特率、数据位、停止位、...
  • Matlab与单片机的串口通信-matlab

    万次阅读 多人点赞 2016-12-26 09:57:24
    利用这些函数可以选择串口号、 设置串口通信参数( 波特率、 数据位、 停止位、 校验位等)、进行中断控制、流控制。从建立串口通信到结束串口通信的完整流程包括以下几个步骤: 1、创建串口对象,实现该功能的函数为:...
  • 建立串口通信流程的基本步骤 串口中断设置及中断处理函数 要实现自动收发数据, 还需要定义串口中断处理函数以及触发串口中断的方式。定义串口中断处理函数也就是定义串口数据接收或者发送函数。定义触发串口中断的...
  • matlab串口接收数据学习【1】与STM32通信 虽然可以把所有算法代码集成到STM32中运行,但最终还是希望能够获得运算结果和中间过程的一些数据集,当然日后也希望能够在STM32于matlab的通信中实现更多的交互功能以达到...
  • 获取数据位个数 data_bits = 5 + get(handles.data_bits, '... %% 创建串口......MATLAB串口相关函数_信息与通信_工程科技_专业资料。选填,简要介绍文档的主...matlab 串口通信基础讲义 ①支持基于串行接口(RS-23...
  • Matlab串口编程

    千次阅读 2017-08-31 20:29:25
    MATLAB串口通信例子 (一) 直接读取 首先,我们来试试编写一个.m程序,直接读取串口数据。更多技术细节在程序中的注释中说明。 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 函数功能: 串口接收...
  • 本人因项目需求,需要开发这个串口通信上位机界面,用于实时绘制串口发送过来的数据。本人之前基本没使用过MATLAB,也就知道个zeros(100)这种在命令行窗口中输入的函数。至于MATLAB能开发图形界面程序,我也是在接到...
  • matlab与stm32之间利用串口通信记录

    万次阅读 多人点赞 2017-12-10 23:35:43
    stm32与matlab串口通信 涉及到的函数serial,fopen,fclose, instrfindall,instrhwinfo, fprintf,fscanf,fwrite,fread,isempty
  • matlab串口采集数据

    2018-09-03 18:38:46
    matlab串口通信 转自http://blog.sina.com.cn/s/blog_6163bdeb0102e8qc.html 下面做了个matlab控制串口的尝试,下面是几个函数接口 % 打开串口 function scom = OpenSerial(sname, HReadFcn) scom = ser...
  • Matlab串口接收绘制曲线

    千次阅读 2020-02-18 22:38:03
    作者:岚膺麒钿 日期:2020.2.18 咨询QQ:2498317094(加QQ时要注明是干什么的) 关于Matlab,很多人只知道它是一个强大的...这里要用到的知识有很多,例如:matlab的GUI编程、定时器,串口通信、回调函数Matlab的...
  • 详细叙述了在 MATLAB 环境下使用其自带的控制工具箱中的 串口事件回调函数,实时接收下位机输出......(完整版)MATLAB串口通信设计源码_信息与通信_工程科技_专业资料。func...基于 MATLAB 串口通信的数据采集系统的...
  • 我仿照罗飞华老师的串口通信助手自己做了个简易的串口通信助手,作为单片机的上位机来用,可是显示界面的edit控件只能显示三行字符串,其他的无法实时显示。我一直以为我模仿的有问题,可奇怪的是,我用罗老师的串口...
  • 本来的代码是在GUI的坐标轴里面进行图像的绘制,后来稍微改了代码,新建一个figure,...目前的数据只是整数,在51里面,将整数用sprintf函数弄成字符样式,然后发送到MATLAB中,发送的字符后,再发送一个结束符号h,...
  •  与上一篇的方法不同,这一次的方法是Matlab利用串口发送函数给Arduino发送一个字符,一旦Arduino接收到字符之后,就执行对应的任务。 2、Arduino部分的代码 int pin = 8; //LED的管脚 void setup() { pinMode...
  • 1、调用函数 instrfindall 2、控制显示精度 MATLAB控制显示精度 3、
  • 串口通信设置

    2017-02-06 10:36:57
    串口通信,一般是指RS232、RS422之间的通信。matlab中有专门的serial函数来创建串口对象。设串口ID号为COM1,则创建方法为: >>scom = serial('com1'); 复制代码 创建完串口对象后,一般需要设置串口...
  • MATLAB实现串口通讯的详细步骤

    万次阅读 2019-03-29 17:16:38
    1、要实现串口通信,第一步必须要创建一个串口对象,MATLAB中提供了serial函数来创建一个串口对象。具体用法为: object = serial('port'......);%其中object为串口的一个句柄 串口中的参数有很多例如:parity ...
  • visual C++_Turbo C串口通信编程实践

    热门讨论 2010-07-30 09:14:24
    4.3 Windows API串行通信函数 4.4 Win32 API串口通信编程的一般流程和特殊实例 4.4.1 Win32 API串口通信编程的一般流程 4.4.2 用查询方式读串口 4.4.3同步I/O读写数据 4.4.4 关于流控制的设置问题 4.5 ...

空空如也

空空如也

1 2 3 4
收藏数 67
精华内容 26
关键字:

matlab串口通信函数

matlab 订阅