PySerial не работает при отправке данных с Raspberry Pi 4 на Mac - PullRequest
0 голосов
/ 21 июня 2020

Я пытаюсь отправить команду (в виде байтов) с Raspberry Pi 4 на Ma c, используя последовательное соединение.

Я подключил Pi к своему Ma c по схеме здесь указано: (https://learn.adafruit.com/adafruits-raspberry-pi-lesson-5-using-a-console-cable/connect-the-lead). По сути, я использую кабель от Prolifi c Technology для подключения Ma c к контактам UART на Pi.

Последовательная консоль Linux по умолчанию отключена на Pi, согласно инструкции здесь: https://www.raspberrypi.org/documentation/configuration/uart.md

На обоих концах используется PySerial. Сторона Ma c читает, а Pi пишет.

Я вижу, что обе стороны продолжают тайм-аут, а Ma c никогда не читает никаких байтов.

Исходный код для стороны Pi:

import serial
import serial.tools.list_ports as list_ports
from time import sleep

ports = list_ports.comports()

for port in ports:
    print(port)

if len(ports) == 0:
    print("Couldn't find any ports")
    exit(1)

# For now we only expect one port to be available
host_port = ports[0]

print("Found host port: {}".format(host_port.device))

ser = serial.Serial(
    host_port.device, 
    9600, 
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.EIGHTBITS,
    timeout=1,
    write_timeout=1,
)

while True:
    print("writing")
    try:
        ser.write(b'hello')
    except:
        print("Write timeout. Continue...")
    sleep(2)

Исходный код для стороны Ma c:

import serial
import serial.tools.list_ports as list_ports
from time import sleep

ports = list_ports.comports()
robot_port = None

for port in ports:
    if port.manufacturer is not None and "Prolific Technology" in port.manufacturer:
        robot_port = port
        break

if robot_port is None:
    print("Couldn't find an attached worldlike robot")
    exit(1)

print("robot_port: {}".format(robot_port.device))

ser = serial.Serial(robot_port.device, 9600, timeout=10)

if ser is None:
    print("Failed to create serial port")
    exit(1)

while True:
    print("reading")    
    line = ser.read(5)
    print("Read: {}".format(line))
    sleep(2)

Вывод из Pi:

/dev/ttyAMA0 - ttyAMA0
Found host port: /dev/ttyAMA0
writing
Write timeout. Continue...
writing
Write timeout. Continue...
…

Вывод из Ma c:

robot_port: /dev/cu.usbserial-14310
reading
Read: b''
reading
Read: b''
…

Есть идеи, почему это так?

Спасибо за ваше время!

1 Ответ

0 голосов
/ 21 июня 2020

Я не могу быть уверен, потому что у меня сейчас нет Pi 4, но вот мои два цента:

Что-то не так с UART на вашем Pi или его конфигурации. Когда я запускаю ваш (Pi) код на нескольких встроенных устройствах, я получаю следующее:

Found host port: /dev/ttyXXXX
writing
writing
....

Итак, вы получаете исключение. Теперь я перехожу в режим предположений, но я думаю, что вы не нацеливаетесь на нужный порт.

Согласно ссылке , которую вы опубликовали (см. Таблицу прямо под Linux устройствами на Raspberry Pi OS ): /dev/ttyAMA0 - это первый PL011 (UART0).

По той же ссылке читайте в разделе Конфигурация : первый PL011 (UART0) для Pi 4 - вторичное (Bluetooth) устройство.

Наконец, под заголовком Secondary UART вы найдете следующее утверждение:

Дополнительный UART обычно не является присутствует на разъеме GPIO. По умолчанию вторичный UART подключен к стороне Bluetooth комбинированного контроллера беспроводной локальной сети / Bluetooth на моделях, которые содержат этот контроллер.

Вывод: вы не должны пытаться получить доступ к /dev/ttyAMA0.

Проблема в том, что list_ports.comports(), похоже, не дает вам имена портов, как следует. С этим было несколько проблем , думаю, вы могли столкнуться с чем-то похожим.

Быстрое и безболезненное исправление - это адрес вашего порта напрямую как /dev/serial0. Если у вас есть время, вы можете разобраться в проблеме и исправить список портов.

...