HAL库中串口发送的重要函数
参数:串口指针,发送的数据指针,数据大小,超时限制
·阻塞式发送函数(初学者推荐使用)
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart,
uint8_t *pData,
uint16_t Size,
uint32_t Timeout);
·非阻塞式发送函数(类似于中断)
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart,
uint8_t *pData,
uint16_t Size,);
·发送完毕中断回调函数(数据发送完成后需要执行的操作)
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);
举例
使用非阻塞式的串口发送函数,将发送数组dat_Txd中的前5个数据发送到PC端,在数据发送完成后,反转PB5引脚的电平。
HAL_UART_Transmit_IT(&huart1,dat_Txd, 5); //dat_Txd 是数字,直接写名,不用加&
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
}
}
阻塞式
HAL_UART_Transmit(&huart,dat_Txd,5,10000);
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
HAL库中串口接受的重要函数
阻塞式接收
参数:串口指针,存放数据地址指针,数据大小,等待实践
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart,
uint8_t *pData,
uint16_t *Size,
uint32_t Timeout);
举例:HAL_UART_Receive(&huart1,revbuf,sizeof(revbuf),HAL_MAX_DELAY);
只有当接收到大小为sizeof(revbuf)的信号,才往下执行。
中断式接收
参数:串口指针,存放数据地址指针,数据大小
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart,
uint8_t *pData,
uint16_t *Size,);
·接受完毕中断回调函数(数据接受完成后需要执行的操作)
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
举例
使用非阻塞式的串口接收函数,接收USART1中的一个字节将其保存在dat_Rxd变量中,在数据发送完成后,若该字节为0x5A,则翻转PB8引脚的输出电平。
HAL_UART_Transmit_IT(&huart1,&dat_Txd, 1); //dat_Txd是变量,取地址
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)
{
if(dat_Txd == 0x5A)
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
}
}
}
实战运用
[1]开机后,向串口1发送"hello world"
[2]串口1收到字节指令"0xA1",打开LED1,发送“LED1 Open”
[3]串口1收到字节指令"0xA2",关闭LED1,发送“LED1 Closed”
[4]串口发送过程中,打开LED2作为发送数据指示灯
1.CubeMX 配置
选择异步通讯;
波特率9600;数据长度8bit;无校验位;停止位1bit;
可以接受和发送
NVIC中断打开
2.MDK编辑
定义数组变量:
uint8_t Tx_str1[] = "Hello world!\r\n";
uint8_t Tx_str2[] = "LED! Open\r\n";
uint8_t Tx_str3[] = "LED! Closed\r\n";
复位后,UART外设发送Hello word 至PC端,串口助手显示 Hello word ;
UART外设准备时刻接受PC端发出的数据
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);
HAL_UART_Transmit(&huart1,Tx_str1,sizeof(Tx_str1),10000);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);HAL_UART_Receive_IT(&huart1,&Rx_dat,1);
找到回调函数,然后在主函数中编辑
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1) //判断是不是串口1
{
//编写需要执行的内容
}
}
相当于当UART接收到PC端发送的数据时,跳进中断,实施该中断中的回调函数
按复位键,串口助手显示 helloword
发送a1,绿灯亮,串口助手显示LED! Open
发送a2,绿灯灭,串口助手显示LED! Closed
注意!!!!16进制✔,不选发送新行!!!!