Не удается отправить (или не получить) значение 0 в последовательном Python

#python-3.x #serial-port

Вопрос:

Я соединил свои контакты RPi3 Tx и Rx вместе. Я использую следующий код:

 import serial
from time import sleep

ser = serial.Serial(
        port='/dev/ttyS0',
        baudrate = 9600,
        parity=serial.PARITY_NONE,
        stopbits=serial.STOPBITS_ONE,
        bytesize=serial.EIGHTBITS,
        timeout=10
)
while True:
    
    ser.write(0)
    sleep(1)
    incoming = ser.read(ser.inWaiting())
    print(incoming)
 

Это печатает пусто b'' . Я могу сделать это: '0'.encode() и тогда я получу b'0' .
Мне нужно отправить пакеты данных на датчик: bytearray({0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79}) . Проблема в том, что в обратной связи я получаю неполный пакет, и он вышел из строя. Похоже, что после первого отправленного » 0 » он завершается или происходит что-то еще. Как правильно отправлять такие команды? Я также пытался ser.read(9) , так как ожидаю 9 байт, но он все равно отключает его.

Ответ №1:

Проблема заключается в

 bytearray({0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79})
 

где {...,} синтаксис используется для построения набора. Это неупорядоченный список уникальных предметов. Следовательно, несколько нулевых байтов становятся только одним, а порядок произвольный. Вместо этого используйте список:

 data = bytearray((0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79))
ser.write(data)
 

Комментарии:

1. Я проверю вечером, и если это правильно, вы получите большой 1 и зеленую галочку 🙂 Я потерял довольно много нервов из-за этого 😀

2. Большое спасибо! Это действительно было проблемой.