Python 如何使用PySerial读取带有标头的字节数据

Python 如何使用PySerial读取带有标头的字节数据,python,serial-port,stm32,pyserial,packet,Python,Serial Port,Stm32,Pyserial,Packet,我使用Pyserial读取字节数据,所以我不能使用简单的空字节或EOL字符,因为这可能是真实数据,而不是EOL标识符 我决定尝试发送4个字节作为“帧的开始”,如下所示: 0x00、0x01、0x02、0x03 在有效负载中看到这一字节序列的可能性很小,因此这是一个很好的候选者 协议总是相同的:报头+4字节的有效负载 我想使用PySerial来绘制这些数据,因为它们是实时传入的,但是我无法同步第一个字节 下面是Python代码片段 if ser.isOpen(): tr

我使用Pyserial读取字节数据,所以我不能使用简单的空字节或EOL字符,因为这可能是真实数据,而不是EOL标识符

我决定尝试发送4个字节作为“帧的开始”,如下所示: 0x00、0x01、0x02、0x03

在有效负载中看到这一字节序列的可能性很小,因此这是一个很好的候选者

协议总是相同的:报头+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;

}
下面是每10毫秒调用
send_data
时Python脚本的输出:

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
正如您所看到的,标题在那里,但它在一个不可预测的元素索引中。
我应该怎么做呢?

问题是,您正在比较您的环境中不同大小的ByteArray。因此,它的计算结果总是
False
。将上限改为4,这样可以得到4个字节

>>结果=b'\x00\x01\x02\x03\x89\x88\x88M'
>>>响应[0:3]==bytearray(b'\x00\x01\x02\x03')#您的情况
假的
>>>响应[0:4]==bytearray(b'\x00\x01\x02\x03')#更好的版本
真的
>>>