如何用PySeri读取带有头的字节数据

2024-05-16 04:22:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用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;

}

下面是Python脚本在每隔10ms调用send_data时的输出:

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

如您所见,标头在其中,但它位于不可预测的元素索引中。 我该怎么做?你知道吗


Tags: data字节responseerrorhalserprintx00
1条回答
网友
1楼 · 发布于 2024-05-16 04:22:48

问题是,您正在比较条件表中不同大小的bytearray。因此,它将始终计算为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
>>>

相关问题 更多 >