连云港外贸网站建设,seo综合查询怎么关闭,广州建设行业信息网站,中山网站开发招聘文章目录 前言一、串口空闲中断二、DMA空闲中断接收不定长数据实现思路三、STM32Cubemx配置DMA空闲中断接收不定长数据四、代码编写总结 前言
本篇文章给大家讲解一下DMA串口空闲中断接收串口不定长数据#xff0c;之前我们也是讲解过串口接收不定长数据的#xff0c;那么本… 文章目录 前言一、串口空闲中断二、DMA空闲中断接收不定长数据实现思路三、STM32Cubemx配置DMA空闲中断接收不定长数据四、代码编写总结 前言
本篇文章给大家讲解一下DMA串口空闲中断接收串口不定长数据之前我们也是讲解过串口接收不定长数据的那么本篇文章的话将使用DMA来接收不定长数据。
一、串口空闲中断
串口空闲中断是指在串口接收到数据后在数据的传输结束之后在一段连续的空闲时间内没有接收到新数据时触发的中断。具体来说串口空闲中断会在以下情况下触发
1.数据传输结束 当串口接收到一个完整的数据帧后包括起始位、数据位、校验位和停止位数据的传输结束。
2.连续空闲时间 在数据传输结束后如果在一段连续的时间内通常是一个字节的时间即字符间的时间间隔串口没有接收到新的数据那么就会产生空闲中断。
串口空闲中断的触发时机提供了一个机会来检测数据帧的接收是否完整并且在数据帧之间的间隙中执行一些必要的操作比如处理接收到的数据、清理缓冲区或者进行其他后续处理。这种机制在串口通信中非常重要可以确保数据的准确传输和处理。
二、DMA空闲中断接收不定长数据实现思路
使用DMADirect Memory Access直接内存访问结合串口空闲中断可以实现串口接收不定长数据的主要原因是提高了数据接收的效率和灵活性。
在传统的串口接收数据方式中通常是通过串口中断来实现数据接收。但是当接收大量数据或者需要处理高速数据时使用中断方式会导致CPU频繁地响应中断影响系统的实时性和效率。
而使用DMA可以将串口接收到的数据直接存储到内存中减轻了CPU的负担提高了系统的性能。DMA能够在不需要CPU干预的情况下直接在外设和内存之间传输数据大大提高了数据传输的效率。
串口空闲中断则可以用来标志一帧数据的接收完成。当串口接收到一帧完整的数据后传输结束串口会进入空闲状态。利用空闲中断可以确定一帧数据的长度从而在DMA接收完一帧数据后触发空闲中断处理接收到的数据清理缓冲区并准备接收下一帧数据。
结合DMA和串口空闲中断可以实现高效地接收不定长数据。DMA负责高速数据的传输减少了CPU的负载而串口空闲中断用于标志数据帧的接收完成提供了灵活性和准确性。这种组合使得系统能够高效地处理不定长数据的接收同时保证了系统的实时性和性能。
三、STM32Cubemx配置DMA空闲中断接收不定长数据
添加DMA接收的功能
DMA接收是把外设发来的数据保存到内存中来所以是Peripheral To Memory。 其他STM32Cubemx的配置大家可以看上一篇文章DMA发送
四、代码编写
1.首先需要先使能 串口接收空闲中断函数
函数原型
HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
函数参数
huart指向 UART_HandleTypeDef 结构体的指针用于指定要配置的串口。 pData指向存储接收数据的缓冲区的指针。 Size要接收的数据的字节数。
函数返回值
返回 HAL_StatusTypeDef 类型的值表示函数执行的状态。可能的返回值包括 HAL_OK成功和其他错误代码如 HAL_ERROR。
函数作用
这个函数用于配置串口接收使其能够在接收到数据后等待空闲中断IDLE interrupt来标志数据帧的接收完成。 一旦串口接收到完整的数据帧即收到停止位后等待一段连续的空闲时间即在一个字节的时间内没有接收到新数据串口会产生空闲中断IDLE interrupt从而触发回调函数或中断服务例程标志着一帧数据的接收完成。
函数调用流程
在调用该函数后串口会开始接收数据并等待空闲中断的触发。 一旦接收到完整的数据帧并且在一段连续的空闲时间内没有接收到新数据串口会触发空闲中断。 在空闲中断触发后可以在空闲中断的回调函数或者中断服务例程中进行数据处理如拷贝接收到的数据到指定的缓冲区并进一步处理或者通知应用程序。
2.编写中断回调函数
当触发串口空闲中断时会调用到void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)。这个回调函数。
3.完整代码编写
在这个代码中我们在串口助手中发送LED ON和LED OFF来控制LED灯的打开和关闭。LED ON和LED OFF为不同长度的数据使用普通的串口接收方法来接收这个长度不定的数据是比较复杂的现在我们可以使用DMA空闲中断接收来解决这个问题。
uint8_t Rx_data[100] {0};//保存接收到的数据//空闲中断回调函数
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{if(huart-Instance USART1){if(strstr(Rx_data, LED ON) ! NULL){HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);}else if(strstr(Rx_data, LED OFF) ! NULL){HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);}HAL_UARTEx_ReceiveToIdle_IT(huart1, Rx_data, 100);}
}//接收到100字节会调用接收完成中断回调函数
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{if(huart-Instance USART1){HAL_UARTEx_ReceiveToIdle_IT(huart1, Rx_data, 100);}
}HAL_UARTEx_ReceiveToIdle_IT(huart1, Rx_data, 100);//开启接收功能总结
本篇文章就讲解到这里大家也可以自己写代码实际操作一下。