Как отладить разницу между поведением linux (odroid с Ubuntu 18.04) и поведением Ma c с последовательным портом связи - PullRequest
0 голосов
/ 25 апреля 2020

Я довольно застрял при попытке чтения / записи данных через последовательный протокол multiwii (MSP) на контроллер полета через мой odroid XU4 (работает под управлением Ubuntu 18.04). Особая проблема, с которой я сталкиваюсь, заключается в том, что я могу читать / писать, используя python3 поверх MSP, когда использую мой Macbook Pro, но я не могу, когда использую мой linux аппарат. Я попытался создать минимальный пример кода здесь:

import serial
import struct

ser = serial.Serial()
ser.port = "/dev/ttyACM0"
ser.baudrate = 115200
ser.bytesize = serial.EIGHTBITS
ser.parity = serial.PARITY_NONE
ser.stopbits = serial.STOPBITS_ONE
ser.timeout = 0
ser.xonxoff = False
ser.rtscts = False
ser.dsrdtr = False
ser.writeTimeout = 2
ser.open()

# write basic command to get some data back from the flight controller
contents = bytes('$M<\x00ll', 'utf-8')
print('contents:', contents)
d = ser.write(contents)
print('d:', d)

# read data back from flight controller
while True:
    header = ser.read().decode('utf-8')
    if header == '$':
        header = header + ser.read(2).decode('utf-8')
        break
datalength = struct.unpack('<b', ser.read())[0]
code = struct.unpack('<b', ser.read())
print('code:', code)
data = ser.read(datalength)
print('data:', data)
temp = struct.unpack('<'+'h'*int(datalength/2),data)
print('temp:', temp)

На моем Ма c я получаю этот ответ, который имеет смысл, учитывая ожидаемый результат:

contents: b'$M<\x00ll'
d: 6
code: (108,)
data: b'\xfc\xff\x12\x00\x01\x00'
temp: (-4, 18, 1)

Вкл. Odroid Я получаю следующее:

contents: b'$M<\x00ll'
d: 6
code: (108,)
data: b''
Traceback (most recent call last):
  File "demo/basic.py", line 32, in <module>
    temp = struct.unpack('<'+'h'*int(datalength/2),data)
struct.error: unpack requires a buffer of 108 bytes

Это также не работает с py2 или библиотекой C ++, которую я пробовал. Я могу общаться с устройством, как правило, используя screen /dev/ttyACM0.

Мне интересно, связано ли это с нулевым символом \x00. В частности, если я просто распечатаю строковую версию содержимого на своем Ma c, я вижу то же самое, в то время как на машине linux я вижу все, кроме нулевого символа, $M<ll. Несмотря на то, что я сделал это для записи, возможно, это не для чтения?

...