【问题标题】:Matlab: fscanf() does not stop at Line FeedMatlab:fscanf() 不会在换行处停止
【发布时间】: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


【解决方案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

【讨论】:

    猜你喜欢
    • 2013-07-20
    • 2019-04-29
    • 2012-07-15
    • 2011-05-22
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 2011-08-14
    相关资源
    最近更新 更多