Правильно принять инвертированные данные в порт Arduino MEGA 2560

Кратко: у меня есть задача принять инвертированные данные в порт и правильно из прочитать.

Теперь подробнее: Есть Arduino UNO, которая посредством SoftwareSerial отправляет данные в Arduino MEGA 2560, но при этом в разрыве между этими двумя платами данные инвертируются с помощью транзистора BC547 и уже в таком виде они приходят в порт Serial1 MEGA 2560.

Ломаю голову и не могу понять, каким образом из корректно прочитать. Думал, что достаточно будет,...

while (Serial1.available() > 0) {
    uint8_t data = Serial1.read(); 
    data = ~data;
    if (data >= 0){
      Message((byte) data);
    }
  }

..., но приходит не то, что нужно. Допустим, отправляю байт 00100101, но на вход MEGA 2560 прилетает 1101101, а не 11011010, соответственно дальше что-то делать с этими данными бессмысленно или я не правильно их принимаю?


Ответы (1 шт):

Автор решения: Vanyamba Electronics

Ничего подобного. Когда данные по UART не передаются, на линии высокий уровень. А у вас - низкий из-за того, что транзистор сигнал сынвертировал.

Поэтому приёмник ждёт высокого уровня, чтобы затем обнаружить стартовый бит (задний фронт на линии).

Чтобы сынвертировать принятый байт, не нужен транзистор. Достаточно в коде написать:

if (Serial.available() > 0) {
   uint8_t ch = Serial.read();
   ch ~= ch;
   ...
}
→ Ссылка