Добрый день.
Кратко: у меня есть задача принять инвертированные данные в порт и правильно из прочитать.
Теперь подробнее:
Есть 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, соответственно дальше что-то делать с этими данными бессмысленно или я не правильно их принимаю?
Всем заранее спасибо за ответы.
Если не хотите добавить еще один инвертор, чтобы вернуть к норме, то попробуйте отправлять данные с инвертированием.
SoftwareSerial(rxPin, txPin, inverse_logic)
Но тогда и принимать SoftwareSerial будет с инверсными уровнями.
Аппаратный Serial в 2560 не может работать с инвертированным сигналом.
Вообщем, если это не возможно в принципе, то вопрос снимается. Я думал, что если библиотека SoftwareSerial умеет инвертировать сигнал, то это можно реализовать и в основном теле кода 2560 что бы не городить огород с транзистором.
Рассмотрите внимательно как Выглядит байт передачи. Сначала идёт стартовый бит. А это с высокого уровня (1) переход в 0 и затем в 1 . Затем не важно 8 бит. Затем стоповый бит опять с 1 в 0 и в 1. Когда вы этот сигнал инвертируете, то инверсия идет и стартового/стопового бита. Естественно, вы в приемнике получите чушь. Если хотите инвертировать данные, то делайте это программно.