极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9998|回复: 4

[求助]Arduino Mega2560 收封包時,會有遺失!

[复制链接]
发表于 2016-9-1 09:08:47 | 显示全部楼层 |阅读模式
小弟在做一個通訊,由PC接Arduino,通訊時PC會發送handshake(如圖一),
所以Arduino在handshake會接收PC的封包,但是會LOST掉3個byte(如圖二),原封包是(圖三)
怎樣才能準確的收到完整的資料?
PS(圖四)PC送出訊號時的真實時脈
圖(一)

圖(二)

圖(三)

圖(四)

  1. void setup() {
  2.   Serial2.begin(38400, SERIAL_8E1);
  3.   Serial.begin(38400, SERIAL_8E1);
  4.   pinMode(2, OUTPUT);
  5.   pinMode(3, OUTPUT);
  6.   pinMode(4, INPUT);
  7.   pinMode(5, INPUT);
  8.   digitalWrite(2, LOW);  //RX
  9.   digitalWrite(3, LOW);  //TX
  10.   digitalWrite(4, LOW);  //RX
  11.   digitalWrite(5, LOW);  //TX
  12. }

  13. void loop() {
  14.   if(digitalRead(4) > 0)  //handshake為高電位
  15.   {
  16.   
  17.   char A;
  18.   String S = "";
  19.   int c=0, i=-1;
  20.   //delay(4);
  21.   while(Serial2.read() > 0)
  22.   {
  23.       delay(4);
  24.       Serial.write(Serial2.read());   //即讀即寫
  25.       c=1;   
  26.   }
  27.   }
  28. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2016-9-1 09:33:40 | 显示全部楼层
正常,丢包是数据传输的正常情况。
通常和硬件链接质量有关。。。
所以高要求的通讯都会要求各种校验  比如CRC、各种哈希、奇偶等等
对收到的数据要进行数据包的完整性校验,以及数据包总量的校验。
回复 支持 反对

使用道具 举报

发表于 2016-9-1 13:23:38 | 显示全部楼层
楼上正解
回复 支持 反对

使用道具 举报

发表于 2016-9-1 14:44:15 | 显示全部楼层
提高波特率试试,另外去掉delay,如果数据过多,你又延时,可能会出现缓冲区满的情况。
另外,while(Serial2.read() > 0)这句用的不太好,可以用 Serial.available()。
回复 支持 反对

使用道具 举报

发表于 2016-9-1 20:33:10 | 显示全部楼层
繁体字固然不好认那。不过还是看完了。
我的经验是,1、波特率不能设置的太高;2、通讯连接线路不宜超过2米;3、电源品质要好,不然容易受干扰;4、delay()延时可以加,记住上下位机通讯时,时间上尽可能同步,不能同步则上位机的通讯数据刷新频率也得是下位机的倍数;5、如想做上位机推荐用Labview。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-26 19:53 , Processed in 0.043296 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表