2012-05-04 19 views
5
#include <stdio.h> 

#define LED 13 

void setup() { 
    pinMode(LED, OUTPUT); 
    Serial.begin(9600); 
} 

void loop() { 
    int i; 
    char command[5]; 
    for (i = 0; i < 4; i++) { 
    command[i] = Serial.read(); 
    } 
    command[4] = '\0'; 

    Serial.println(command); 

    if (strcmp(command, "AAAA") == 0) { 
    digitalWrite(LED, HIGH); 
    Serial.println("LED13 is ON"); 
    } else if (strcmp(command, "BBBB") == 0) { 
    digitalWrite(LED, LOW); 
    Serial.println("LED13 is OFF"); 
    } 
} 

Próbuję przeczytać ciąg 4 znaków z Arduino Serial, a gdy jest AAAA włączyć LED, gdy jest BBBB wyłączyć szeregowy.Arduino odczytać ciąg z Serial

Jednakże, kiedy wpisuję "AAAA", po drodze pojawia się "AAAÿ" z dużą ilością "ÿ".

Myślę, że wszystko czytam poprawnie, ale nie działa tak dobrze, nie mam pojęcia, co robię źle?

+0

Potwierdź, że szybkość transmisji, bity stopu, kontrola przepływu i parzystości są identyczne na obu końcach. Nawet jeśli "wiesz, że to prawda", poświęć 3 minuty i zweryfikuj to. Zaoszczędź sobie godzin. –

+0

Co to jest twój kod 'Serial.begin()'? – qwertz

+0

It's 9600, ja też wysłałem to. –

Odpowiedz

1
#define numberOfBytes 4 
char command[numberOfBytes]; 

    void serialRX() { 
     while (Serial.available() > numberOfBytes) { 
     if (Serial.read() == 0x00) { //send a 0 before your string as a start byte 
      for (byte i=0; i<numberOfBytes; i++) 
      command[i] = Serial.read(); 
     } 
     } 
    } 
1

Należy sprawdzić, czy jest coś do odczytania. Jeśli nie, wtedy read() zwróci -1. Możesz użyć Serial.available(), aby sprawdzić bufor odczytu.

9
String txtMsg = ""; 
char s; 

void loop() { 
    while (serial.available() > 0) { 
     s=(char)serial.read(); 
     if (s == '\n') { 
      if(txtMsg=="HIGH") { digitalWrite(13, HIGH); } 
      if(txtMsg=="LOW") { digitalWrite(13, LOW); } 
      // Serial.println(txtMsg); 
      txtMsg = ""; 
     } else { 
      txtMsg +=s; 
     } 
    } 
} 
1

To brzmi 'Y', ponieważ nie ma char czytać w buforze. Pozostałe postacie zabierają trochę czasu z bufora uart. Więc nie możesz zrobić pętli, żeby przeczytać znaki. Musisz poczekać, aż pojawi się inna postać, zanim ją przeczytasz.

Również ten sposób oczekiwania znaków nie jest najlepszym sposobem, ponieważ blokuje pętlę główną.

Oto co robię w moich programach:

String command; 

void loop() 
{ 
    if(readCommand()) 
    { 
     parseCommand(); 
     Serial.println(command); 
     command = ""; 
    } 
} 

void parseCommand() 
{ 
    //Parse command here 
} 

int readCommand() { 
    char c; 
    if(Serial.available() > 0) 
    { 
     c = Serial.read(); 
     if(c != '\n') 
     {  
      command += c; 
      return false; 
     } 
     else 
      return true; 

    } 
} 
Powiązane problemy