Я использую 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
Как видите, там есть заголовок, но он имеет непредсказуемый индекс элемента.Как мне это сделать?