Wpadłem na to grzebiąc w libie do Arduino. Zdarza mi się bowiem, że uruchomienie Maszyny resetuje mi uC (Mega 2560). Czytałem że jest to normalne po otwarciu portu szeregowego i bardziej dziwi mnie, że z rzadka to nie następuje.
Problem nie jest zauważalny, gdy po stronie Arduino transmisja określona jest tak:
uint8_t output[20] = {0xEF, 0xEF, 0xEF, 0xEF};
uint8_t input[52] = {0};
void setup() {
Serial.begin(19200, SERIAL_8N1);
while (!Serial);
}
void loop() {
Serial.readBytes((uint8_t *) &input, 52);
Serial.write((uint8_t *) &output, 20);
}
Ale problem można odtworzyć na wersji Maszyny z signed char, gdy w kodzie uC dodasz guarda:
uint8_t output[20] = {0xEF, 0xEF, 0xEF, 0xEF};
uint8_t input[52] = {0};
void setup() {
Serial.begin(19200, SERIAL_8N1);
while (!Serial);
}
void loop() {
if (Serial.available() >= 52) {
Serial.readBytes((uint8_t *) &input, 52);
}
if (Serial.availableForWrite() >= 20) {
Serial.write((uint8_t *) &output, 20);
}
}
Przy signed char Maszyna nie łapie synca:
uart: read byte: 0
uart: read byte: 0
uart: read byte: 0
uart: read byte: 0
uart: read byte: 0
uart: tired of trying
uart: bad sync
uart: read byte: 0
uart: read byte: -17
uart: read byte: -17
uart: read byte: -17
uart: read byte: -17
uart: read byte: 4
uart: read byte: -128
uart: read byte: 0
uart: read byte: 0
uart: read byte: 0
uart: read byte: 0
uart: read byte: 0
uart: read byte: 0
uart: read byte: 0
Ale po zmianie na unsigned char - już tak:
uart: tx: EF EF EF EF 00 00 00 00 00 00 08 03 0C B0 00 DA 09 00 00 00 00 00 00 00 00 B4 5E 76 2F 1F 02 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00
sm42-907 received command: [aidriverdisable]
New order for [passat]: JumpToNextOrder
[...]
uart: bad sync
uart: read byte: 0
uart: read byte: 239
uart: read byte: 239
uart: read byte: 239
uart: read byte: 239
uart: synced, skipping one packet..
uart: sync ok
Bez guarda readBytes() czeka na bufor wejściowy przez czas określany za pomocą Serial.setTimeout(), domyślnie 1s.
Zależy mi na tym, żeby blokować loop() czekając na dane.