Проблемы с последовательной связью Arduino

У меня проблемы с работой кода связи. Я ввожу данные 1, 0, 255, 50, а затем возникают ошибки (не следует ли ждать, пока не будут отправлены 8 бит?), он выходит с моим отладочным сообщением BadPacket и StartPacket, а затем печатает число 49, указывая, что он думал, что первый пакет был 49. Что здесь происходит?

Это то, что я использую:

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;
}
вы пытаетесь читать отдельные биты там? это не неслыханно, но похоже, что с arduino уже была бы библиотека, которая позволяла бы вам работать с байтами .
Ага, вот откуда твоя неразбериха. Serial.available() и Serial.read() выполняются целыми байтами, а не отдельными битами. Тем не менее, я бы попробовал использовать Serial.flush() в вашей настройке fxn, потому что, как вы сказали, если вы на самом деле отправляете только 4 байта {1,0,255,50}, то вы все равно должны находиться в цикле ожидания Serial . available() чтобы достичь 8. Поэтому я считаю, что вы отправляете свои данные неправильно... или, по крайней мере, не так, как вы думаете.
Извините, я имел в виду байты. Я немного устал, была полночь, я пытался заставить его работать, прежде чем лечь спать. В любом случае, когда я говорю Badpacket, он также выполняет Serial.flush, а затем снова выдает ошибку через еще 4 байта, а не 8.
Только что разобрался - хотя я до сих пор не уверен, как работает последовательный протокол. Я отправлял символ ASCII, соответствующий цифре 1, вместо обычного числа 1. Не знаю почему, но я думаю, что когда вы отправляете текст ASCII, он занимает 2 байта вместо одного?
Ах, когда я отправлял многозначные числа, я отправлял несколько байтов, что объясняет это.

Ответы (1)

Похоже, вы путаете значения ASCII чисел с самими числами.

Если вы отправляете символ «1» через последовательный порт, вы фактически отправляете байт 49 (0x31). Вот почему вы видите недопустимое число 49.

Либо измените свой код, чтобы понимать ASCII, либо отправьте необработанные байты вместо цифр ASCII.