如何在Arduino上通过串口保持传入的字节?

时间:2013-01-07 20:41:20

标签: serial-port 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

好的,首先是为什么48(和最后一行49),其次是为什么这么多行?

我希望获得'1'的简单输出。

如果我将行Serial.println(b);更改为Serial.println(00000001,DEC);,我会得到我期望的(即'1')。但如果我将行更改为Serial.println(b,DEC);,我会得到与以前相同的奇怪输出。

3 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:2)

您可以通过更改b = Serial.read() - '0'来解决此问题。这是因为arduino使用的是十进制代码,而不是char。这是转换表:http://www.asciitable.com/

希望我帮助过。

答案 2 :(得分: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);