primero algunos detalles:
Placa Nucleo STM32F411, Atstico TrueSTUDIO v9.1.0, Debian linux 9.6.
Estoy enviando una cadena de telemetría a través del UART utilizando la HAL. Estoy utilizando el siguiente código para construir y transmitir los datos:
sprintf(str, "#, %d, %d, %s\n", csvString.range, csvString.lux, csvString.time);
HAL_UART_Transmit(&huart2, str, strlen(str), 100);
donde '#' es el carácter de inicio de la oración de telemetría, y los datos siguen una estructura de tipo CSV preformateada para una fácil manipulación en el lado receptor. Si hago un sencillo
cat /dev/ttyACM0
Puedo ver el resultado, que se ve así:
#, 21, 114, 01:58:001
para que parezca que está funcionando bien. Sin embargo, cuando intento usar una secuencia de comandos de Python simple para analizar esta información, tengo un lío. Parece ser un problema de codificación. El pitón que estoy usando se ve (como un extracto) así:
ser = serial.Serial('/dev/ttyACM0', 115200, timeout=2, parity = serial.PARITY_EVEN, bytesize = serial.EIGHTBITS, stopbits = serial.STOPBITS_ONE)
if ser.isOpen():
ser.close()
ser.open()
ser.flushInput()
ser.flushOutput()
line = ser.readline(100)
ser.close()
y el resultado que obtengo de esta lectura de 100 bytes fuera de la UART (solo un sniff para ver si las cosas funcionan correctamente) se ve así:
#\t\x920\t\x8a1\x13\t\xa22\xa7\xb2:\x820\xe1#\t\x922\t\x8a1\x13\t\xa22\xa7\xba:\x821\xe1#\t\x921\t\x8a1&\t\xa22\xa7\xba:\x821\xe1#\t\x923\t\x8a1&\t\xa22\xa7\xba:\x821\xe1#\t\x921\t\x8a1&\t\xa22\xa7\xba:\x821\xe1#\t\x920\t\x8a1\x13\t\xa22\xa7\xba:\x82
Hay un patrón de repetición obvio en esto, que parece que se alinea con las oraciones de telemetría. No puedo usar algunos de los otros métodos en python para leer el UART fácilmente porque no pueden detectar caracteres de nueva línea en esto.
Obviamente es un problema de codificación, pero no estoy seguro de cómo resolverlo como:
- No sé cómo (incluso después de buscar) verificar la codificación de transmisión utilizada por el STM32 HAL / Compiler
- No soy una persona talentosa en software
¿Podría la comunidad por favor:
- Ayúdame a determinar cuál es la codificación que se envía
- Dé un ejemplo de cómo descodificarlo para que luego pueda escribir código para analizar las cosas cuando sea necesario.
¡Gracias!
EDITAR: Para abordar un comentario que sugiere evaluar los datos de UART usando un osciloscopio, no puedo hacer esto ya que estoy usando el puente UART en la parte STLink de la placa Núcleo STM32. Actualmente no puedo cambiar al otro UART ya que esos pines están en uso. Tampoco explicaría por qué puedo ver los datos correctamente formateados si muestro la salida del dispositivo en una sesión de terminal (el cat / dev / ttyACM0 mencionado anteriormente). Gracias por tu sugerencia.