STM32串口通信包括三种方式,阻塞模式、中断方式与DMA方式。
注:本笔记根据原文链接 https://blog.csdn.net/weixin_43646005/article/details/104616635,进行修改和总结。
一、以下为阻塞方式收发+中断接收
//定义变量
#define RX_MAX_COUNT 1000 //串口最大字节数
uint8_t txbuf[50];
__IO uint8_t rxbuf[RX_MAX_COUNT]={0};
//main函数里:
memcpy(txbuf,"串口发送测试\r\n",50);
HAL_UART_Transmit(&husart_debug, txbuf, strlen((char *)txbuf), 1000);
memcpy(txbuf,"串口接收测试\r\n",50);
HAL_UART_Transmit(&husart_debug, txbuf, strlen((char *)txbuf), 1000);
int n = 1;
while (n)
{
HAL_UART_Receive(&husart_debug, (uint8_t *)rxbuf, 100, 3000);
if (rxbuf[0] == 'g' && rxbuf[1] == 'o')
{
strcpy((char *)txbuf, "接收go成功\r\n开始下面的测试\r\n");
HAL_UART_Transmit(&husart_debug, txbuf, strlen((char *)txbuf), 1000);
HAL_UART_Receive_IT(&husart_debug, (uint8_t *)rxbuf, 5); //开启中断接收
n = 0;
break;
}
else
{
strcpy((char *)txbuf, "接收失败,重新发送\r\n");
HAL_UART_Transmit(&husart_debug, (uint8_t *)&txbuf,strlen((char *)txbuf), 1000);
}
记得在it.c中添加中断服务函数,才能进入回调函数
//stm32f4xx_it.c中
//名字是usart.h中宏定义的:#define DEBUG_USARTx_IRQHandler USART1_IRQHandler
void DEBUG_USARTx_IRQHandler(void)
{
HAL_UART_IRQHandler(&husart_debug); //husart_debug是句柄
}
//回调函数:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart==&husart_debug) //判断是指定的调试串口
{
// if (rxbuf[0] == 'u', rxbuf[1] == 'p')
if (rxbuf[0]== 'u' && rxbuf[1] == 'p')
{
printf(">> LED1_OFF; ------ LED1灭\r\n");
}
// if (rxbuf[0] == 'd', rxbuf[1] == 'o', rxbuf[2] == 'w', rxbuf[3] == 'n')
if (rxbuf[0]=='d'&& rxbuf[1] == 'o'&& rxbuf[2] == 'w'&& rxbuf[3] == 'n')
{
printf(">> LED2_OFF; ------ LED2灭\r\n");
}
HAL_UART_Transmit(&husart_debug, (uint8_t *)rxbuf, 5, 100);
HAL_UART_Receive_IT(&husart_debug, (uint8_t *)rxbuf, 5);
}
}
运行结果:
接着发送down:没反应
因为接收这里HAL_UART_Receive_IT(&husart_debug, (uint8_t *)rxbuf, 5); 是接收5个字符。可以自行进行修改。
二、
总结:HAL_UART_Transmit();HAL_UART_Receive();可以一次性收发多个数据。。。。