Autor Tema: UART del STM32. Dudas de novato  (Leído 5343 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado PicMinor

  • PIC16
  • ***
  • Mensajes: 236
UART del STM32. Dudas de novato
« en: 14 de Diciembre de 2021, 06:30:37 »
Saludos al foro!

Me ha tocado por razones profesionales empezar a trabajar con los micros de la familia STM32.
La primera aplicación que estoy desarrollando lleva incorporada una recepción serie convencional (9600,n,8,1).
Se trata de un sistema que espera una cadena de comandos desde un PC y una vez recibida, la procesa y actúa en consecuencia. Todo muy convencional.
He escrito y depurado el código en el entorno STM32CubeIDE utilizando la función HAL_UART_Receive_IT y funciona todo correctamente.
El problema me ha surgido al intentar "proteger" la conexión frente a posibles errores. La cadena de comando que espera tiene una longitud determinada, pongamos por ejemplo 10 caracteres. SI le mando 10 caracteres todo funciona correctamente pero si le mando una cadena de longitud 8 no consigo detectar el error.

¿Alguna idea?

Gracias por anticipado!

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:UART del STM32. Dudas de novato
« Respuesta #1 en: 14 de Diciembre de 2021, 08:59:00 »
Saludos al foro!

Me ha tocado por razones profesionales empezar a trabajar con los micros de la familia STM32.
La primera aplicación que estoy desarrollando lleva incorporada una recepción serie convencional (9600,n,8,1).
Se trata de un sistema que espera una cadena de comandos desde un PC y una vez recibida, la procesa y actúa en consecuencia. Todo muy convencional.
He escrito y depurado el código en el entorno STM32CubeIDE utilizando la función HAL_UART_Receive_IT y funciona todo correctamente.
El problema me ha surgido al intentar "proteger" la conexión frente a posibles errores. La cadena de comando que espera tiene una longitud determinada, pongamos por ejemplo 10 caracteres. SI le mando 10 caracteres todo funciona correctamente pero si le mando una cadena de longitud 8 no consigo detectar el error.

¿Alguna idea?

Gracias por anticipado!

Hola. No das muchos detalles, pero lo que comprendo es que la trama que envías debe ser 10 caracteres, si es menos o más debe informarte que el paquete de datos no es útil. ¿Estoy en lo correcto?

Si es así, en los sistemas de comunicación serial donde la trama debe tener cantidades fijas, lo que suele usarse es un temporizador que su desborde de tiempo debe ser mayor lo que dura los 8 bits más el bit de inicio y de parada. (generalmente 10 veces más)

Cuando llega el primer byte, arrancas el temporizador, a partir que llega el segundo y los siguientes reinicias el temporizador. También existe una variable que cuenta los bytes que van llegado.

Si en algún momento el temporizador llega a desbordarse, se asume que el paquete de datos está completo y ahí determinas por la variable contador si tienes tus 10 bytes o más o menos.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re:UART del STM32. Dudas de novato
« Respuesta #2 en: 14 de Diciembre de 2021, 16:22:30 »
Saludos al foro!

Me ha tocado por razones profesionales empezar a trabajar con los micros de la familia STM32.
La primera aplicación que estoy desarrollando lleva incorporada una recepción serie convencional (9600,n,8,1).
Se trata de un sistema que espera una cadena de comandos desde un PC y una vez recibida, la procesa y actúa en consecuencia. Todo muy convencional.
He escrito y depurado el código en el entorno STM32CubeIDE utilizando la función HAL_UART_Receive_IT y funciona todo correctamente.
El problema me ha surgido al intentar "proteger" la conexión frente a posibles errores. La cadena de comando que espera tiene una longitud determinada, pongamos por ejemplo 10 caracteres. SI le mando 10 caracteres todo funciona correctamente pero si le mando una cadena de longitud 8 no consigo detectar el error.

¿Alguna idea?

Gracias por anticipado!

Hola Picminor ,

En el stmcube funciona justo como indicas , queda a la espera de una longitud determinada , la función de recepción tiene la opción de timeout( lo mismo que indica DominusDRR) , no  he practicado lo suficiente pero puedes revisar la estructura de la función , me parece que llama un "callback en caso de no recibir en el tiempo indicado" .

saludos!

Desconectado PicMinor

  • PIC16
  • ***
  • Mensajes: 236
Re:UART del STM32. Dudas de novato
« Respuesta #3 en: 15 de Diciembre de 2021, 06:06:58 »
¡Gracias por las respuestas!

Lo del temporizador ya lo había investigado pero el "timeout" no lo lleva la función HAL_UART_Receive_IT cuya estructura es:

HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

Es decir, los parámetros son la UART, el buffer de recepción y el tamaño.

¿Cómo podría implementar un temporizador? Recordad que soy muy novato en esta familia de micros así que ponédmelo fácil por favor.

¡Gracias por anticipado!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:UART del STM32. Dudas de novato
« Respuesta #4 en: 15 de Diciembre de 2021, 07:00:27 »
¿Cómo podría implementar un temporizador? Recordad que soy muy novato en esta familia de micros así que ponédmelo fácil por favor.

Al recibir el primer caracter, activas un timer (con interrupcion habilitado)
Al recibir otro caracter, reinicias el timer.
Al recibir el último caracter si es que tenes alguno que defina el final, detenes el timer.

Si no tenes alguno que defina el final... Entonces:
En la interrupcion del timer, cuando entre aca, significa que no se envio mas ningun dato. Y se completo la transmision, aca detenes el timer.