Правильно принять инвертированные данные в порт 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 шт):
Ничего подобного. Когда данные по UART не передаются, на линии высокий уровень. А у вас - низкий из-за того, что транзистор сигнал сынвертировал.
Поэтому приёмник ждёт высокого уровня, чтобы затем обнаружить стартовый бит (задний фронт на линии).
Чтобы сынвертировать принятый байт, не нужен транзистор. Достаточно в коде написать:
if (Serial.available() > 0) {
uint8_t ch = Serial.read();
ch ~= ch;
...
}