C Arduino可以';不能正确读取序列号

C Arduino可以';不能正确读取序列号,c,stream,serial-port,arduino,C,Stream,Serial Port,Arduino,好吧,我在谷歌上搜索了Arduino的连续剧中的一个字符串,我甚至连复制和粘贴示例的运气都没有 我想从连续剧中得到一个字符串。这是我的密码: void setup() { Serial.begin(9600); Serial.write("Power On"); } void loop() { while(!Serial.available()); while (Serial.available() > 0) { Serial.write(S

好吧,我在谷歌上搜索了Arduino的连续剧中的一个字符串,我甚至连复制和粘贴示例的运气都没有

我想从连续剧中得到一个字符串。这是我的密码:

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;
}
char*读取(int len){
而(!Serial.available());
char-str[len];
int i=0;
而(我
它一次返回1个字符(serial.print(inByte)每隔一次给出-1)。为什么连载要拆分每个字符


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

我无法访问此处的Arduino源文件,但以下代码行不会给出完整的字符串,原因很明显(如果不是很明显,请告诉我):

此外,使用

Serial.write()
您将按字节发送。那是我们的网站

Serial.println()
其中你将发送完整的句子

我会尝试使用Serial.print()或println()而不是Serial.write()

您可以查看以下参考资料:


通过UART传输数据时存在延迟。请尝试使用Serial.timedRead()代替。代码如下

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

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

    while (true) {
      int byte = Serial.timedRead();
      if(byte == -1)
         break;
      Serial.write(byte);
    }
    Serial.println();
}
我想出来了

当你打开一个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;
}

你可能会问,既然你在拖延时间,你怎么知道用户只是打字很快?你不能在这里避免它,因为序列基本上是以一定的速度限制的。然而,用户的输入速度必须快到几乎不可能将两个输入混淆为一个。

即使这篇文章很旧,我也会在这里发布我的答案,以防有人用谷歌搜索到他们

要从序列号读取字符串,可以使用以下命令:

String str;

while (Serial.available() > 0) {
    str = Serial.readString();
}

工作起来很有魅力

我写了这个简单的串行完整消息转发器。它不需要一个
字符串
对象,也不需要像前面回答中那样的任何延迟

String str;

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

void loop ()
{
    while (Serial.available() > 0){
        char c = Serial.read();
        str.concat(c);
        if (Serial.available() == 0)
        {
            Serial.print(str);
            str = "";
            break;
        }
    }
}
它的工作原理
它接收字符并将其存储到缓冲区,直到接收到终止字符
\n
\0
。然后它将整个缓冲区打印回来

还实现了缓冲区溢出检查,因此不会丢失任何数据

此解决方案的主要优点是,即使在整个阅读过程完成之前,也可以对消息内容做出快速反应(例如,您可以非常轻松地在此基础上实现消息解析器)


串行端口非常慢。通常一次只获取一个字节,然后一段时间内什么都没有。您需要在代码中处理这个问题,您现在还没有这样做。
String str;

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

void loop ()
{
    while (Serial.available() > 0){
        char c = Serial.read();
        str.concat(c);
        if (Serial.available() == 0)
        {
            Serial.print(str);
            str = "";
            break;
        }
    }
}
#define LENGTH 20

void setup() {
  Serial.begin(9600);
  Serial.println("Ready to read");
}

void loop() {
  if (Serial.available()) {
    char buffer[LENGTH];
    int index = 0;
    bool receiving = true;
    
    while (receiving) {
      if (Serial.available()) {
        char ch = Serial.read();
        if (ch == '\n' || ch == '\0') {
          buffer[index] = '\0';
          receiving = false;
        } else {
          buffer[index++] = ch;
          if (index == LENGTH) {
            buffer[index] = '\0';
            break;
          }
        }
      }
    }

    Serial.println(buffer);
  }
}