Arduino无法正确读取Serial

好吧,我用google搜索从Arduino串口获取字符串,我甚至没有运气,甚至复制和粘贴示例.

我正在尝试从Serial中获取一个字符串.这是我的代码:

void setup() {
    Serial.begin(9600);
    Serial.write("Power On");
}

void loop()
{
    while(!Serial.available());

    while (Serial.available() > 0) {
      Serial.write(Serial.read());
    }
    Serial.println();
}

而且它逐个字符地打印出来.

我也试过了

char* read(int len) {
  while (!Serial.available());
  char str[len];
  int i = 0;
  while (i < len) {
    str[i] = '\0';
    int inByte = Serial.read();
    Serial.println(inByte);
    if (inByte == -1) {
        return str;
    } else {
      str[i++] = inByte;
    }
  }
  return str;
}

并且它一次返回1个字符(serial.print(inByte)每隔一次返回-1).为什么Serial会分裂每个字符?

如果我输入’hello’并且我调用serial.read()它会给出一个字符然后说什么都没有,然后给另一个角色并且说什么都没有.

最佳答案
我想到了.

当您打开9600波特的串行(Serial.begin(9600);)时,它以每秒9600字节的速度读/写.这意味着它最快可以达到每毫秒不到10个字节.我不知道操作速度是多少,但似乎Arduino会收到警报并在第二个字节到达之前读取第一个字节.因此,您必须添加延迟(1)以“等待”“相同流”中的另一个字节到达.

String read() {
    while (!Serial.available()); //wait for user input
    //there is something in the buffer now
    String str = "";
    while (Serial.available()) {
        str += (char) Serial.read();
        delay(1); //wait for the next byte, if after this nothing has arrived it means the text was not part of the same stream entered by the user
    }
    return str;
}

您可能会问,因为您推迟了如何知道用户是否只是打字速度非常快?你不能在这里避免它,因为Serial基本上限制在一定的速度.但是,用户必须以几乎不可能的速度输入,以便将两个输入混淆为一个.

转载注明原文:Arduino无法正确读取Serial - 代码日志