警告:读取失败:格式

时间:2016-02-27 15:13:37

标签: matlab serial-port

我在从串口读取数据时遇到问题。

大部分时间,代码都有效,我能够成功读取zy的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

1 个答案:

答案 0 :(得分:0)

你的问题是时机是对的。该错误消息表明串行端口没有收到创建具有您超时之前指定格式的值所需的字节数。对于简单的示例,您所使用的代码工作正常,但正如您所发现的那样,它并不健壮。

在开始之前你必须先了解两件事:

  1. 您的串行设备是否使用线路在&#34; line&#34;中发送数据 终结者角色,还是没有?
  2. 您期望多少字节 每次从串口读取数据时读取?
  3. 然后有两种方法:

    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)已收到一定数量的字节
    • 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;了解更多信息。