Arduino和Matlab之间的串行通信正在丢失数据

时间:2018-08-07 14:08:31

标签: matlab arduino serial-port

我现在正在尝试在Arduino和Matlab之间建立串行通信。脚本非常简单:

  1. Matlab向Arduino发送一个名为i的数字;

  2. Arduino收到此i,然后将其发送回Matlab;

重复步骤1&2 10次,即Matlab向Arduino发送1,2,...,10,然后从Arduino接收1,2,...,10。但是,Matlab仅返回3,4,...,10,而第一个i = 1和i = 2丢失了(我现在已经使inputbuffersize = 200了,仍然不正确)。

这里是Matlab的代码:

clc,clear;
s=serial('COM16','BaudRate',9600); 
s.InputBufferSize = 200;    
fopen(s);
a=10;
rx = zeros(1, a); % rx is used to store the data send back by Arduino
ry = zeros(1, a); % ry is just helping me to see what happens in Serial
for i = 1:1:a
  fwrite(s, i); % Start to write the value "i" through serial to Arduino
  pause(0.5) % if no pause, the result is worse than now
  ry(i) = s.BytesAvailable; % check how many data are there in the Buffer
  if s.BytesAvailable>0
      rx(i) = fread(s, s.BytesAvailable); % Record the data send by Arduino
  end
end
fclose(s);

还有Arduino代码:

char ibyte;
void setup()
{
  Serial.begin(9600);
}

void loop()
{
  if(Serial.available()>0)
  {
    ibyte=Serial.read();
    Serial.write(ibyte);
  }
}

我的参考链接是:http://robocv.blogspot.com/2012/01/serial-communication-between-arduino.html

2 个答案:

答案 0 :(得分:2)

link you provide清楚地指出,delay(2500);需要添加到Arduino setup()代码中,以留出时间来重新启动,在此期间设备可能“行为异常”(例如删除发送的数据) ?)。您 可能还需要暂停MATLAB代码以适应这种情况,例如,在打开串行连接后向代码中添加pause(2.5)(除非已经执行fopen步骤)等待Arduino setup()完成)。

关于您的MATLAB代码,一个问题是您的代码已设置为可以在有机会获得先前响应之前继续发送更多数据。另外,您应指定要发送的数据的精度,例如unsigned 8-bit integer'uint8'double-precision number'double'(根据情况)。< / p>

您可能想做的就是只调用fread而不先检查BytesAvailable,因为fread会阻塞,直到接收到size参数指定的所有数据为止(本例中为1)。案件)。只有在收到后,您的循环才会继续进行下一个迭代/消息:

for i = 1:1:a
  fwrite(s, i, 'double');
  rx(i) = fread(s, 1, 'double');
end

您还可以尝试仅使用uint8数据:

rx = zeros(1, a, 'uint8');
for i = 1:1:a
  fwrite(s, uint8(i), 'uint8');
  rx(i) = fread(s, 1, 'uint8');
end

答案 1 :(得分:2)

当您打开串行连接时,Arduino会重置自身,并且引导程序会等待潜在的草图上传。这会在草图实际运行之前增加一些延迟。

在打开串行连接后添加一个暂停。

fopen(s);
pause(3);

还有其他选择:

  1. 通过向PC发送一些信息,使Arduino在启动时宣布。例如,您要等到Arduino发送S

  2. 我不确定MATLAB是否可以实现此功能,但是如果禁用串行的DTR引脚,则Arduino不会自动重置。

  3. 直接与程序员一起刻录代码,因此没有引导程序在引导时等待。但这也会阻止您通过USB上传草图。

  4. A hardware solution to prevent auto reset.但这可以防止在上传草图期间进行必要的重新引导,因此您必须手动设置重置时间。

相关问题