Problemas de codificación de caracteres UART STM32 (no se puede descodificar usando ASCII o UTF-8)

0

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.

    
pregunta willanth

1 respuesta

1
  

Si hago un sencillo

     

cat /dev/ttyACM0

     

Puedo ver el resultado

Por lo tanto, funciona con la configuración predeterminada de /dev/ttyACM0 . Puede averiguar qué son con el comando stty . En mi PC me sale

root@berendilinux:~# stty -a </dev/ttyUSB0 
speed 9600 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S;
susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 hupcl -cstopb cread clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke -flusho -extproc
root@berendilinux:~# 

Ejecute stty -a </dev/ttyACM0 en su host, y cualquier tasa que informe será la velocidad en baudios para poner en el programa Python.

Lee man stty para el significado de las banderas. Mi salida contiene

'-parenb cs8 -cstopb'

que significa sin paridad , 8 bits, 1 bit de parada. La paridad rara vez se usa en estos días, algunos hardware no la admiten en modo de 8 bits en absoluto.

    
respondido por el berendi

Lea otras preguntas en las etiquetas