公司项目中用到了WIFI模块,需要与云端通信,用到了串口空闲中断+DMA,再次做个记录!
CubeMX配置如下:
串口中断服务程序添加如下代码:
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
if(RESET != __HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE)) //判断是否是空闲中断
{
__HAL_UART_CLEAR_IDLEFLAG(&huart1); //清除空闲中断标志
HAL_UART_DMAStop(&huart1); //停止本次DMA传输
data_length = sizeof(WIFI_ReceiveBuff) - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx); //计算接收到的数据长度
HAL_UART_Receive_DMA(&huart1, (uint8_t*)WIFI_ReceiveBuff, sizeof(WIFI_ReceiveBuff)); //重启开始DMA传输
}
/* USER CODE END USART1_IRQn 1 */
}
主程序while(1)前 不要忘记 使能中断,添加如下代码
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);//串口空闲中断 使能
HAL_UART_Receive_DMA(&huart1, (uint8_t*)WIFI_ReceiveBuff, sizeof(WIFI_ReceiveBuff));
在处理函数中添加如下代码
if(data_length != 0 )//串口空闲中断将data_length赋值
{
if(Wifi_CheckCRC16(wifi_data,8))//CRC校验正确
{
id = wifi_data[0];
cmd = wifi_data[1];
reg_addr = (wifi_data[2]<<8) | wifi_data[3];
len = (wifi_data[4] << 8) | wifi_data[5];
switch(cmd)
{
case 0x03://云端给终端单片机要数据
SendDataToWifiClud(312,445,521);
break;
case 0x06://云端给终端单片机写数据(设置)
break;
}
}