2013-04-20 76 views
3

整我希望我的Arduino通過串行通信接收一個整數。你能幫助我嗎?串行消息上的Arduino

它應該是類似以下形式:

int value = strtoint(Serial.read()); 
+0

是整型字符固定數量還是會由一個非數字被終止? – walrii 2013-04-21 07:29:00

+0

嗯...'Serial.read()'已經返回'int' ... – angelatlarge 2013-04-21 07:54:35

+0

@angelatlarge'Serial.read()'不會返回'int'但只有這樣調用代碼可以成功讀取區分和一個錯誤。在檢查它沒有返回「-1」(表示錯誤)後,正確的用法將返回值視爲一個「byte」。 – 2013-04-22 11:29:46

回答

5

有幾種方法可以從Serial讀一個整數,在很大程度上取決於如何發送時的數據進行編碼。 Serial.read()只能用於讀取單個字節,從而需要被髮送的數據能夠從這些字節重建。

下面的代碼可能會爲你工作。它假定串行連接已被配置爲9600波特,該數據被髮送作爲ASCII文本,並且每個整數分隔換行符(\n):

// 12 is the maximum length of a decimal representation of a 32-bit integer, 
// including space for a leading minus sign and terminating null byte 
byte intBuffer[12]; 
String intData = ""; 
int delimiter = (int) '\n'; 

void setup() { 
    Serial.begin(9600); 
} 

void loop() { 
    while (Serial.available()) { 
     int ch = Serial.read(); 
     if (ch == -1) { 
      // Handle error 
     } 
     else if (ch == delimiter) { 
      break; 
     } 
     else { 
      intData += (char) ch; 
     } 
    } 

    // Copy read data into a char array for use by atoi 
    // Include room for the null terminator 
    int intLength = intData.length() + 1; 
    intData.toCharArray(intBuffer, intLength); 

    // Reinitialize intData for use next time around the loop 
    intData = ""; 

    // Convert ASCII-encoded integer to an int 
    int i = atoi(intBuffer); 
} 
+1

我不得不改變字節intBuffer [12]; char charBuffer [12];它編譯 – fersarr 2014-04-27 19:44:40

5

您可以使用Serial.parseInt()功能,在這裏看到:http://arduino.cc/en/Reference/ParseInt

+0

不知道什麼上述方法的好處是,但這完全爲我工作。 – 2016-01-26 19:22:20