如何在loop()之外使用Serial.read读取字符串?

时间:2015-11-14 14:10:50

标签: arduino

我想从loop()方法之外的键盘读取Arduino中的String。

我有以下方法:

void readFromKeyboard(byte arrayAddress[])
{    
    int count = 0, i = 0;

    while ((count = Serial.available()) == 0);
    while (i<count)
    {
        arrayAddress[i++] = Serial.read();
    }
}

在loop()方法中,我称之为:

readFromKeyboard(userInput);

其中userInput是byte [];

问题是当我输入多个字符时,它最初读取第一个字符并再次调用 readFromKeyboard 然后读取其余字符。

示例;如果我输入“ asdf ”:

- 它第一次做==&gt; userInput =“ a

- 它第二次做==&gt; userInput =“ sdf

我尝试过很多东西,但同样的事情一次又一次地发生...... 有什么建议??

2 个答案:

答案 0 :(得分:0)

这样做有用:

循环()

while(Serial.available() == 0);
delay(100); 
readInputFlag = readFromKeyboard(userInput);`

readFromKeyboard 方法中:

void readFromKeyboard(byte arrayAddress[])
{
    int i = 0;

    while (Serial.available() > 0)
    {
        arrayAddress[i++] = Serial.read();
    }
}

这种延迟,在循环方法中,以某种方式使串行获取整个字符串而不是第一个字母。

答案 1 :(得分:0)

我知道你让它运转了,但我想向你展示一些我用来处理这个问题的东西。这是一个双层延迟系统,用于捕获由于某种原因而迟到的字节。它旨在最大限度地减少完成该任务所需的延迟。

int received_length = 0;
byte serial_incoming_buffer[200];

while(Serial.available()) {
  serial_incoming_buffer[received_length++] = Serial.read();
  if(!Serial.available()) {
    delay(3);
    if(!Serial.available()) {
      delay(20);
    }
  }
}

有时候,Arduino会从发送者那里收集序列号,但有时它会过快地抓取序列号。有时候发件人会稍稍滞后。这段代码将等待3毫秒以获得更多字节,如果它们进入,它将返回接收尽可能多的只有非常短暂的延迟。这在必要时重复,然后当3毫秒没有任何可用时,它会等待更长的时间(此处为20毫秒)以获得更多字节。如果在长时间延迟后没有任何信息进入,则很可能完成传输,您可以安全地继续前进。

我建议根据您的波特率调整延迟。