s930427 发表于 2016-9-1 09:08:47

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

小弟在做一個通訊,由PC接Arduino,通訊時PC會發送handshake(如圖一),
所以Arduino在handshake會接收PC的封包,但是會LOST掉3個byte(如圖二),原封包是(圖三)
怎樣才能準確的收到完整的資料?
PS(圖四)PC送出訊號時的真實時脈
圖(一)

圖(二)

圖(三)

圖(四)

void setup() {
Serial2.begin(38400, SERIAL_8E1);
Serial.begin(38400, SERIAL_8E1);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, INPUT);
pinMode(5, INPUT);
digitalWrite(2, LOW);//RX
digitalWrite(3, LOW);//TX
digitalWrite(4, LOW);//RX
digitalWrite(5, LOW);//TX
}

void loop() {
if(digitalRead(4) > 0)//handshake為高電位
{

char A;
String S = "";
int c=0, i=-1;
//delay(4);
while(Serial2.read() > 0)
{
      delay(4);
      Serial.write(Serial2.read());   //即讀即寫
      c=1;   
}
}
}

darkorigin 发表于 2016-9-1 09:33:40

正常,丢包是数据传输的正常情况。
通常和硬件链接质量有关。。。
所以高要求的通讯都会要求各种校验比如CRC、各种哈希、奇偶等等
对收到的数据要进行数据包的完整性校验,以及数据包总量的校验。

迷你强 发表于 2016-9-1 13:23:38

楼上正解

164335413 发表于 2016-9-1 14:44:15

提高波特率试试,另外去掉delay,如果数据过多,你又延时,可能会出现缓冲区满的情况。
另外,while(Serial2.read() > 0)这句用的不太好,可以用 Serial.available()。

PINKWALKMAN 发表于 2016-9-1 20:33:10

繁体字固然不好认那。不过还是看完了。
我的经验是,1、波特率不能设置的太高;2、通讯连接线路不宜超过2米;3、电源品质要好,不然容易受干扰;4、delay()延时可以加,记住上下位机通讯时,时间上尽可能同步,不能同步则上位机的通讯数据刷新频率也得是下位机的倍数;5、如想做上位机推荐用Labview。
页: [1]
查看完整版本: [求助]Arduino Mega2560 收封包時,會有遺失!