STM32HAL库使⽤中断实现串⼝接收不定长数据
  以前⽤DMA实现接收不定长数据,DMA的⽅法接收串⼝助⼿的数据,全部没问题,不过如果接收模块返回的数据,⽽这些数据如果包含回车换⾏的话就会停⽌接收,例如接收:AT\r\nOK\r\n,就只能接收到AT\r,导致没有接收完成,具体原因还没搞懂,有了解的,希望可以告知⼀下,DMA不定长接收⽅法传输门:。
  好了,不多说了,现在进⼊正⽂。⾸先建⽴⼀个STM32Cumebx的⼯程,打开串⼝中断,完成配置,具体的配置流程就不细说了,没什么难度就只是打开串⼝跟中断⽽已。
  ⽣成⼯程代码后,先定义好⼀些变量:
//串⼝4中断接收定义
#define MAX_RECV_LEN 1024        //设定可以接收的最⼤字节
uint8_t msg_buff[MAX_RECV_LEN] = {0}; //接收缓存区
uint8_t * msg = msg_buff;    //定义⼀个指针指向接收缓存区
int flag = 0;        //接收完成标志
int len_u4=0;  //数据长度记录
  接着重写串⼝接收回调函数
/*重写串⼝接收回调函数*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef*UartHandle)
{
uint8_t ret = HAL_OK;
msg++;
len_u4++;//数据长度计数
if( msg == msg_buff + MAX_RECV_LEN)
{
msg = msg_buff;
}
do
{
ret = HAL_UART_Receive_IT(UartHandle,(uint8_t *)msg,1);
}while(ret != HAL_OK);
if(*(msg-1) == '\n')  //接收以\n为结尾字符,则表⽰接收完成
{
flag  = 1;
}
}
  最后在main函数⾥⾯编写接收后的逻辑,注意要在while(1){ }前打开串⼝接收中断
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration----------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/
* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
 MX_DMA_Init();
  MX_USART3_UART_Init();
MX_UART4_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
/
/⾃⼰添加代码部分:while前打开串⼝中断接收
HAL_UART_Receive_IT(&huart4, (uint8_t *)msg, 1); //开启第⼀次中断
while (1)
{
/* USER CODE END WHILE *//* USER CODE BEGIN 3 */
//======⾃⼰添加代码部分=========
if (flag == 1)
{
printf("msg_buff = %s ;len = %d\r\n",msg_buff,len_u4);
       HAL_Delay(100); //加延时,保证接收到数据过长的时候,等待数据存⼊缓存区发送
HAL_UART_Transmit(&huart3,msg_buff, len_u4,100);    //将串⼝4接收到的数据通过串⼝3传出
memset(msg_buff, 0, sizeof(msg_buff));  //清空缓存区
// 指向接收缓存的头部
msg = msg_buff;
(&huart4)->pRxBuffPtr = msg;
flag = 0;
len_u4=0;//每次数据长度清0
}
HAL_Delay(10);
}
stm32怎么使用printf
//==============================
/* USER CODE END 3 */
}
  运⾏结果如下,效果正确
  谈谈串⼝RS232跟RS485:这两个串⼝除了逻辑电平不同外,还有传输距离也不同,如果对速度要求不⾼,传输距离要⽐较远的就⽤RS485⽐较好,虽然RS485是个半双⼯,但是抑制共模⼲扰能⼒⽐较强,不过这些只是对于硬件层⾯的,对于软件层⾯来说他们的本质都是串⼝,在STM32Cubemx中,都是只是配置为串⼝,按照串⼝的编程来处理即可。