向STM32下位机发送采集命令,应该返回8185个字节的数据;使用MATLAB串口发现每次只能读取几十个乱七八糟的数据,而使用串口助手软件可以收到完整的正确数据。
经过查找相关资料,确定了一下几个关键点:
1.数据量太大的话,串口等待时间要手动设置长一些,单位是秒;
2.MATLAB串口缓冲区大小是512,如果数据量太大需要手动更改大小。
s.Timeout = 10;%等待时间,读取设定字节数或到达等待时间停止接收
s.InputBufferSize = 9600;%缓冲区,默认为512
这两个条件任意一个达到后串口就会停止接收。
3.MATLAB默认设置使用了232的DTR、RTS这些管脚,我的电路恰好使用了这些管脚,所以收不到完整正确的数据,参考这两篇帖子。
ALIENTEK MiniSTM32 通过串口转usb和PC机matlab通信的问题-OpenEdv-开源电子网
MATLAB串口通信使STM32出现复位情况分析_matlab串口 dtr rts-CSDN博客
s.DataTerminalReady='on'; %保留线路信号DTR的状态
s.RequestToSend='off'; %保存线路信号RTS状态
加上上面这两行就可以了。
以下是完整程序,欢迎大家一起讨论。
clc;clear all;close all;
% 创建串口对象
s = serial('COM19', 'BaudRate', 115200, 'Terminator', 'LF');
s.InputBufferSize = 9600;%缓冲区,默认为512
s.DataTerminalReady='on'; %保留线路信号DTR的状态
s.RequestToSend='off'; %保存线路信号RTS状态
s.Timeout = 10;%等待时间,读取设定字节数或到达等待时间停止接收
% 打开串口
fopen(s);
% 发送命令
fwrite(s, [0x55 0xAA]);
% 读取数据
dataBytes = fread(s,8185,"uint8");%8185是要读取的字节数
% 关闭串口
fclose(s);
% 删除串口对象
delete(s);
% 清除变量
clear s;
%接收到的数据
rece_data=dec2hex(dataBytes)