笔者重新更新了本片文章,解决Matlab APP中串口通讯的问题。
最近几个月,DIY了块板子,选用STM32H743做为,该板子与上位机(电脑)的通讯方式有三种:①串口(115200波特率) ②USB虚拟串口(USB 2.0通讯) ③网口(100Mbis全双工)。
由于这块板子是用来学术研究的,数据需要在MATLAB中分析。因此需要实现MATLAB与STM32之间的通讯。
本文主要介绍MATLAB与STM32串口通讯的实现过程,本人才疏学浅,如有错误,还请指正,废话不多说,直接上本人的移植记录。
一、 MATLAB App设计
首先打开MATLAB软件,在命令行窗口输入“appdesigner” 打开MATLAB App,该界面还是很友好的,如下图所示,用“文本区域”、“下拉框”、“按钮”组件简单搭建了一个界面。
网上有不少关于MATLAB与单片机的串口通讯介绍资料,讲的也很详细。MATLAB :【11】一文带你读懂serialport串口收发原理与实现_Alex-YiWang的博客-CSDN博客https://blog.csdn.net/Alex497259/article/details/125922427
调试时出现一个很奇怪的Bug,在 MATLAB App 中,不管是用 serial 还是 serialport 函数,串口始终跳不进回调函数,同样的代码在.m文件却可以正常运行。本人能力有限,哪位大佬知道原因还请告知。
不断调试,最终选择了用 serial 函数加上轮询实现与单片机的交互,所设计的串口函数代码如下:
properties (Access = public)
Comm_Obj % 串口结构体
end
methods (Access = private)
%=========================串口初始化函数==========================
function USART_InitSerial(app, ~)
port = app.Comm_Device_DropDown.Value; % 获取串口号
baudrate = 115200; % 获取波特率(使用VCP该值无需设 置)
% -- 查找并关闭占用串口 --
serialObjects = instrfind('Port', port);
if ~isempty(serialObjects)
fclose(serialObjects);
end
% -- 建立串口连接 --
app.Comm_Obj = serial(port, 'BaudRate', baudrate, "DataBits", 8, 'StopBits',1,'Parity','none'); % 创建串口对象
set(app.Comm_Obj, 'InputBufferSize', 2048); % 设置接收缓存大小
set(app.Comm_Obj,'BytesAvailableFcnMode','terminator'); % 接收到换行符时进入接收函数
set(app.Comm_Obj,'BytesAvailableFcn',@app.readCommData); % 指定回调函数
set(app.Comm_Obj, 'Terminator', "CR/LF"); % 设置回车符(0D 0A)作为接收数据的终止符
fopen(app.Comm_Obj); % 打开连接
end
%======================串口接收回调函数=======================
function readCommData(app, src, event)
data = fscanf(app.Comm_Obj); % 获取接收到的数据
disp(data); % 打印串口信息
end
二、单片机程序设计
单片机上的串口按正常流程调用串口初始化函数,和发送函数。
注意:由于Matlab APP中是接收到回车符(0D 0A)时跳入接收回调函数。因此单片机发送的串口数据的结尾要加上“\r\n”做为换行符。
三、程序运行效果
板子连接上电脑,选择好串口和波特率,点击连接,串口成功接收到了板子发送来的信息。