Правильное завершение двоичных последовательных сообщений для чтения с pySerial - PullRequest
0 голосов
/ 11 марта 2020

Я пытаюсь установить sh надежное последовательное соединение между встроенным устройством и Python. Что прекрасно работает без завершения, если код Python запускается в нужный момент, когда последовательный порт находится в режиме ожидания между сообщениями. Но это не практично, особенно при высоких скоростях передачи данных. Поэтому я решил сделать это правильно и добавил возврат каретки 'x0D' в конце исходного сообщения, чтобы решить проблему с синхронизацией. Но я все еще не уверен, как правильно реализовать это в Python.

Примечание. Размер каждого последовательного сообщения составляет 17 байт = 4 значения датчика полезной нагрузки и CR.

enter image description here

Требуемая скорость передачи данных составляет 2,3 кГц, но она начинает становиться ненадежной уже при 200 Гц:

import serial
import struct

serialPort = 'COM3'
serialBaud = 230400
rawData = bytearray(16)
numSensors = 4
dataNumBytes = 4
data = [0 for x in range(numSensors)]

ser = serial.Serial(serialPort, serialBaud, timeout=1)
ser.reset_input_buffer()

while(True):
    rawData = bytearray(ser.read(17).split(b'\x0D')[0])
    for i in range(numSensors):
        bytedata = rawData[(i * dataNumBytes):(dataNumBytes + i * dataNumBytes)]
        data[i], = struct.unpack('f', bytedata)
    print(data)

ser.close()

Например, при скорости передачи данных 200 Гц она работает после несколько попыток, но затем выдает ошибку:

\Python\temp> python .\print_data.py
Traceback (most recent call last):
  File ".\print_data.py", line 22, in <module>
    data[i], = struct.unpack('f', bytedata)
struct.error: unpack requires a buffer of 4 bytes

\Python\temp> python .\print_data.py
Traceback (most recent call last):
  File ".\print_data.py", line 22, in <module>
    data[i], = struct.unpack('f', bytedata)
struct.error: unpack requires a buffer of 4 bytes

\Python\temp> python .\print_data.py
[-487.5, 0.963982343673706, -0.021746518090367317, -0.26979273557662964]
[0.3199999928474426, 0.963982343673706, -0.02106693759560585, -0.26979273557662964]
[0.30000001192092896, 0.9643221497535706, -0.020047569647431374, -0.2680937945842743]
[0.2800000011920929, 0.9622833728790283, -0.018688412383198738, -0.269113153219223]
[0.0, 0.9626231789588928, -0.01800883375108242, -0.27047231793403625]
Traceback (most recent call last):
  File ".\print_data.py", line 22, in <module>
    data[i], = struct.unpack('f', bytedata)
struct.error: unpack requires a buffer of 4 bytes

Кроме того, я попытался с readline безуспешно.

Я хотел бы знать, что я делаю неправильно.

...