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);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? void?HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart);
HAL库中串口接收的重要函数
阻塞式发送函数 HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart,uint8_t*pData,uint16_t Size,uint32_t Timeout); 非阻塞式发送函数(推荐使用) HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart,uint8_t *pData, uint16_t Size); 发送完毕中断回调函数 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart); (发送推荐阻塞式不用回调(事件多则用非阻塞),接收用非阻塞。 )
任务描述:
(1)开机后,向串口1发送“hello world! ”。
(2)串口1收到字节指令“OxA1”,打开LED1,发送“LED1 Open ! ”。
(3)串口1收到字节指令“OxA2”,关闭LED1,发送“LED1 Closed ! ”。
(4)在串口发送过程中,打开LED2作为发送数据指示灯。
代码展示:
#include "main.h"
#include "usart.h"
#include "gpio.h"
#define LED1_ON() HAL_GPIO_WritePin(GPIOD,GPIO_PIN_3,GPIO_PIN_SET);//开关灯宏定义
#define LED1_OFF() HAL_GPIO_WritePin(GPIOD,GPIO_PIN_3,GPIO_PIN_RESET);
#define LED2_ON() HAL_GPIO_WritePin(GPIOD,GPIO_PIN_4,GPIO_PIN_SET);
#define LED2_OFF() HAL_GPIO_WritePin(GPIOD,GPIO_PIN_4,GPIO_PIN_RESET);
uint8_t Tx_str1[]= "hello world\n\r";
uint8_t Tx_str2[]= "led1 open!\n\r";
uint8_t Tx_str3[]= "led1 close!\n\r";
uint8_t Rx_dat = 0;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)//回调函数
{
if(huart->Instance == USART1)
{
if(Rx_dat == 0xa1)//接收到‘a1’led1打开led2闪烁一次
{
LED1_ON();
LED2_ON();
HAL_UART_Transmit(&huart1,Tx_str2,sizeof(Tx_str2),10000);
LED2_OFF();
HAL_UART_Receive_IT(&huart1,&Rx_dat,1);
}
else if(Rx_dat == 0xa2)//接收到‘a2’led1关闭led2闪烁一次
{
LED1_OFF();
LED2_ON();
HAL_UART_Transmit(&huart1,Tx_str3,sizeof(Tx_str3),10000);
LED2_OFF();
HAL_UART_Receive_IT(&huart1,&Rx_dat,1);
}
}
}
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
LED1_ON(); //复位led1闪烁
HAL_UART_Transmit(&huart1,Tx_str1,sizeof(Tx_str1),10000);
LED1_OFF();
HAL_UART_Receive_IT(&huart1,&Rx_dat,1);
/* USER CODE END 2 */
}
usart使用方法可在“stm32fqxx_hal_uart.c”文件中的##### How to use this driver #####里找到使用函数方法。
但是目前串口只能发送一次数据,代码还在修改ing... ?
|