我正在使用MATLAB中的
serialport
函数从波特率为115200的设备读取数据。但是,MATLAB中读取的数据量远低于预期。例如,在 1 分钟内,我在 MATLAB 中收集了 27276 个字节,这相当于大约 381.6 Hz。同时,当使用串行工具(如串行终端)时,我可以收集 29702 字节,这相当于 495 Hz 左右,更接近我的预期。
有人有什么建议吗?
这是我读过的代码和函数
processData
我有%
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
实际上,我的读取串口代码只做了两件事,一是读取数据到缓冲区,并告诉另一个线程是时候处理数据了。这是我的代码,希望如果您遇到同样的问题可以帮助您。
function readSensorData(app, src, ~)
numBytes = src.NumBytesAvailable;
% tic
if numBytes > 0
newData = read(src, numBytes, 'uint8');
app.rawData = [app.rawData; newData'];
send(app.dataQueue,1)
end
end
其中
app.rawData
已在设置中初始化,代码send(app.dataQueue,1)
是告诉另一个线程处理数据。