一、基础配置
Universal Asynchronous Receiver Transmitter
异步,串行,全双工
TTL电平 :高电平1 低电平0
帧格式: 起始位1bit 数据位8bit 校验位1bit 终止位1bit
NVIC Settings一栏使能接受中断。
之前有设置LCD,那么就自动给PA9和PA10设置引脚了。但如果没有设置,默认配置的是PC4和PC5。
二、串口发送
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t
Timeout)
功能:串口发送数据
参数:
UART_HandleTypeDef *huart UART句柄 huart1
uint8_t *pData 需要发送的数据
uint16_t Size 发送的字节数
uint32_t Timeout 最大发送时间,发送数据超时退出发送
案例:每次上电后发送 Hello World!
/* USER CODE BEGIN Includes */
#include "stdio.h" //使用sprintf()
#include "string.h" // 使用strlen()
/* USER CODE END Includes */
/* USER CODE BEGIN PV */
char tx_buf[20];
/* USER CODE END PV */
/* USER CODE BEGIN 2 */
sprintf(tx_buf,"Hello World!\r\n");
HAL_UART_Transmit(&huart1,(uint8_t*)tx_buf,strlen(tx_buf),50);
/* USER CODE END 2 */
三、串口接收
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
功能:串口中断接收函数
参数:
UART_HandleTypeDef *huart UART句柄 huart1
uint8_t *pData 接收到的数据存放地址
uint16_t Size 发送的字节数 为1,每次中断只能接收一个字符
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
功能:中断回调函数,串口中断接收完之后,会进入该函数。
这是一个空函数,用户可以重写该函数,在函数里实现相应的操作。
1. 接收单个字符
案例:接收到 O 时,点亮LED1并发送 LED1 Open! ,接收到 C 时,熄灭LED1并发送 LED1 Close!
char tx_buf[20];
uint8_t rx_data;
/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart1,&rx_data,1); //打开接收中断
/* USER CODE END 2 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(rx_data=='O')
{
ucled=0x01;
sprintf(tx_buf,"LED1 Open!\r\n");
HAL_UART_Transmit(&huart1,(uint8_t*)tx_buf,strlen(tx_buf),50);
}
if(rx_data=='C')
{
ucled=0x00;
sprintf(tx_buf,"LED1 Close!\r\n");
HAL_UART_Transmit(&huart1,(uint8_t*)tx_buf,strlen(tx_buf),50);
}
HAL_UART_Receive_IT(&huart1,&rx_data,1);
}
2. 接收定长字符串
void Uart_Proc(void)
{
if(rx_count==4)
{
if( strcmp(rx_buf,"LEDO")==0 )
{
ucled=0x01;
sprintf(tx_buf,"LED1 Open!\r\n");
HAL_UART_Transmit(&huart1,(uint8_t*)tx_buf,strlen(tx_buf),50);
}
if( strcmp(rx_buf,"LEDC")==0 )
{
ucled=0x00;
sprintf(tx_buf,"LED1 Close!\r\n");
HAL_UART_Transmit(&huart1,(uint8_t*)tx_buf,strlen(tx_buf),50);
}
rx_count=0;
memset(rx_buf,0,20);
}
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
rx_buf[rx_count++]=rx_data;
HAL_UART_Receive_IT(&huart1,&rx_data,1);
}
3. sscanf() 解析字符串
int sscanf(const char* str, const char* format, ...);
参数:
str:要解析的输入字符串。
format:格式字符串,指定要匹配的格式规则。
...:可变参数列表,用于接收解析后的数据。
void Uart_Proc(void)
{
//22个字符
if(rx_count==22)
{
//解析rx_buf,然后用三个参数接收数据
sscanf(rx_buf,"%4s:%4s:%12s",car_type,car_num,car_time);
sprintf(tx_buf,"car_type:%4s\r\n",car_type);
HAL_UART_Transmit(&huart1,(uint8_t*)tx_buf,strlen(tx_buf),50);
sprintf(tx_buf,"car_num:%4s\r\n",car_num);
HAL_UART_Transmit(&huart1,(uint8_t*)tx_buf,strlen(tx_buf),50);
sprintf(tx_buf,"car_time:%12s\r\n",car_time);
HAL_UART_Transmit(&huart1,(uint8_t*)tx_buf,strlen(tx_buf),50);
rx_count=0;
memset(rx_buf,0,20);
}
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
rx_buf[rx_count++]=rx_data;
HAL_UART_Receive_IT(&huart1,&rx_data,1);
}