Python 如何使用PySerial读取带有标头的字节数据
我使用Pyserial读取字节数据,所以我不能使用简单的空字节或EOL字符,因为这可能是真实数据,而不是EOL标识符 我决定尝试发送4个字节作为“帧的开始”,如下所示: 0x00、0x01、0x02、0x03 在有效负载中看到这一字节序列的可能性很小,因此这是一个很好的候选者 协议总是相同的:报头+4字节的有效负载 我想使用PySerial来绘制这些数据,因为它们是实时传入的,但是我无法同步第一个字节 下面是Python代码片段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
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')#更好的版本
真的
>>>