我正在尝试从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接口上是否有缓冲区,而且它有多大。
答案 0 :(得分:1)
设置终结符时,它仅适用于附加到外发消息的终结符。 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