在STM32中编写串口通信数据收发有三种方式:轮询模式(阻塞方式),中断模式(非阻塞方式)以及DMA模式。
一. 串口通信(轮询模式)
打开STM32CubeMX创建工程,选择STM32F103C8芯片。
设置RCC,设置高速外部时钟HSE 为外部时钟源。
配置时钟。
开始配置串口。(这里暂时不使用中断以及DMA模式就先不去配置)
Baud Rate可以设置的波特率有:9600、19200、38400、57600、115200 Bit/s等。
传输数据长度可以设置为:8 / 9 Bit
停止位可以设置为:1 / 2 Bit
设置好之后,设置存储路径,选择所用IDE,然后点击GENERATE CODE创建工程,open project打开工程进行全局编译。
二. HAL库中串口收发的重要函数(轮询模式)
1. HAL_UART_Transmit();
HAL库中串口发送函数,使用超时管理机制,如果超时没发送完成,则不再发送,返回超时标志(HAL_TIMEOUT)
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
@参数 huart,串口实例的指针。 指向UART_HandleTypeDef结构体的指针,该结构体包含指定UART模块的配置信息。
@参数 pData,待发送数据缓冲区的指针。
@参数 Size,待发送数据的字节数。
@参数 Timeout,超时时间值。
@返回值 函数执行状态
2. HAL_UART_Receive();
HAL库中串口接收函数,使用超时管理机制,如果超时没接收完成,则不再接收,返回超时标志(HAL_TIMEOUT)
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
@参数 huart,串口实例的指针。 指向UART_HandleTypeDef结构体的指针,该结构体包含指定UART模块的配置信息。
@参数 pData,数据接收据缓冲区的指针。
@参数 Size,待接收数据的字节数。
@参数 Timeout,超时时间值。
@返回值 函数执行状态
以上两个函数均在stm32f1xx_hal_uart.c中,在该文件中找到
HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
与
HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
三. 实现串口收发通信(轮询模式)
在main.c文件中main函数while中写入
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_UART_Transmit(&huart1,txbuff,sizeof(txbuff),1000);
HAL_Delay(1000);
HAL_UART_Receive(&huart1,&rxbuff,sizeof(rxbuff),1000);
if(rxbuff == 0xaa){
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET); // LED小灯熄灭
}else{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET); // LED小灯点亮
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
在Private variables区域下USER CODE BEGIN PV注释对中写入
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
unsigned char txbuff[] = "hello world\r\n";
unsigned char rxbuff = 0;
/* USER CODE END PV */
将开发板通过USB转TTL模块连接到电脑上,在电脑上打开串口调试软件,选择串口号,设置串口通讯波特率为115200Bit/s,数据位为8,停止位为1,打开串口。连接通后,可以发现数据以每一秒正常被发送到了串口调试助手中,以HEX模式发送aa数据给开发板,开发板上的灯也被熄灭了,说明开发板也可以接收到串口调试助手发送来的数据。