我正在做一个需要在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但总电路没有上电时,通常它工作,当总电路上电时,它永远不会工作。
答案 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'
,并且不会与期望的字符串匹配。您需要考虑协议的某些同步方法,以避免这些现象。