2013-01-07 90 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/

希望我帮了忙。

相关问题