1. 程式人生 > >HAL庫關於串列埠接收中斷接收不定長字元實現

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);