Связь между 2 Raspberry Pi с помощью UART

Я хочу отправлять данные с одного пи на другой с помощью связи UART. Первая модель Raspberry — это Raspberry Pi 4, а вторая — Raspberry Pi 3. Для этого соединения я подключаю оба контакта Raspberry следующим образом:

Pi 4 -> Pi 3

Tx -> Rx

Rx -> Tx

Ground -> Ground

Я уже активировал оба последовательных соединения Pis в конфигурации малины, следуя инструкциям по этой ссылке: https://iot4beginners.com/raspberry-pi-configuration-settings/. Чтобы записать и отправить данные, я создал следующую программу на Python:

import time
import serial

ser = serial.Serial(
        port='/dev/ttyS0', #Replace ttyS0 with ttyAM0 for Pi1,Pi2,Pi0
        baudrate = 9600,
        parity=serial.PARITY_NONE,
        stopbits=serial.STOPBITS_ONE,
        bytesize=serial.SEVENBITS)
counter=0
while True: 
    ser.write(str.encode(str(counter))) 
    time.sleep(1) 
    counter += 1

Для чтения и печати полученных данных я создал следующую программу:

import time
import serial

ser = serial.Serial(
        port='/dev/ttySO', #Replace ttyS0 with ttyAM0 for Pi1,Pi2,Pi0
        baudrate = 9600,
        parity=serial.PARITY_NONE,
        stopbits=serial.STOPBITS_ONE,
        bytesize=serial.SEVENBITS
)
counter=0

while 1:
    x = ser.readline()
    print(x)

Наконец, когда я запускаю программу чтения, я получаю следующую ошибку:

Traceback (most recent call last):
  File "serial_read.py", line 14, in <module>
    x = ser.readline()
  File "/usr/lib/python2.7/dist-packages/serial/serialposix.py", line 501, in read
    'device reports readiness to read but returned no data '
serial.serialutil.SerialException: device reports readiness to read but returned no data (device disconnected or multiple access on port?)

Я новичок в общении с Raspberry и буду благодарен за любое предложение.


person Iker Anglada Aizpurua    schedule 16.03.2021    source источник
comment
Моим первым предложением было бы прекратить использовать Python 2 для новых проектов — он официально мертв.   -  person Mark Setchell    schedule 16.03.2021
comment
Я думаю, вам нужно добавить новую строку к вашему write(), чтобы соответствующий readline() нашел конец строки.   -  person Mark Setchell    schedule 16.03.2021
comment
@MarkSetchell print() - это Python 3...   -  person JeffUK    schedule 16.03.2021
comment
@JeffUK Сообщение об ошибке: Python 2.7.   -  person Mark Setchell    schedule 16.03.2021
comment
@ДжеффУК. File "/usr/lib/python2.7/...   -  person Mad Physicist    schedule 16.03.2021
comment
Удачи с этим?   -  person Mark Setchell    schedule 17.03.2021


Ответы (1)


Python 2.7 официально мертв, поэтому я бы рекомендовал использовать Python3, особенно для новых проектов, таких как ваш.

Итак, вместо того, чтобы запускать ваш скрипт с помощью:

python3 YourScript.py

вы можете поставить правильный shebang в начале, чтобы он автоматически использовал правильную версию Python, которую вы планировали:

#!/usr/bin/env python3

import ...

Затем сделайте скрипт исполняемым с помощью:

chmod +x YourScript.py

Теперь вы можете запустить его с помощью:

./YourScript.py

и будьте счастливы, что он будет использовать Python3, а также даже если его использует кто-то другой.


Реальная проблема, я думаю, заключается в том, что readline() на принимающей стороне ищет новую строку, которую вы не отправляли. Поэтому я бы попробовал добавить один:

ser.write(str.encode(str(counter) + '\n')) 

Лично я считаю, что f-strings намного проще, чем старые % и .format(), так что попробуйте:

ser.write(str.encode(f'{counter}\n'))
person Mark Setchell    schedule 16.03.2021