Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arduino 为什么MATLAB不总是从串口读取数据?_Arduino_Matlab - Fatal编程技术网

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

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'

我正在做一个项目,我需要在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,但总电路未通电时,它通常工作,而总电路通电时,它从不工作

问题很可能是同步。当缓冲区长度超过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_结果来自字符串转换,所以你可以删除它。我将编辑上面的代码。