众所周知,MATLAB是以数值计算见长的科学与工程计算语言。具备简洁的语法,强大的数学函数库,丰富的数据可视化能力,并通过数以百计的工具箱向各个专业领域不断延伸。基于MATLAB的工具箱可以搭建嵌入式系统开发环境。网上已有较多的文章专门讨论这一问题。本文仅限于讨论如何在MATLAB中通过串口从STM32收发数据,特比是如何向STM32发送指令来控制单片机的行为,例如休眠、唤醒、设置RTC时间/日期/闹钟等。
在MATLAB中列出可用端口
为了便于说明,这里以App Designer中创建串口为例,串口参数设置界面如图1所示。
图1. 串口参数设置app界面示例
首先,需要用serialportlist函数列出计算机上可用的串口。示例代码如下:
%% Find the available serial ports on this computerallport = serialportlist("all");if ~isempty(allport) app.DropDown_PortNumber.Items = allport;else %At least one serial port must be available uialert(app.UIFigure,'未发现串口,请检查计算机设置。','无串口','Icon',"error");end
第一行代码获取可用串口列表并赋值给变量allport;如果allport非空,则把它赋值给名为DropDown_PortNumber的下拉列表的Items中;如果allport为空,则进行提示。如果不是app开发,程序中只需在allport中找出与单片机连接的端口即可。
创建串口对象
第二步是用serialport函数创建串口对象。示例代码如下:
spobj = serialport(app.DropDown_PortNumber.Value, ... str2double(app.DropDown_BaudRate.Value),... "DataBits",str2double(app.DropDown_DataBits.Value),... "StopBits",str2double(app.DropDown_StopBits.Value),... "Parity",app.DropDown_Parity.Value,"FlowControl","none",... "ByteOrder","little-endian","Timeout",10);setDTR(spobj, true); %Assert the Data Terminal Ready pin. The DTE asserts the DTR pin to request that the DCE connect to the communication line.configureTerminator(spobj,"CR","CR/LF"); %读-回车;写-回车换行configureCallback(spobj,"terminator",@app.readSerialData);app.SerialPort = spobj;
在MATLAB中创建串口对象总共需要8个参数,创建串口时除了端口号和波特率必须指定外,其余参数如果用默认值可以不列出。这里为了便于说明,都列了出来。serialport后的括号中的参数依次为:
- 端口号Port 字符串,如"COM3",这里直接获取界面上下拉列表中选中的值,下同;
- 波特率BaudRate 数据传输速率;
- 数据位DataBits [8]/7/6/5,默认为8;
- 停止位StopBits [1]/1.5/2,默认为1;
- 校验位Parity ["none"]/"even"/"odd";
- 流控方式FlowControl ["none"]/"hardware"/"software";
- 字节顺序ByteOrder ["little-endian"]/"big-endian";
- 超时时限Timeout 大于零的数值,默认为10;
通信前需要将DTR引脚拉高,否则接收不到数据。对应如下语句:
setDTR(spobj, true);
configureTerminator函数设置终止符,可以为"CR"(回车)、"LF"(换行)、"CR/LF"(回车换行)、或0-255间的任意整数。这相当于通信双方的一个协议。MATLAB接收数据时根据终止符来判断一行的结束,发送数据时会在最后将终止符发送出去。
configureCallback函数设置回调函数。回调函数的触发方式通过第二个参数设置:
- "teminator" 读取到终止符时,触发回调函数;
- "byte" 读取指定数量的字节时,触发回调函数。这种情况下,拟读取的字节数通过第4个参数设置;
- "off" 不触发回调。
在前两种情况下,需将回调函数的句柄作为configureCallback的最后一个参数,来关联回调函数。本例中设置的是"terminator",并且为接收和发送设置了不同的终止符。
注意事项:
- STM32属于ARM系列微处理器。The bytes are coded in memory in Little Endian format.
- 通信双方的波特率、数据位、停止位、校验位设置必须完全一致。
指令发送方法
在MATLAB中,可以通过writeline函数发送指令到单片机。指令格式需要提前约定,并在STM32的驱动程序中进行适配响应(详见后文)。例如,我们约定指令为4个字符,指令后为参数。以时间设置为例,格式为TIMEhhmmss,其中"TIME"为指令,"214910"为参数,表示21:49:10。MATLAB中的指令为:
time = '214910'; %格式hhmmss,21:49:10writeline(app.SerialPort,['TIME',time]);
writeline函数在发送完[]中的字符后,还会发送约定的writeterminator,即"CR/LF"。
后文链接:
- MATLAB与STM32串口通信 - 02 中断响应
版权声明:内容来源于互联网和用户投稿 如有侵权请联系删除