Arduino 为什么MATLAB不总是从串口读取数据?
我正在做一个项目,我需要在MATLAB和Arduino之间读写串行数据。但是MATLAB并不总是能够成功读取数据。我设置波特率9600,串行设置如下:Arduino 为什么MATLAB不总是从串口读取数据?,arduino,matlab,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'
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,但总电路未通电时,它通常工作,而总电路通电时,它从不工作 问题很可能是同步。当缓冲区长度超过3时,告诉Matlab读取缓冲区。但是,如果在Arduino发送另外4个字符时,上一次传输已经剩下一个字符(比如说
'b'
),该怎么办?缓冲区中的第一个字符将是'bazy'
,并且与预期的字符串不匹配。您需要为您的协议考虑一些同步方法,以避免这些现象。下面是我在循环中调用的一个函数,用于处理数据。对于您来说,关键部分是在超时情况下处理缓冲区下溢。您可以通过超时来增加此时间。我的经验是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
您希望将您的问题迁移到Arduino.SE还是StackOverflow?StackOverflow比Arduino.SE更好,因为我认为主要问题在于matlabArduino发送“azyb”,所以缓冲区应该有这个(在代码中做了一些修改)和strfind()将在字符串中找到字符串“azyb”,即使它位于开头或中间。是。但因为你一读到它的长度就达到了四,所以可能连“中间”都没有。串行通信很慢。Matlab代码很快(好吧,相对来说),我找不到任何合适的方法来做这项工作。你能提出一些建议吗?有关一些想法,请参见SE EE。什么是“s_结果”。如果last if条件为非真,则如果您没有从其他任何地方获得s_结果,则s_结果将是未定义的。你能帮我清理一下吗?@Anklon这个s_结果来自字符串转换,所以你可以删除它。我将编辑上面的代码。