如何在Arduino上获取串口传输的字节?

3
我有以下的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);,我会像之前一样得到奇怪的输出结果。


您输入了8个字符并得到了8个结果。最后一个字符不同,是1而不是0,最后一个结果也不同,比之前高了一个……请搜索“ASCII表”。 - Martin James
啊,我现在明白了。所以当我用Serial.println(00000001,DEC)替换那一行时,它将其视为一个字节,而串行监视器将每个数字视为整数? - coolblue2000
我该如何在串行监视器中模拟串行字节流输入呢? - coolblue2000
3个回答

5
48和49是“0”和“1”的十进制表示。它在循环中调用Serial.println,因此打印了8行。
你的最终目标是什么?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);
}

我的目标是输入一个二进制字节,然后将其作为整数打印出来。 - coolblue2000
另外,如果我使用代码 Serial.println(00000001,DEC);,为什么就不会出现多行? - coolblue2000
将00000001的串行字节读入整数,不会将整数设置为1吗? - coolblue2000
如果您使用相同的循环,它仍应打印多行。将一个串行字节00000001读入整数会将其设置为1,但您发送的不是0000001,而是'0'和'1'字符。 - gregbeaty
我添加了一个示例,假设您首先发送MSB。 - gregbeaty

2
您可以通过更改b = Serial.read() - '0'来解决此问题。这是因为Arduino使用的是十进制代码,而不是字符。以下是转换表:http://www.asciitable.com/
希望能对您有所帮助。

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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接