我使用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
如您所见,标头在其中,但它位于不可预测的元素索引中。 我该怎么做?你知道吗
问题是,您正在比较条件表中不同大小的bytearray。因此,它将始终计算为
False
。将上限改为4,这样就可以得到4个字节。你知道吗相关问题 更多 >
编程相关推荐