我在从串口读取数据时遇到问题。
大部分时间,代码都有效,我能够成功读取z
和y
的1000个数据点。
有时,没有从串口读取数据,有时只从串口读取40个数据点而不是预期的1000个。执行读取时会收到此警告。
警告:读取失败:格式匹配失败。下标分配维度不匹配。
此警告意味着什么,如何更改以下代码以防止它。
clk
clear all
delete(instrfindall);
b = serial('COM2','BaudRate',9600);
fopen(b);
k = 1;
n = 0;
while(n < 1000)
z(k) = fscanf(b, '%d');
y(k) = fscanf(b, '%d');
n = n + 1;
k = k + 1;
end
答案 0 :(得分:0)
你的问题是时机是对的。该错误消息表明串行端口没有收到创建具有您超时之前指定格式的值所需的字节数。对于简单的示例,您所使用的代码工作正常,但正如您所发现的那样,它并不健壮。
在开始之前你必须先了解两件事:
然后有两种方法:
A)程序等待(更容易,更不健壮):在代码中添加一个语句,等待直到收到一定数量的字节,然后读取它们。
numBytes = 10; % read this many bytes when ready
% make sure serial object input buffer is large enough
serialport = serial('COM100','InputBufferSize',numbytes*10);
fopen(serialport);
while 1
ba = serialport.BytesAvailable;
if ba > numBytes
mydata = fread(serialport, numBytes);
% do whatever with mydata
end
drawnow;
end
fclose(serialport);
B)对象回调(更高级/更复杂,可能更强大):定义了一个回调函数,只要满足某个条件就会执行。回调函数处理来自串行设备的数据。执行条件是:
以下示例使用条件a)。它需要两个函数,一个用于主程序,另一个用于回调。
function useserialdata
% this function is your main program
numBytes = 10; % read this many bytes when ready
% make sure serial object input buffer is large enough
serialport = serial('COM100','InputBufferSize',numbytes*10);
% assign the callback function to the serial port object
serialport.BytesAvailableFcnMode = 'byte';
serialport.BytesAvailableFcnCount = numBytes;
serialport.BytesAvailableFcn = {@getmydata,numBytes};
serialport.UserData.isnew = 0;
fopen(serialport);
while 1
if serialport.UserData.isnew > 0
newdata=ar.UserData.newdata; % get the data from the serial port
serialport.UserData.isnew=0; % indicate that data has been read
% use newdata for whatever
end
end
fclose(serialport);
function getmydata(obj,event,numBytes)
% this function is called when bytes are ready at the serial port
mydata = fread(obj, numBytes);
% return the data for plotting/processing
if obj.UserData.isnew==0
obj.UserData.isnew=1; % indicate that we have new data
obj.UserData.newdata = mydata;
else
obj.UserData.newdata=[obj.UserData.newdata; mydata];
end
显然这些都是玩具示例,根据串行设备的工作原理,您还需要考虑其他许多细节,如超时,错误处理,程序响应等。请参阅matlab帮助文件,了解&#34;串行端口对象属性&#34;了解更多信息。