串口收发数据
1. 配置
- 配置STM32CubeMX,“Asynchronous”为异步
Baud Rate的设置值要与首发设备相同(异步的条件)
如要使用中断则对NVIC进行配置
2. 发送函数
-
重要函数:
1
2
3
4
5//阻塞式发送函数(在发送过程中,暂停单片机,直到发送完毕)
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef*huart, //所要发送给的外设、串口
uint8_t *pDate, //指向发送数据的缓冲区
uint16_t Size, //发送多少字节的数据
uint32_t Timeout); //超时时间1
2
3
4
5//阻塞式发送函数(在发送过程中,暂停单片机,直到发送完毕)
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef*huart, //所要发送给的外设、串口
uint8_t *pDate, //指向发送数据的缓冲区
uint16_t Size, //发送多少字节的数据
uint32_t Timeout); //超时时间1
2
3
4//非阻塞式发送函数
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleYtpeDef *huart,
uint8_t *pDate,
uint16_t Size);1
2//发送完毕中断回调函数
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);1
2//发送一半中断回调函数
void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart); -
发送示例:
使用非阻塞式的串口发送函数,将发送缓数组dat_Txd中的前5个数据发送到USART1,在数据发送完成后,反转PB9引脚的输出电平。1
2
3
4
5
6
7
8
9
10
11
12HAL_UART_Transmit_IT(&huart1,dat_Txd,5);
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);
}
}
//另一种实现方案
HAL_UART_Transmit(&huart1,dat_Txd,5,10000);
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);
3. 接收函数
-
重要函数:
1
2
3
4
5//阻塞式接收函数(在接受到数据之前单片机会一直停滞,直到接收到数据)(不推荐)
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart,
uint8_t *pDate,
uint16_t Size,
uint32_t Timeout);1
2
3
4//非阻塞式接收函数(推荐)
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleYtpeDef *huart,
uint8_t *pDate,
uint16_t Size);1
2//接收完毕中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);1
2//接收一半中断回调函数
void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart); -
接收实例:
使用非阻塞式的串口接收函数,接收USART1中的一个字节,将其保存在dat_Rxd变量中,在数据发送完成后,若该字节为0x5A,则反转PB8引脚的输出电平。1
2
3
4
5
6
7
8
9
10
11uint8_t dat_Rxd=0;
HAL_UART_Transmit_IT(&huart1,&dat_Rxd,1); //放在main()函数里
void HAL_UART_RxCpltCallback(UART_HandleTypeDer *huart) //放在main()函数外
{
if(huart->Instance == USART1)
{
if(dat_Rxd == 0x5A) //此处0x5A表示16进制输入的5A
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);
}
}
这是跟随B站小蜜蜂老师的干货铺的【小蜜蜂笔记】基于STM32CubeMX的嵌入式开发基础教程所写的学习笔记。
此教程以应用为主,辅以简单的原理讲解,能够快速的上手STM32的开发。