1、串行接口相关知识点
-
并行通讯、串行通讯。
-
单工、半双工(RS485)、全双工。
-
异步串行通信:通信双方在没有同步时钟的前提下,将一个字符(包括特定的附加位)按位进行传输的通信方式。
-
波特率:每秒钟传输的二进制位数,如9600bps。
-
TTL电平<—->RS232:MAX3232 SP3232 串口<———>USB接口:CH340 CP2012
STM32芯片的串口UASRT功能十分强大,但对于日常编程而言,使用最多的还是异步串行通信。
-
串口1:USART1TX与PA9复用,USART1RX与PA10复用。
-
串口2:USART2TX与PA2复用,USART2RX与PA3复用。
2、HAL库中串口发送的重要函数
/*阻塞式发送函数*/
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart,uint8_t *pData,uint16_t Size, uint32_t Timeout);
/* 参数1:huart,串口实例的指针。
参数2:*pData,待发送数据缓冲区的指针。
参数3:Size,待发送数据的字节数。
参数4:Timeout,超时时间值。
返回值:HAL_StatusTypeDef,函数执行状态。*/
/*非阻塞式发送函数*/
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart,uint8_t *pData, uint16_t Size);
/* 参数1:huart,串口实例的指针。
参数2:*pData,待发送数据缓冲区的指针。
参数3:Size,待发送数据的字节数。
返回值:HAL_StatusTypeDef,函数执行状态。*/
串口发送完毕中断回调函数
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart); //常用
void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart)
3、HAL库中串口接收的重要函数
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
/* 参数1:huart,串口实例的指针。
参数2:*pData,数据接收据缓冲区的指针。
参数3:Size,待接收数据的字节数。
参数4:Timeout,超时时间值。
返回值:HAL_StatusTypeDef,函数执行状态。*/
//非阻塞式接收函数(推荐使用)
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart,uint8_t *pData,uint16_t Size);
/* 参数1:huart,串口实例的指针。
参数2:*pData,数据接收据缓冲区的指针。
参数3:Size,待接收数据的字节数。
返回值:HAL_StatusTypeDef,函数执行状态。*/
串口接收完毕中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);
4、案例
【1】开机后,向串口1发送“hello world!”。
【2】串口1收到字节指令“0xA1”,打开LED1,发送“LED1 Open!”。
【3】串口1收到字节指令“0xA2”,关闭LED1,发送“LED1 Closed!”。
4.1、宏定义:
/*宏定义参数*/
uint8_t TX_str1[]="hello word!\r\n";
uint8_t TX_str2[]="led1 no!\r\n";
uint8_t TX_str3[]="led1 yes!\r\n";
uint8_t TR_dat= 0;
/*宏定义引脚*/
#define led1_on() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_11,GPIO_PIN_SET);
#define led1_off() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_11,GPIO_PIN_RESET);
#define led2_on() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12,GPIO_PIN_SET);
#define led2_off() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12,GPIO_PIN_RESET);
4.2、重写串口接收完毕中断回调函数:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart->Instance ==USART1)
{
if (TR_dat == 0XA1)
{
led1_on();
led2_on(); //打开灯
HAL_UART_Transmit(&huart1,TX_str2,sizeof(TX_str2),10000);
led2_off();
HAL_UART_Receive_IT(&huart1,&TR_dat,1);
}
else if (TR_dat==0XA2)
{
led1_off();
led2_on(); //打开灯
HAL_UART_Transmit(&huart1,TX_str3,sizeof(TX_str3),10000);
led2_off();
HAL_UART_Receive_IT(&huart1,&TR_dat,1);
}
}
}
4.3、在mian()函数中添加以下代码:
MX_GPIO_Init(); //端口初始化
MX_USART1_UART_Init(); //串口初始化
/* USER CODE BEGIN 2 */
/*通过串口向电脑发送halle word*/
led2_on(); //打开灯
HAL_UART_Transmit(&huart1,TX_str1,sizeof(TX_str1),1000); //通过从串口发送hello word
led2_off(); //关闭灯
//通过电脑串口助手向单片机发送控制指令
/*串口1收到字节指令“0xA1”,打开LED1,发送“LED1 Open!”。
串口1收到字节指令“0xA2”,关闭LED1,发送“LED1 Closed!”。*/
HAL_UART_Receive_IT(&huart1,&TR_dat,1); //此函数的作用在回调函数中查看