Как читать байтовые данные с заголовком с помощью PySerial - PullRequest
0 голосов
/ 20 сентября 2019

Я использую Pyserial для чтения байтовых данных, поэтому я не могу использовать простой нулевой байт или символ EOL, поскольку это могут быть реальные данные, а не идентификатор EOL.

Я решил попробоватьотправлять 4 байта в качестве «начала кадра» следующим образом: 0x00, 0x01, 0x02, 0x03

Просмотр этой последовательности байтов в полезной нагрузке крайне маловероятен, так что это хороший кандидат.

Протокол всегда один и тот же: HEADER + 4 байта полезной нагрузки.

Я хочу использовать PySerial для отображения их, поскольку они поступают в режиме реального времени, но я не могу получить первые байтысинхронизированы.

Вот фрагмент кода Python


    if ser.isOpen():

        try:
            ser.flushInput() #flush input buffer, discarding all its contents
            ser.flushOutput()#flush output buffer, aborting current output
                     #and discard all that is in buffer
            numOfLines = 0

            while True:
                response = ser.read(8)
                print(response)
                if (response[0:3] == bytearray(b'\x00\x01\x02\x03')):
                    data = struct.unpack('f',response[4:8])
                    print("read data: " + str(data[0]))
                    numOfLines = numOfLines + 1
                else:
                    print("Error")

            ser.close()
        except Exception as e :
            print("error communicating...: " + str(e))

    else:
        print("cannot open serial port ")

А вот код микроконтроллера C, который отправляет последовательные данные:

#define HEADER  0x00,0x01,0x02,0x03

typedef union Data{
uint32_t x32;
float xfl;
uint8_t x8[4];
}Data;



uint8_t _header[4] = {HEADER};

bool send_data(uint32_t data_f){

  HAL_GPIO_TogglePin(LED_L_GPIO_Port, LED_L_Pin);
  Data data;
  data.xfl = data_f;
  while(HAL_UART_Transmit_DMA(&huart3, (uint8_t *)&_header, 4)!=HAL_OK);
  HAL_Delay(1);
  while(HAL_UART_Transmit(&huart3, (uint8_t *)&data.x8, 4,100)!= HAL_OK);

return true;

}

А вот что выводит скрипт Python, когдаsend_data вызывается каждые 10 мсек:

b'\x00\x01\x02\x03\x89\x88\x88M'
Error
b'\x00\x01\x02\x03\x89\x88\x88M'
Error
b'\x00\x01\x02\x03\x89\x88\x88M'
Error
b'\x00\x01\x02\x03\x89\x88\x88M'
Error
b'\x00\x01\x02\x03\x89\x88\x88M'
Error
b'\x00\x01\x02\x03\x89\x88\x88M'
Error

Как видите, там есть заголовок, но он имеет непредсказуемый индекс элемента.Как мне это сделать?

1 Ответ

0 голосов
/ 21 сентября 2019

Проблема в том, что вы сравниваете байтовые массивы разных размеров в вашем условном выражении.Таким образом, всегда оценивается как False.Измените верхнюю границу на 4, чтобы вместо этого вы получили 4 байта.

>>> result = b'\x00\x01\x02\x03\x89\x88\x88M'
>>> response[0:3] == bytearray(b'\x00\x01\x02\x03') # Your condition
False
>>> response[0:4] == bytearray(b'\x00\x01\x02\x03') # Better version
True
>>>
...