matlab串口接收​数据大小达不到STM​UART发送数据大小

22 visualizzazioni (ultimi 30 giorni)
Shilin
Shilin il 30 Set 2024
Commentato: Shilin il 2 Ott 2024
我是用matlab接收来自STM32串口的数据,数据的发送速度是500Hz,在串口助手上验证过没有问题,但是如果使用matlab接收就会缺少大概6s的数据,这是我的读取函数function readSensorData(app, src, ~)
% 读取数据并将数据放入队列
while src.NumBytesAvailable >= 5
% currentTime = datetime('now'); % 串口数据到达时记录时间戳
tic
frameHeader = read(src, 2, "uint8");
toc
if frameHeader(1) == 0x55 && frameHeader(2) == 0xAA
fun_data = read(src, 2, "uint8");
len = fun_data(2);
if src.NumBytesAvailable >= len + 1
if len ~= 0
dataToSend = read(src, len, "uint8");
checksum = read(src, 1, "uint8");
% 计算校验
expectedChecksum = bitcmp(mod(sum([fun_data, dataToSend]), 256), 'uint8');
if (checksum == expectedChecksum)
app.processData(dataToSend)
end
end
end
else
read(src, 1, 'uint8');
end
end
end
其中app.processData执行内容已经被我关闭,可以忽略

Risposte (1)

cui,xingxing
cui,xingxing il 30 Set 2024
有可能是MATLAB 的串口数据接收处理速度不够快,导致数据丢失,特别是在 MATLAB 的串口读取性能与 STM32 数据发送速率的匹配上,不妨尝试下面的代码:
function readSensorData(app, src, ~)
% 尽量减少read的调用次数,优化接收效率
while src.NumBytesAvailable >= 5
% 一次性读取较多的数据
availableBytes = src.NumBytesAvailable;
dataBuffer = read(src, availableBytes, "uint8");
% 处理数据
idx = 1;
while idx <= length(dataBuffer) - 5 % 确保有足够的字节用于解析
if dataBuffer(idx) == 0x55 && dataBuffer(idx+1) == 0xAA
fun_data = dataBuffer(idx+2:idx+3);
len = fun_data(2);
if idx + 4 + len <= length(dataBuffer)
dataToSend = dataBuffer(idx+4:idx+3+len);
checksum = dataBuffer(idx+4+len);
% 校验
expectedChecksum = bitcmp(mod(sum([fun_data, dataToSend]), 256), 'uint8');
if checksum == expectedChecksum
app.processData(dataToSend);
end
idx = idx + 4 + len + 1; % 更新索引,跳过已处理的帧
else
break; % 数据不足,等待下次处理
end
else
idx = idx + 1; % 如果帧头不匹配,跳过字节
end
end
end
end
  2 Commenti
cui,xingxing
cui,xingxing il 30 Set 2024
还需要检查波特率,src.BaudRate = 115200; % 与STM32的波特率相同
Shilin
Shilin il 2 Ott 2024
谢谢你的回答,
受到您的启发,我将程序逻辑从新修改了下,函数readSensorData完全用来读取数据,读完数据后将数据存在app属性中,然后通知处理函数处理。这里的处理函数是开了一个线程的。所以不会影响数据读取。
另外,值得一提的是,你的方法中并没有考虑最后一帧不齐全怎么办,也是需要做这些处理的。
总之,很感谢你的回复,给了我很大的启发

Accedi per commentare.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by