[STM32] La biblioteca HAL implementa la redirección del puerto serie en tres pasos (copia de código disponible)

Tabla de contenido

Paso 1: agregue archivos de encabezado de entrada y salida estándar

Paso 2: Reescribe la función fputc()

Paso 3: Reescribe la función fgetc()

Resumen de código (para uso de copia directa) : requerido para copia directa


Al desarrollar un programa en lenguaje C en una PC, podemos usar la función de salida formateada printf() del lenguaje C para enviar el resultado de ejecución del programa a la pantalla de visualización, o usar la función de entrada formateada scanf() para leer los resultados del teclado Información ingresada. En el desarrollo de sistemas integrados, también esperamos poder enviar los resultados de la ejecución o la información de depuración del programa a la PC para su visualización, y leer la información ingresada por el teclado para lograr una buena interacción humano-computadora.

La función de transceptor de puerto serie proporcionada por la biblioteca HAL tiene funciones relativamente simples y no puede realizar entradas y salidas formateadas. Si desea implementar una función de entrada y salida formateada similar al lenguaje C, debe redirigir la salida de la función printf() y la entrada de la función scanf() al puerto serie.

El método de implementación específico es el siguiente: el usuario escribe una función con el mismo nombre que la función de biblioteca estándar del lenguaje C, y cuando el enlazador comprueba que el usuario ha escrito una función con el mismo nombre que la función de biblioteca estándar, utilizará la función escrita por el usuario primero, para realizar la función de biblioteca estándar Modificación indirecta de (la función del mismo nombre en la función de biblioteca estándar se define con el atributo débil).

Dado que la función printf() realiza la salida de datos llamando a la función fputc(), y la función scanf() realiza la entrada de datos llamando a la función fgetc(), el usuario necesita reescribir estas dos funciones para realizar la redirección de el puerto serie

Antes de redirigir, debe configurar el puerto serie y utilizar el modo de sondeo del puerto serie.

Nota: dado que la función printf() y la función scan() son funciones de biblioteca estándar del lenguaje C proporcionadas por el software MDK, después de completar la escritura del programa, el usuario también debe seleccionar la pestaña "Objetivo" en la ventana de configuración del proyecto MDK software La opción "Usar MicroLIB" en él. Si la opción "Usar MicroLIB" no está marcada, no se puede usar.

Paso 1: dado que las funciones printf() y scanf() se llaman en el programa principal, se debe agregar el archivo de encabezado de entrada y salida estándar: stdio.h.

/* USER CODE BEGIN Includes*/

#include <stdio.h>// 包含标准输入输出头文件

/* USER CODE END Includes*/

Paso 2: Reescribe la función fputc()

int fputc(int ch,FILE *f)

{

//采用轮询方式发送1字节数据,超时时间设置为无限等待

HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,HAL_MAX_DELAY);

return ch;

}

Nota: dado que el parámetro de entrada ch es una variable entera y el parámetro de entrada pdata de la función HAL_UART_Transmit() es un puntero a un tipo de carácter sin signo, se requiere una conversión de tipo forzada para convertir int a uint8_t*.

HAL_MAX_DELAY significa espera infinita, que se puede modificar, por ejemplo, a 1000.

Paso 3: Reescribe la función fgetc()

int fgetc(FILE *f)

{

uint8_t ch;

// 采用轮询方式接收 1字节数据,超时时间设置为无限等待

HAL_UART_Receive( &huart1,(uint8_t*)&ch,1, HAL_MAX_DELAY );

return ch;

}

Nota: Al llamar a la función scanf() para leer los datos del puerto serie, se debe usar un espacio como final de la entrada. Por lo tanto, al ingresar datos en el asistente de depuración del puerto serie, debe terminar con un espacio y luego hacer clic en el botón enviar, de lo contrario, los datos no se pueden recibir correctamente.

La función scanf() solo puede aceptar cadenas sin espacios. Si el usuario necesita recibir una cadena con espacios, primero debe recibir byte por byte. Durante el proceso de recepción, se determina si la cadena ha sido recibida evaluando continuamente si los caracteres '\r' y '\n' son recibió. En este momento, después de ingresar una cadena de caracteres completa en el área de envío del asistente de depuración del puerto serie, presione la tecla "ENTRAR" en el teclado como final

Resumen del código (copiar y usar directamente):

#include <stdio.h>// 包含标准输入输出头文件

int fputc(int ch,FILE *f)
{
//采用轮询方式发送1字节数据,超时时间设置为无限等待
HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,HAL_MAX_DELAY);
return ch;
}
int fgetc(FILE *f)
{
uint8_t ch;
// 采用轮询方式接收 1字节数据,超时时间设置为无限等待
HAL_UART_Receive( &huart1,(uint8_t*)&ch,1, HAL_MAX_DELAY );
return ch;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_45015121/article/details/129718556
Recomendado
Clasificación