2012-03-28 4 views
4

Хорошо, я googled получаю строку из Serial с Arduino, и мне не повезло, даже скопировать и вставить примеры.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.read(), он дает персонажу, тогда говорит, что ничего нет, затем дает другого персонажа и говорит, что ничего нет.

+0

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

ответ

7

Я понял.

Когда вы открываете Serial с 9600 бод (Serial.begin(9600);), он считывает/записывает со скоростью 9600 байт в секунду. Это означает, что с максимальной скоростью он может получить чуть меньше 10 байт за миллисекунду. Я не знаю, что такое рабочая скорость, но похоже, что Arduino получает предупреждение и читает первый байт перед тем, как второй придет. Итак, вы должны добавить delay(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 существенно ограничен с определенной скоростью. Тем не менее, пользователь должен вводить виртуально - невозможно - быстро, чтобы два входа были путаны как один.

2

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

int inByte = Serial.read(); 

Кроме того, с помощью

Serial.write() 

вы будете посылать байт за байтом. Это oposite от

Serial.println() 

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

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

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

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

0

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

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

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

String str; 

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

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

-2
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; 
     } 
    } 
} 
Смежные вопросы