为什么MATLAB不总是从串口读取?

时间:2016-05-27 14:36:15

标签: arduino matlab

我正在做一个需要在MATLAB和Arduino之间读写串行数据的项目。但MATLAB并不总能成功读取数据。我设置波特率为9600,我的串口设置如下:

 delete(instrfind({'port'},{comPort})); %%delete if COM4 is setup for any ther usesr
 obj=serial(comPort);
 set(obj,'DataBits',8);
 set(obj,'StopBits',1);
 set(obj,'BaudRate',9600);
 set(obj,'Parity','none');
 set(obj,'InputBufferSize', 1024);

MATLAB完美地发送数据,Arduino也完美地读取数据。但是当我想等待从arduino读取数据到MATLAB时会出现问题。 Arduino通过以下声明发送数据:

 Serial.println("azyb");
 Serial.flush();
  if (Serial.available()>0)  // to clear the buffer
       Serial.read();`

MATLAB中的代码语句是:

 while(1)
    Arduino.ReadAsyncMode = 'continuous';
  %  readasync(Arduino);
    buf=Arduino.BytesAvailable;
    if buf>0
       bufData=bufData+fgets(Arduino);
       bufFlag=strfind(bufData,'azyb');
       if isempty(bufFlag)==0   %%means 'azyb' is found in buffer
           flushoutput(Arduino);
           break;
       end
    end
end

我不确定,但很可能我在这段代码中遗漏了一些东西。我能做错什么?

仅供参考:有趣的是,这有时会起作用,但大部分时间都不起作用。特别是当我们只使用Arduino但总电路没有上电时,通常它工作,当总电路上电时,它永远不会工作。

2 个答案:

答案 0 :(得分:1)

下面是我在循环中调用以处理数据的函数。关键部分是在超时的情况下处理缓冲区下溢。您可以通过超时增加此时间。我的经验是MATLAB是串行通信的神奇之处。

function result=ser_read(serial_handle)
timeout = 1000;
for i=1:timeout
   if(serial_handle.BytesAvailable~=0)
   break;
   end
end

if(serial_handle.BytesAvailable~=0)
result = fread(serial_handle,serial_handle.BytesAvailable,'uint8');
else
   fprintf('error, attempted read with no bytes available.');
   result=0;
   return;
end

end

答案 1 :(得分:0)

问题是最有可能同步。你告诉Matlab一旦它的长度超过3就读取缓冲区。但是,如果Arduino发送另一个4,那么前一次传输中是否还有一个字符(比如'b')怎么办?缓冲区中的第一个字符将是'bazy',并且不会与期望的字符串匹配。您需要考虑协议的某些同步方法,以避免这些现象。