Arduino Serielle Kommunikationsprobleme

Ich habe Probleme, meinen Kommunikationscode zum Laufen zu bringen. Ich gebe die Daten 1, 0, 255, 50 ein und dann kommt es zu Fehlern (sollte es nicht warten, bis 8 Bits gesendet wurden?), es endet mit meiner Debug-Nachricht von BadPacket und StartPacket und gibt dann die Zahl 49 aus, die dies anzeigt dachte, das erste Paket wäre 49. Was ist hier los?

Dies ist, was ich verwende:

const uint8_t kACKBit = 6;
const uint8_t kNACKBit = 25;
const uint8_t kStartBit = 1;


void setup()
{
    Serial.begin(115200);

}

void loop() 
{
   if(Serial.available() >= 8)
   {
     readData();
   }

}

void badPacket()
{
    //flush the buffer and send a request to resend the data
    Serial.flush();
        Serial.println("Bad Packet");
    Serial.print(kNACKBit);

}
void goodPacket()
{
    //Packet good - send an acknowledgement
        Serial.println("Good Packet");
    Serial.print(kACKBit);
}


void readData()
{
        uint8_t startPacket = 10;
        startPacket = Serial.read();
        if (startPacket != kStartBit)
    {
        badPacket();
                Serial.println("StartPacket");
                Serial.println(startPacket, DEC);
        return;
    }

    //check that the address is valid
    uint8_t address = Serial.read();
    if(address >= 6)
    {
        badPacket();
                Serial.println("address");
        return;
    }

    //read in the RGB values
    uint8_t r = Serial.read();
    uint8_t g = Serial.read();
    uint8_t b = Serial.read();

    //read in the duration
    uint8_t high_byte = Serial.read();
    uint8_t low_byte = Serial.read();

    //combine the two values into a single int
    uint16_t duration = (high_byte << 8) + low_byte;

    //check that it ends in a null teminator
    if(Serial.read() != 0)
    {       
        badPacket();
                Serial.println("nullterm");
        return;
    }

    //confirmed packet - send ack signal
    goodPacket();
    return;
}
versuchen Sie, einzelne Bits dort zu lesen? Es ist nicht ungewöhnlich, aber es scheint, als gäbe es mit dem Arduino bereits eine Bibliothek, mit der Sie in Bytes arbeiten können .
Ja, daher kommt deine Verwirrung. Serial.available() und Serial.read() werden in ganzen Bytes ausgeführt, nicht in einzelnen Bits. Das heißt, ich würde versuchen, Serial.flush() in Ihrem Setup-fxn zu verwenden, denn wie Sie gesagt haben, wenn Sie tatsächlich nur 4 Bytes {1,0,255,50} senden, sollten Sie immer noch in der Schleife sein und auf Serial warten .available(), um 8 zu erreichen. Ich glaube also, dass Sie Ihre Daten nicht korrekt senden ... oder zumindest nicht so, wie Sie denken.
Entschuldigung, ich meinte Bytes. A war ein bisschen müde, es war Mitternacht, ich versuchte, es zum Laufen zu bringen, bevor ich ins Bett ging. Wie auch immer, wenn ich Badpacket sage, macht es auch einen Serial.flush und dann wird es nach weiteren 4 Bytes, nicht 8, wieder einen Fehler geben.
Ich habe es gerade herausgefunden - obwohl ich immer noch nicht sicher bin, wie das serielle Protokoll funktioniert. Ich habe das ASCII-Zeichen gesendet, das der Zahl 1 entspricht, anstelle der einfachen Zahl 1. Ich weiß nicht warum, aber ich denke, wenn Sie ASCII-Text senden, werden 2 Bytes anstelle von einem benötigt?
Ah - als ich die mehrstelligen Zahlen gesendet habe, habe ich mehrere Bytes gesendet, die es erklären.

Antworten (1)

Es sieht so aus, als würden Sie die ASCII-Werte der Zahlen mit den Zahlen selbst verwechseln.

Wenn Sie ein '1'-Zeichen über die serielle Schnittstelle senden, senden Sie tatsächlich das Byte 49 (0x31). Aus diesem Grund sehen Sie die ungültige 49.

Ändern Sie entweder Ihren Code, um ASCII zu verstehen, oder senden Sie die Rohbytes anstelle von ASCII-Ziffern.