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

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

Теперь подробнее:
Есть 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 лайк

Если не хотите добавить еще один инвертор, чтобы вернуть к норме, то попробуйте отправлять данные с инвертированием.
SoftwareSerial(rxPin, txPin, inverse_logic)
Но тогда и принимать SoftwareSerial будет с инверсными уровнями.
Аппаратный Serial в 2560 не может работать с инвертированным сигналом.

1 лайк

Присобачь ещё один каскад на bc547

осталось понять, зачем там инвертора?

Типа «усилитель», наерна)))

Тренировка приема инвертированного сигнала с данными, если это, конечно, возможно данным способом без сборки еще одной платы с транзистором.

Вообщем, если это не возможно в принципе, то вопрос снимается. Я думал, что если библиотека SoftwareSerial умеет инвертировать сигнал, то это можно реализовать и в основном теле кода 2560 что бы не городить огород с транзистором.

а вы не попробовали принимать с инверсными уровнями?
SoftwareSerial(rxPin, txPin, inverse_logic)

Так в том-то и дело, что задача принять именно в таких условиях, когда сигнал инвертируется аппаратно.

ты попробовал на приёмной стороне инициализировать порт с инверсией?

Прошу прощеня, а как его инициализировать с инверсией, если я использую порт Serial1 без использования библиотеки SoftwareSerial.

Serial1.begin(baud, SERIAL_8N1 | 1);

Спасибо огромное, буду пробовать, а не могли бы Вы подсказать где можно почитать документацию о данном методе? Я, если честно, не знал что так можно.

В даташите, конечно.

Благодарю, хорошего Вам дня.

Попробуйте конечно (это не долго), но не удивляйтесь если ничего не получится. Согласно даташита и не должно работать.

На тех жеж самых пинах можно и софтовый сериал поднять, а в нём точно можно :smiley:

Рассмотрите внимательно как Выглядит байт передачи. Сначала идёт стартовый бит. А это с высокого уровня (1) переход в 0 и затем в 1 . Затем не важно 8 бит. Затем стоповый бит опять с 1 в 0 и в 1. Когда вы этот сигнал инвертируете, то инверсия идет и стартового/стопового бита. Естественно, вы в приемнике получите чушь. Если хотите инвертировать данные, то делайте это программно.

1 лайк

Настроить порт можно, но работать это вряд ли будет. Аппаратное инвертирование сигнала и инвертированные данные - не одно и тоже.

1 лайк