[求助]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;
}
}
} 正常,丢包是数据传输的正常情况。
通常和硬件链接质量有关。。。
所以高要求的通讯都会要求各种校验比如CRC、各种哈希、奇偶等等
对收到的数据要进行数据包的完整性校验,以及数据包总量的校验。 楼上正解 提高波特率试试,另外去掉delay,如果数据过多,你又延时,可能会出现缓冲区满的情况。
另外,while(Serial2.read() > 0)这句用的不太好,可以用 Serial.available()。 繁体字固然不好认那。不过还是看完了。
我的经验是,1、波特率不能设置的太高;2、通讯连接线路不宜超过2米;3、电源品质要好,不然容易受干扰;4、delay()延时可以加,记住上下位机通讯时,时间上尽可能同步,不能同步则上位机的通讯数据刷新频率也得是下位机的倍数;5、如想做上位机推荐用Labview。
页:
[1]