我试图通过串口读取一些原始的遥测数据。每封邮件都以\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字节缓冲区。如果我使用fread
在get(obj, 'BytesAvailable)
中指定尺寸,则会以fscanf
的尺寸退化,即完全随机。
所以,我做错了什么,matlab不适合解析串口数据......?
P.S。我得到的是每秒20~40字节的40条消息。
答案 0 :(得分:0)
\r\n
时,使用BytesAvailableFcnMode
进行配置,调用回调函数。只有在缓冲区完全接收到一行时才应调用fscanf
。 fgets
或fgetl
从文件中读取一行。这将保留缓冲区中第一个\r\n
之后的所有内容。我没有串口或Tek,所以我无法验证这是否适用于串口。 while
循环来读取缓冲区中的所有行。我再也不确定serial
如何回调,但是在调用回调后没有新来的东西时,它不可能连续触发回调函数。