Matlab:fscanf()不会停留在换行符

时间:2016-09-03 13:50:14

标签: matlab arduino serial-port

我正在尝试从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接口上是否有缓冲区,而且它有多大。

1 个答案:

答案 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