【发布时间】:2016-09-03 13:50:14
【问题描述】:
我正在尝试从类似 Arduino 的平台获取数据流到 Matlab。 我想让 matlab 读取 15 字节的数据包,解析它们然后读取下一个块。
目前我有一个问题,matlab 在缓冲区满之前不会停止读取。
我在 Matlab 端的设置:
s=serial('COM25','BaudRate',115200, 'Terminator', 'LF')
fopen(s)
data=fscanf(s)
在硬件方面:
usbMsg[0] = 0xA0;
usbMsg[1] = _packetCounter;
// ch1
usbMsg[2] = in[3];
usbMsg[3] = in[4];
usbMsg[4] = in[5];
// ch2
usbMsg[5] = in[6];
usbMsg[6] = in[7];
usbMsg[7] = in[8];
// ch3
usbMsg[8] = in[9];
usbMsg[9] = in[10];
usbMsg[10] = in[11];
// ch4
usbMsg[11] = in[12];
usbMsg[12] = in[13];
usbMsg[13] = in[14];
usbMsg[14] = '\n'; // LF
SerialUSB.write(usbMsg, 15);
“usbMsg”和“in”是字节数组。
fscanf() 命令不只是返回一条消息,而是继续读取。显然它不识别终止符。
我尝试了不同的终结符:'LF/CR' 'CR' 'LF' 和它们的 ASCII 等价物 没有任何成功。
谁能看出问题出在哪里?
提前致谢!
编辑:
我还有一个关于缓冲区的后续问题。 如果我将串行端口(matlab 中的串行对象)的缓冲区大小减少到仅 15 个字节并继续读取,这会导致数据丢失吗?
我不确定 USB 接口是否有缓冲区以及它有多大。
【问题讨论】:
-
当您设置终止符时,它仅适用于附加到您传出消息的终止符。
fscanf()将始终拉取串行连接传入缓冲区的全部内容。我建议在本地解析它。 -
至于解析,传入的数据大概是一个字符数组。一次将 15 个字节传递给解析器:
for i = 1:ceil(length(data)/15); if length(data) >15; toparse = data(1:15); data = data(16:end); parse(toparse); else parse(data); end; -
嘿!太好了,非常感谢。既然你说了,这似乎很明显:-)。如果您将评论重新发布为答案,我可以将问题标记为已回答。 :-)
标签: matlab arduino serial-port