Matlab:fscanf() 不会在换行处停止
Matlab: fscanf() does not stop at Line Feed
我正在尝试从类似 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
我正在尝试从类似 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