2017-08-07 22 views
-5

基本上,我有一個Bluno M3的Arduino驗證碼:Arduino - 爲什麼串行數據寫錯順序?

#define MSG_LEN 2 
unsigned char pixel; 
char buff[MSG_LEN]; 

int i; 
void setup() { 
    Serial4.begin(9600); 
    pixel=0xDD; 
} 


void loop() { 
    if(Serial4.peek() == -1){ 
    while(Serial4.available() < MSG_LEN); 
    Serial4.readBytes(buff, 2); 


    if(buff[0] == 0xC8 && buff[1] == 0x00){ 
    //send image  
    Serial4.write(0xC7); //send Image ACK 
    Serial4.flush(); 
    for(i=0;i<4800;i++){ 
     Serial4.write(pixel); 
     Serial4.flush(); 
    } 
    for(i=0;i<MSG_LEN;i++){ 
     buff[i]=0xFF; 
    } 
    } 
    }else{ 
    while(Serial4.available()>0){ 
     Serial4.read(); 
    } 
    } 
} 

我使用一個USB PL2303串口適配器,Bluno M3的Arduino,CoolTerm串口監聽。

如果您選中此圖片:

image

你可以看到,在該代碼發送數據時,0xC7字節與0xDD字節(所謂的像素字節)

混合

爲什麼會發生這種情況?

+0

問題可能出在PL2303或其Windows驅動程序上,而不是您的代碼或Arduino庫。根據我的經驗,較早的多產器件存在問題,並且並不少見的假多產器件甚至更糟。 – Clifford

+0

@Clifford但這些問題不一樣 –

+0

@PeterJ:我不知道你如何假設我知道我觀察到了什麼問題。流式傳輸數據時,我看到丟失和損壞這些設備的字符。這不是超出可能性,這是同一個問題,但由於數據缺乏變化而變得更加明顯。 – Clifford

回答

0
  1. 您不分配像素變量並始終發送相同的值;
  2. 只在傳輸結束時沖洗串口。它應該有所幫助。否則是bug

做另一個測試:而不是每次發送相同的值增量。它將提供更多的診斷數據

+1

像素在'setup()'中被賦值。雖然重複發送相同的值可能沒有什麼好處,但我不確定這是否是手頭的問題 - 可能僅僅是虛擬數據來說明問題。雖然沖洗是不必要的,但它不是一個錯誤,它會破壞緩衝I/O的任何好處。如果有的話,即使緩衝存在缺陷,它也應該保證順序輸出(在廣泛使用的庫代碼中似乎不太可能) – Clifford

+0

@Clifford在代碼中顯示的行爲我看不出任何原因 - 除了庫中的錯誤。 –

+0

我同意,但這是最好的猜測或建議,而不是答案。評論可能更合適。 – Clifford

0

感謝大家指出問題可能是PL2303模塊。我進一步測試確認PL2303 USB適配器工作不正常。

當我使用相同的串行監視器,但在用於編程Bluno arduino的同一個COM端口上時,代碼運行良好。這種奇怪的行爲非常令人沮喪,但是我感謝所有向我指出正確方向的人。

相關問題