在Matlab中读取原始串行数据

时间:2014-07-24 18:01:52

标签: matlab callback serial-port

我试图通过串口读取一些原始的遥测数据。每封邮件都以\r\n终止,有4种邮件。

我设置了这样的端口:

if exist('s')
    fclose(s);
    delete(s);
    clear s;
end

s = serial('/dev/ttyS99');
s.BaudRate = 57600;
s.BytesAvailableFcnMode = 'terminator';
s.Terminator = 'CR/LF';
s.DataBits = 8;
s.Parity = 'none';
s.StopBits = 1;

s.BytesAvailableFcn = @serial_callback;
s.OutputEmptyFcn = @serial_callback;

fopen(s);

对于calback,我写了一个简单的函数

function serial_callback(obj, event)
if (obj.BytesAvailable > 0)
    [serial_out, count] = fscanf(obj);
    disp(count)
    end

end
end

使用fscanf,我得到随机消息长度。例如,我正在搜索长度为42的消息,它只检索长度接近该值的消息(40,43,46 ......)。

我使用未指定大小的fread,我总是得到一个完整的512字节缓冲区。如果我使用freadget(obj, 'BytesAvailable)中指定尺寸,则会以fscanf的尺寸退化,即完全随机。

所以,我做错了什么,matlab不适合解析串口数据......?

P.S。我得到的是每秒20~40字节的40条消息。

1 个答案:

答案 0 :(得分:0)

  1. 每次收到\r\n时,使用BytesAvailableFcnMode进行配置,调用回调函数。只有在缓冲区完全接收到一行时才应调用fscanf
  2. 使用fgetsfgetl从文件中读取一行。这将保留缓冲区中第一个\r\n之后的所有内容。我没有串口或Tek,所以我无法验证这是否适用于串口。
  3. 可能你需要一个while循环来读取缓冲区中的所有行。我再也不确定serial如何回调,但是在调用回调后没有新来的东西时,它不可能连续触发回调函数。