精华内容
下载资源
问答
  • Matlab串口函数

    2013-06-08 20:53:02
    Matlab串口函数函数 说明 _____________________________________________________ serial 创建一个串口对象,格式:s = serial('coml' ) fopen 打开串口对象,格式:fope n( s) fread 读取串口数据,格式: fread(s) ...
  • 回调函数的设置需要先fopen串口。 但是串口的有些参数,比如说串口读取的字节数,读取模式是byte还是终止符,需要在fopen之前设置。 回调函数的设置有不同的方法,根据参数个数不同,设置方式不同。 ...

    经验:

    1. 回调函数的设置需要先fopen串口。
    2. 但是串口的有些参数,比如说串口读取的字节数,读取模式是byte还是终止符,需要在fopen之前设置。
    3. 回调函数的设置有不同的方法,根据参数个数不同,设置方式不同。
    展开全文
  • matlab串口收发及回调函数编程

    热门讨论 2011-08-20 16:38:27
    matlab创建com对象。并采用中断方式响应回调函数,功能完整,包括创建初始化及关闭销毁。回调函数的格式,实现方法。
  • matlab 串口 代码

    2015-07-29 14:09:30
    Matlab用多线程技术实现这种异步操作,通过异步读写设置,计算机在执行读写串口函数时能立即返回不必等待串口把数据传输完毕, 当指定的数据传输结束时就触发事件,执行事件回调函数,可以在事件回调函数中编程,...
  • Matlab串口编程

    千次阅读 2017-08-31 20:29:25
    MATLAB串口通信例子 (一) 直接读取 首先,我们来试试编写一个.m程序,直接读取串口数据。更多技术细节在程序中的注释中说明。 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 函数功能: 串口接收...

    MATLAB串口通信例子

    (一)  直接读取

    首先,我们来试试编写一个.m程序,直接读取串口数据。更多技术细节在程序中的注释中说明。

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    % 函数功能: 串口接收数据程序

    % 将接收到的数据显示在命令行,每次仅读取一个字节

    % 需要用虚拟串口 VSPD 虚拟一对串口,这里虚拟连接的串口是 COM1和COM2

    % 用UartAssist(串口调试助手)设置为COM2,作为发送数据端

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    function ReadWriteSerial

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    obj1=instrfind('Type','serial','Port','COM1','Tag','');

    if isempty(obj1)

       obj1=serial('COM1');

    else

       fclose(obj1);

       obj1=obj1(1);

    end

    % 串口的一些设置

    set(obj1,'BaudRate',9600,'FlowControl','none','Timeout',0.1);

    set(obj1,'Inputbuffersize',512,'Outputbuffersize',...

       512,'parity','none','databits',8,'stopbits',1);

    fopen(obj1);

    while(1)

       if obj1.BytesAvailable

           data=fread(obj1,1);   % 按照每次读取一个字节

           string=setstr(data);  % 将ASCII码转换为字符

           string                % 显示在命令行

       end

    end

    fclose(obj1);

    delete(obj1);

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

     

    (二)  GUI界面读写串口数据

    在命令行窗口输入guide命令或者在菜单栏中File->New->GUI,探出以下界面


    然后我们选择创建一个新的GUI界面,我们创建以下控件元素,注意,有几个很重要空间的Tag属性的修改,比如打开串口为btnOpen,关闭按钮为btnClose,发送按钮Tag为btnSend,清楚按钮为btnClear,选择串口的下拉框为selectCom,波特率的下拉框为baudRate,接收数据的编辑框为editRecv,发送数据的编辑框为editSend,左边最大的那个是坐标轴,Tag为axesShow。



    编写程序如下:

     

    function varargout = SerialPort(varargin)

    % SERIALPORT M-file for SerialPort.fig

    gui_Singleton = 1;

    gui_State = struct('gui_Name',       mfilename, ...

                       'gui_Singleton',  gui_Singleton, ...

                       'gui_OpeningFcn',@SerialPort_OpeningFcn, ...

                       'gui_OutputFcn',  @SerialPort_OutputFcn, ...

                       'gui_LayoutFcn',  [] , ...

                       'gui_Callback',   []);

    if nargin && ischar(varargin{1})

       gui_State.gui_Callback = str2func(varargin{1});

    end

    if nargout

       [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});

    else

       gui_mainfcn(gui_State, varargin{:});

    end

    % End initialization code - DO NOT EDIT

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    % 在此做初始化工作

    function SerialPort_OpeningFcn(hObject,eventdata, handles, varargin)

    % 初始化数据

    global COM;

    global rate;

    COM='COM1'

    rate = 9600;

    set(handles.axesShow,'YLim',[-40,40]);  % 设置坐标轴的范围

    set(handles.axesShow,'XLim',[-40,40]);  % 设置坐标轴的范围

    set(handles.axesShow,'YGrid','on');  % 设置坐标网格显示

    set(handles.axesShow,'XGrid','on');  % 设置坐标网格显示

    set(handles.selectCom,'value', 1);

    set(handles.baudRate,'value',2);

    set(handles.btnClose,'Enable','off');

    % 画图用的数组

    global DATA; % 数据块

    global UNIT;  % 数据单元,可以由多个字节构成

    UNIT=0;

    DATA=[];

    handles.output = hObject;

    guidata(hObject, handles);

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    function varargout =SerialPort_OutputFcn(hObject, eventdata, handles)

    varargout{1} = handles.output;

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    % 选择串口的回调函数

    function selectCom_Callback(hObject,eventdata, handles)

    global COM;

    val=get(hObject,'value');

    switch val

       case 1

           COM='COM1';

       case 2

           COM='COM2';

       case 3

           COM='COM3';

       case 4

           COM='COM4';

       case 5

           COM='COM5';

       case 6

           COM='COM6';

    end

    function selectCom_CreateFcn(hObject,eventdata, handles)

    if ispc &&isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))

       set(hObject,'BackgroundColor','white');

    end

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    % 选择波特率回调函数

    % --- Executes on selection change inbaudRate.

    function baudRate_Callback(hObject,eventdata, handles)

    global rate;

    val=get(hObject,'value');

    switch val

       case 1

           rate=4800;

       case 2

           rate=9600;

       case 3

           rate=14400;

    end

     

    function baudRate_CreateFcn(hObject,eventdata, handles)

     

    if ispc &&isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))

       set(hObject,'BackgroundColor','white');

    end

     

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    % 打开串口回调函数

    function btnOpen_Callback(hObject,eventdata, handles)

    clc

    instrreset

    global s;

    global rate;

    global COM;

    global out;

    global N;

    N=50;

    out=1;

    s=serial(COM);

    set(s,'BaudRate',rate);%%%Baud初始化

    set(s,'DataBits',8);%%%设置数据长度

    set(s,'StopBits',1);%%%设置停止位长度

    set(s,'InputBufferSize',1024000);%%%设置输入缓冲区大小为1M

    set(handles.btnOpen,'Enable','off');

    set(handles.btnClose,'Enable','on');

     

    %串口事件回调设置

    % s.BytesAvailableFcnMode='terminator';

    s.BytesAvailableFcnMode='byte';

    s.BytesAvailableFcnCount=1; %输入缓冲区存在1个字节触发回调函数

    s.BytesAvailableFcn={@recvData,handles};%回调函数的指定

    fopen(s);%打开串口

     

    global count;

    count=1;

    fprintf('ceshi_dakaichuankou\n');

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    %串口接收到数据的回调函数

    function recvData(seri,e,handles)

    global DATA;

    global UNIT;

    global N;

    data=fread(seri,1);

    string=setstr(data)  % 将ASCII码转换为字符

    if string=='S'  % 停止位

       DATA=[DATA,str2double(UNIT)]; % 保存数据

       text=get(handles.editRecv,'String');

       text=strcat(text,UNIT);

       set(handles.editRecv,'string',text);

       UNIT='';

        %画图

       if length(DATA)>N

           DATA=DATA(2:N); % 放弃旧数据

       end

       plot(handles.axesShow,1:length(DATA),DATA,'-r.');

       set(handles.axesShow,'XLim',[-40,40]);

    else

       UNIT=strcat(UNIT,string);

    end

     

    %set(handles.text4,'string',x);

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    % 关闭串口的回调函数

    function btnClose_Callback(hObject,eventdata, handles)

    global s;

    fclose(s);

    delete(s);

    set(handles.pbOpenSerial,'Enable','on');

    set(handles.pbCloseSerial,'Enable','off');

    % fprintf('Close_COM');

     

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    function editSend_Callback(hObject,eventdata, handles)

    % --- Executes during object creation,after setting all properties.

    function editSend_CreateFcn(hObject,eventdata, handles)

    if ispc &&isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))

       set(hObject,'BackgroundColor','white');

    end

     

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    % 点击发送消息按钮的回调函数

    function btnSend_Callback(hObject,eventdata, handles)

    global s;

    d=get(handles.editSend,'String');

    % 发送数据

    fprintf(s,'%s',d);

     

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    function editRecv_Callback(hObject,eventdata, handles)

    % --- Executes during object creation,after setting all properties.

    function editRecv_CreateFcn(hObject,eventdata, handles)

    if ispc &&isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))

       set(hObject,'BackgroundColor','white');

    end

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    % 点击清除按钮的回调函数

    function btnClear_Callback(hObject,eventdata, handles)

    set(handles.editRecv,'string','');

    set(handles.editSend,'string','');

     

    % 画图

    function draw(handle,Array)

    plot(handle,1:length(Array),Array,'-ro');

    set(handle,'XLim',[1,50])

     

     

     

     

    展开全文
  • 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串口学习

    2019-08-24 16:12:23
    我是一个懒人,喜欢自己动的东西,梦想是做...今天要学习的就是用matlab编写串口程序了。 Firstly,I will introduce ‘serial’ to you. 函数serial语法: s = serial('port'); serial 函数需要一个与你设备...
  • matlab中内置了串口功能函数,我们在使用时只需要调用函数进行相应配置即可,我们来看串口函数。serial(S_P,'Parity','none','BaudRate',BaudRate1,'DataBits',8,'StopBits',1)这个函数用来对串口进行设置,其中S_P...
  • matlab串口采集数据

    2018-09-03 18:38:46
    matlab功能强大,串口操作异常简单,其详细参看下面两个连接吧 ... 下面做了个matlab控制串口的尝试,下面是几个函数接口 % 打开串口 function scom = OpenSerial(sname, HReadFcn) scom = ser...
  • matlab串口通讯

    2019-07-10 16:29:05
    %配置串口,serial函数 serial_config = serial(串口号, ‘BaudRate’, 4800,‘DataBits’, 8, ‘StopBits’, 1, ‘Parity’,‘None’) %波特率,数据位,停止位,奇偶校验 %串口配置信息 config_serial = ...
  • matlab 串口数据采集

    2018-05-10 20:23:57
    MATLAB的按钮以及各种控件事件响应是依靠一种叫做回调函数(Callback Function)来实现的,自动生成的M文件中已经自动做好回调函数的名称和参数了,目前代码已经完成,可以使用。
  • MATLAB串口通信MATLAB本身是支持Serial Port Devices,即串口设备。通过自带的一些函数可以操作串口(读取、写入等)官方英文教程然而在实际使用中,我的和官方给出的例子有一些不同。下面给出一个完整的串口读取的...
  • Matlab自带的函数Ports=instrhwinfo('serial')可以获取当前的串口,但是返回值是一个十分复杂的元胞数组,无法直接使用,不利于下边的编程操作。因此自己写了一个寻找当前串口函数,且可以把串口名称直接输出,...
  • 我在matlab上用串口读取stm32发送给电脑的数据,设置为缓冲区接收到32个字节就进入回调函数,但是弹出这个警告:The BytesAvailableFcn is being disabled. To enable the callback property either connect to the ...
  • matlab串口通讯问题集

    千次阅读 2016-11-06 17:39:37
    原因:通讯协议不一致,下位机连续接受0x0d、0x0a【CR/LF】时,完成一次接受【usart.c,stm32,串口中断函数】,需要配置matlab串口的terminator为CR/CF。 -CR/CF的结束符为\n\r。 小结1:matlab中fprintf函数 -...
  • Matlab串口接收绘制曲线

    千次阅读 2020-02-18 22:38:03
    作者:岚膺麒钿 日期:2020.2.18 咨询QQ:2498317094(加QQ时要注明是干什么的) 关于Matlab,很多人只知道它是一个强大的...这里要用到的知识有很多,例如:matlab的GUI编程、定时器,串口通信、回调函数Matlab的...
  • matlab串口接收数据学习【1】与STM32通信 虽然可以把所有算法代码集成到STM32中运行,但最终还是希望能够获得运算结果和中间过程的一些数据集,当然日后也希望能够在STM32于matlab的通信中实现更多的交互功能以达到...
  • 一个实用的matlab串口接收程序查询方式接收-matlab_serial_port.rar 运行方式:下载,解压,运行serialcomm函数即可 是最完整的,Matlab实用的串口程序,测试可以运行。 确认你的串口已经接好,要不然会出现...
  • MATLAB串口通讯程序

    千次阅读 2017-09-19 17:43:29
    打开串口,设置波特率,缓存区大小,设定回调函数 clear all s = serial('COM5'); s.BytesAvailableFcnMode = 'byte'; s.InputBufferSize = 10000; s.BytesAvailableFcnCount = 50; s.BaudRate = 9600; s....
  • MATLAB串口通信与实时数据处理

    万次阅读 2018-10-11 09:19:48
    % 没有写GUI的程序,若用VC或.NET写串口通讯的界面程序,需要考虑到多线程任务的处理,比较复杂,因为MATLAB有中断响应事件instrcallback,大大简化了程序的编写; % 设置串口号,字符串形式 strSerialPortNum = ...
  • Matlab使用串口通讯

    万次阅读 2017-07-17 21:17:48
    (1)Matlab 串口通讯官网资料,里面很详尽的介绍了MATLAB串口相关函数 https://cn.mathworks.com/help/instrument/serial-port-interface.html (2)MATLAB 串口操作简易说明 1.按照串口名称创造串口类 s =...
  • TI C6678 DSP与PC Matlab 串口通信研究

    千次阅读 2015-03-15 18:25:51
    该文档用以记录并说明DSP开发板TMDSEVM6678LE与PC机通信的内容,要达到的目的在于使DSP开发板能与PC中的Matlab对象实时交换数据,从而实现DSP里控制算法对Matlab里的对象模型的仿真控制。...DSP端的串口通信函数
  • matlab中内置了串口功能函数,我们在使用时只需要调用函数进行相应配置即可,我们来看串口函数。serial(S_P,'Parity','none','BaudRate',BaudRate1,'DataBits',8,'StopBits',1)这个函数用来对串口进行设置,其中S_P...
  • <p>%%%%%%%%%%%%%%%%%%%%已经建立...不知道用什么函数;想要进行下面一行的操作必须给wei2句柄 <p>%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% <p>wei2.SetPropagatorType('ePropagatorStkExternal');  </p>
  • Matlab接收串口数据

    万次阅读 2016-08-04 19:56:19
    Matlab接收串口助手发送的txt文档数据,保存为以当前时间命名的txt文档。 调试过程中主要遇到几个问题,...2.读串口函数选择fread还是fscanf的问题;  fread是读数据,fscanf是读字符,因为我是选择用另外一台电
  • simulink开发STM32串口函数

    千次阅读 2020-01-11 22:00:31
    刚开始学习利用Simulink自动生成可以在STM32单片机运行的代码,摸索的过程中遇到...配置环境:MATLAB2018b,STM32CubeMX-5.4.0,STM32MatTarget_5.4.0,KeilMDK5 单片机:STM32F103ZET6 CK_1功能:单片机发送任意...
  • 本总结意在解决如下问题:利用定时器回调函数串口回调函数在GUI指定的axes上绘图时,曲线或图片总是不显示在指定的坐标轴上,总是会弹出新的窗口显示。  利用guide来创建GUI程序时,可能大家

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 121
精华内容 48
关键字:

matlab串口函数

matlab 订阅