Arduino не может правильно читать Serial - PullRequest
6 голосов
/ 28 марта 2012

Хорошо, я гуглил получение строки из Serial с 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 символ за раз (серийный.print (inByte) дает -1 через каждый раз).Почему Serial разделяет каждый символ?

Если я ввожу 'hello' и вызываю serial.read (), он дает символ, затем говорит, что ничего нет, затем дает другой символ и говорит, что ничего нет.

Ответы [ 5 ]

11 голосов
/ 27 июля 2012

Я понял.

Когда вы открываете Serial с 9600 бод (Serial.begin(9600);), он читает / записывает со скоростью 9600 байт в секунду.Это означает, что в большинстве случаев он может получить чуть менее 10 байт в миллисекунду.Я не знаю, какова скорость работы, но похоже, что Arduino получает предупреждение и читает первый байт до того, как поступит второй.Таким образом, вы должны добавить delay(1), чтобы «ждать» другого байта в «том же потоке», чтобы прибыть.пользователь просто очень быстро печатает?Вы не можете избежать этого здесь, поскольку Serial существенно ограничен с определенной скоростью.Однако пользователь должен вводить практически невозможную скорость, чтобы два ввода были перепутаны как один.

2 голосов
/ 28 марта 2012

У меня нет доступа к исходным файлам Arduino, но следующая строка кода не даст вам полную строку по понятным причинам (дайте мне знать, если это не так очевидно):

int inByte = Serial.read();

Также, используя

Serial.write()

вы будете отправлять байт за байт. Это опозит от

Serial.println()

, в котором вы будете отправлять полные предложения.

Я бы попробовал работать с Serial.print () или println (), а не с Serial.write ().

Вы можете проверить ссылки:

http://arduino.cc/en/Serial/Write

http://arduino.cc/en/Serial/Println

1 голос
/ 20 ноября 2014

Несмотря на то, что это сообщение старое, я выложу свой ответ на случай, если кто-нибудь погуглит здесь.

Для чтения строк из сериала вы можете использовать следующее:

String str;

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

Работает как шарм!

0 голосов
/ 19 февраля 2015
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;
        }
    }
}
0 голосов
/ 10 июня 2012

Существует задержка при передаче данных через 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();
}
...