Полученное сообщение отличается от отправленного сообщения через последовательное соединение - PullRequest
2 голосов
/ 05 июля 2019

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

Например, если я делаю

serial1.write(b'hello')

на raspi1, тогда raspi2 получает:

print(serial2.readline().hex())
fa9b9fff

, представляющее собой шестнадцатеричное представление ú›Ÿÿ.

РЕДАКТИРОВАТЬ: Вот методы получения и отправки:

отправитель:

def send_msg(_ser, _msg):
    if _ser.isOpen():  # isOpen() is deprecated since version 3.0
        try:
            _ser.flushInput()  # flush input buffer, discarding all its contents
            _ser.flushOutput()  # flush output buffer, aborting current output 
            # and discard all that is in buffer

            _ser.write(_msg)
            _ser.flush()

        except IOError:
            print('error communicating...')

    else:
        print('cannot open serial port')
    return

получатель:

def read_line(_ser, _eol_character=b'\n', _timeout=1, _encoding='utf-8'):
    buffer = ""
    timer = time.time()
    while (time.time()-timer)<_timeout:
        one_byte = _ser.read(1)
        print(one_byte.hex())
        if one_byte == _eol_character:
            return buffer.encode(_encoding)
        else:
            buffer += str(one_byte, _encoding, errors='replace')
    raise TimeoutError("Timed out while read_line(), make sure there is an EOF!")

1 Ответ

2 голосов
/ 08 июля 2019

То, что вы получаете, указывает на три возможных причины:

- Несоответствие настроек, скорее всего, разные скорости передачи

-Шум на шине: часто возникает из-за отсутствия общего заземления. Это происходит, когда вы не подключаете, а только подключаете сигналы TX и RX, но оставляете GND плавающим (на настольных компьютерах у вас, вероятно, будет общее заземление, даже если вы не подключите сигналы GND из-за безопасного заземления в проводке вашего дома но на ноутбуках или других устройствах с батарейным питанием это проблема, и вам нужно использовать третий кабель для подключения GND с обеих сторон шины).

-Вы пытаетесь общаться, используя разные логические уровни. Это происходит, если одна сторона шины работает на уровнях TTL (5 В), а другая - на 3,3 В, или когда у вас есть реальный уровень RS232 (дифференциальный) в сочетании с любой другой. Не говоря уже о том, пытаетесь ли вы смешать RS485 с RS232 или TTL, что, конечно, тоже не сработает.

...