HAL庫關於串列埠接收中斷接收不定長字元實現
1、IO口基本配置:
GPIO_InitStruct.Pin = CTR_UART4_TX; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate =GPIO_AF8_UART4; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Pin = CTR_UART4_RX; // GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate =GPIO_AF8_UART4; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); huart4.Instance = UART4; huart4.Init.BaudRate = 115200; huart4.Init.WordLength = UART_WORDLENGTH_8B; huart4.Init.StopBits = UART_STOPBITS_1; huart4.Init.Parity = UART_PARITY_NONE; huart4.Init.Mode = UART_MODE_TX_RX; huart4.Init.HwFlowCtl = UART_HWCONTROL_NONE;
2、初始化uart
if (HAL_UART_Init(&huart4) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } __HAL_UART_CLEAR_FLAG(&huart4,UART_CLEAR_TCF); //__HAL_UART_SEND_REQ(&huart4,UART_RXDATA_FLUSH_REQUEST); HAL_NVIC_SetPriority(UART4_IRQn, 0, 0); HAL_NVIC_EnableIRQ(UART4_IRQn); HAL_UART_Receive_IT(&huart4,Rxbuffer,1);//開啟接收中斷單位元組
3、中斷函式
HAL_UART_IRQHandler(&huart4);
4、呼叫回撥函式(此處是關鍵所在,接收緩衝區使用定義的陣列可以接收,使用定義的指標只能接收第一次字串,第二次字串無法覆蓋) if(Rxbuffer[count-1]=='\n') { do{ rec_f=HAL_UART_Receive_IT(&huart4,Rxbuffer,1); }while(rec_f==HAL_OK); status=1; count=0; } do{ rec_f=HAL_UART_Receive_IT(&huart4,&Rxbuffer[count],1); }while(rec_f==HAL_OK);