Problemas de comunicación en serie de Arduino

Tengo problemas para que mi código de comunicación funcione. Ingreso los datos 1, 0, 255, 50 y luego da error (¿no debería esperar hasta que se hayan enviado los 8 bits?), sale con mi mensaje de depuración de BadPacket y StartPacket, y luego imprime el número 49, indicando que Pensé que el primer paquete era 49. ¿Qué está pasando aquí?

Esto es lo que estoy usando:

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;
}
¿ Estás tratando de leer bits individuales allí? no es inaudito, pero parecería que con el arduino, ya habría una biblioteca que te permitiría trabajar en bytes .
Sí, de ahí viene tu confusión. Serial.disponible() y Serial.read() se realizan en bytes completos, no en bits individuales. Dicho esto, intentaría Serial.flush() 'ing en su fxn de configuración porque, como usted dijo, si de hecho solo está enviando 4 bytes {1,0,255,50}, entonces aún debería estar en el bucle esperando Serial .disponible() para llegar a 8. Por lo tanto, creo que no está enviando sus datos correctamente... o al menos no de la forma en que cree que lo está haciendo.
Lo siento, quise decir bytes. A estaba un poco cansado, era medianoche, estaba tratando de hacerlo funcionar antes de irme a la cama. De todos modos, cuando digo Badpacket también hace un Serial.flush y luego volverá a generar un error después de otros 4 bytes, no 8.
Lo acabo de descubrir, aunque todavía no estoy seguro de cómo funciona el protocolo en serie. Estaba enviando el carácter ASCII que corresponde al número 1 en lugar del simple número 1. No sé por qué, pero supongo que cuando envías texto ASCII, se necesitan 2 bytes en lugar de uno.
Ah, cuando envié los números de varios dígitos, envié varios bytes que lo explican.

Respuestas (1)

Parece que estás confundiendo los valores ASCII de los números con los propios números.

Si envía un carácter '1' a través del puerto serie, en realidad está enviando el byte 49 (0x31). Es por eso que está viendo el 49 inválido.

Cambie su código para que comprenda ASCII o envíe los bytes sin formato en lugar de los dígitos ASCII.