2013-01-07 91 views
3

我有以下的Arduino代碼。如何在Arduino上通過串行獲取輸入字節?

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

void loop() 
{ 
    if(Serial.available() > 0) 
    { 
     int b=Serial.read(); 
     Serial.println(b); 
    } 
} 

如果我打開串口監視器,輸入00000001我得到的輸出

48 

48 

48 

48 

48 

48 

48 

49 

OK,所以,首先,爲什麼48(最後49行),其次爲什麼這麼多線?

我期待得到'1'的簡單輸出。

如果我將行Serial.println(b);更改爲Serial.println(00000001,DEC);,我得到了我期望的(即'1')。但是,如果我將該行更改爲Serial.println(b,DEC);,則會得到與以前相同的奇怪輸出。

+0

輸入8個字符得到8個結果。最後一個字符是不同的,是1而不是0,最後的結果是不同的,是一個更高的.... Google'ASCII table'。 –

+0

啊,我想我現在明白了。所以當我用Serial.println(00000001,DEC)取代這行時,它計數爲一個字節,而串行監視器將每個數字作爲一個整數? – coolblue2000

+0

如何在串口監視器中模擬串行字節流輸入? – coolblue2000

回答

5

48和49是'0'和'1'的十進制表示形式。它打印8行是因爲你在循環中調用Serial.println。

你的最終目標究竟是什麼? Serial.read()返回字符,而不是數值:http://arduino.cc/en/Serial/read

希望這有助於!

- 例子:

if(Serial.available() > 0) 
{ 
    int num = 0; 
    for(int i=7; i>=0; i--) 
    { 
     if(Serial.read() == '1') 
      num |= (1 << i); 
    } 
    Serial.println(num); 
} 
+0

我的目標是以二進制形式輸入一個字節並將其打印爲整數 – coolblue2000

+0

此外,爲什麼如果我使用Serial.println行(00000001,DEC)時不會出現多行? – coolblue2000

+0

會將00000001的串行字節讀入一個整數而不是將整數設置爲1? – coolblue2000

0

如果我理解正確你想接收一個ASCII字符串「000001」,並將其轉換爲整數。以下未經測試的示例將需要回車來指示字符串的結尾。

#include<stdio.h> 
#include<stdlib.h> 

int x=0; 
int char_rev; 
char buf0[20]; 

while(buf0[x]!=0) { 

    char_rev = Serial.ReadData(buf0[x],1); 
    if (char_rev==1) { 
     if (buf0[x]=='/r') { 
      buf0[x]=0; 
     } 
     else {    
      x++; 
     } 
    }   
} 
x=atoi(buf0[]); 

Serial.Println(x); 
2

你可以簡單地通過改變b = Serial.read() - '0'來解決這個問題。發生這種情況是因爲arduino使用十進制代碼,而不是char。這是一個轉換表:http://www.asciitable.com/

希望我幫了忙。

相關問題