2012-10-28 99 views
3

我有一個3字節的數組,通過串口緩存傳入字節。一旦它滿了,我想用字節來調用一個函數,它需要一個字節和一個int作爲參數。這在理論上應該不成問題,但由於某些原因,字節不能正確轉換爲int。這裏是我的代碼:在Arduino上將字節轉換爲int時數據丟失

// for serialEvent() 
uint8_t buffer[3] = {0, 0, 0}; 
uint8_t index = 0; 

void serialEvent() { 
    while (Serial.available()) { 
    if (index > 2) { 
     // buffer is full so process it 
     uint16_t argument = (uint16_t)buffer[1]; 
     argument <<= 8; 
     argument |= buffer[2]; 

     processSerial(buffer[0], argument); 

     index = 0; 
    } 

    buffer[index] = Serial.read(); 

    index++; 
    } 
} 

void processSerial(uint8_t action, uint16_t argument) { ... } 

的問題似乎是在第一位向左移,以騰出空間爲第二個行。我試圖再次通過串行端口輸出變量,並且在移位操作之後,它是0.

當我嘗試用乘法256代替位移操作時(同樣的結果)理論上)。

不快,當我分配一個靜態值,像這樣,一切工作正常:

uint16_t argument = 0x00CD; 
argument <<= 8; 

這是一個類型轉換的問題?我在這裏錯過了什麼嗎?

+0

'說法| = buffer [2];'你可能想在這裏使用buffer [0]? – wildplasser

+0

除了沒有用3個解碼字節進行真正的呼叫,直到第4個字節可用,並且在收到第3個字節之後沒有立即進行,這是有道理的,我看不到任何明顯的奇怪。 –

+0

感謝Joachim,我會重新排列這個功能。緩衝區指數是正確的。 –

回答

0

還沒有找到解決辦法,爲什麼出現這種情況,但使用這個詞()函數不正是我想要的:

uint16_t argument = word(buffer[1], buffer[2]); 
processSerial(buffer[0], argument); 

煩人,它被定義爲:

unsigned int makeWord(unsigned char h, unsigned char l) { return (h << 8) | l; } 
相關問題