2016-06-24 5 views
0

Ich habe versucht, serielle Kommunikation zwischen meinem Arduino-basierten Projekt und meinem PC zu erreichen, muss ich Befehle an Arduino über serielle und senden Verwenden Sie "if and else", um die gewünschte Funktion aufzurufen (in der Funktion parseMessage()).versuchen, mit Strings und seriellen Anschluss auf Arduino zu arbeiten, überspringt meine Skizze Zeichen aus irgendeinem Grund

Ich kann nicht delay() verwenden, da ich Interrupts für Multiplexing und Bit-Winkelmodulation verwende, also musste ich serielle Kommunikation anders herum machen, das ist am nächsten, ich muss folgen, aber immer noch bin ich Charaktersprünge und Instabilität im Allgemeinen bekommen. und wie Sie wissen, ist das Codieren alles wunderbar, außer wenn Sie nicht wissen, was mit Ihrem Code nicht stimmt, also helfen Sie mir bitte Götter des Internets! ;)

Der Grund, warum ich '#' als Ende der String-Deklaration verwende, ist, dass ich nicht sicher sein kann, dass alle Zeichen meines Befehls an Arduino gesendet werden, wenn Serial.read() danach fragt, Es könnte mehr auf dem Weg sein und da atmega328 schneller ist als der serielle Port Serial.available() könnte tatsächlich -1 in der Mitte der Übertragung zurückgeben.

  • ps: oh, und ich kann nicht String-Klasse verwenden, ist es sehr teuer, diese ATmega328 bereits unter 8x8 RGBLED Multiplexen und 4-Bit-Winkelmodulation schwitzt und er wird dich noch mehr in Zukunft zu tun haben.

  • ps: und ich lerne immer noch Englisch so entschuldigen Sie mich, wenn etwas mit der Grammatik, die ich benutze, nicht stimmt.

    void setup() { 
    Serial.begin(9600); 
    } 
    
    bool dataRTP = false; // data ready to parse 
    
    void loop() { 
        readSerial(); 
    } 
    
    char message[64]; 
    int index = 0; 
    
    void readSerial() { 
        if (Serial.available() > 0) 
        while (Serial.available() > 0) 
         if (Serial.peek() != '#') // i'm using '#' as end of string declearation. 
         message[index++] = Serial.read(); 
         else { 
         message[index++] = '\n'; 
         dataRTP = true; 
         break; 
         } 
        while (Serial.read() != -1) {} // flushing any possible characters off of 
        if (dataRTP)            // UARTS buffer. 
        parseMessage(); 
    } 
    
    void parseMessage() {   // just testing here, actual code would be like : 
        Serial.print(message);   // if (!strcmp(message, "this expression")) 
        index = 0;      // callthisfunction(); 
        dataRTP = false;    // else ... etc 
    } 
    

Antwort

1

nur diesen Code verwaltet zu beheben, war scheint Spülung Daten aus der seriellen UART alles eine gute Idee, nicht nach. Es ist alles gelöst. hier ist, wie Code jetzt aussieht:

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

    bool dataRTP = false; 

    void loop() { 
     readSerial(); 
    } 

    char message[64]; 
    int index = 0; 

    void readSerial() { 
     if (Serial.available() > 0) 
     while (Serial.available() > 0) 
      if (Serial.peek() == '#') { 
      message[index] = Serial.read(); 
      message[index] = '\0'; 
      dataRTP = true; 
      break; 
      } 
      else 
      message[index++] = Serial.read(); 
     if (dataRTP) 
     parseMessage(); 
    } 

    void parseMessage() { 
     Serial.println(message); 
     index = 0; 
     dataRTP = false; 
    } 
Verwandte Themen