制作网站网页设计,河南省住房和城乡建设厅官方网站,百度推广时间段在哪里设置,可以做微网站的第三方平台有哪些原理
STM32实现串口接收不定长数据#xff0c;主要靠的就是串口空闲#xff08;idle#xff09;中断,此中断的触发条件与接收的字节数无关#xff0c;只有当Rx引脚无后续数据进入时#xff08;串口空闲时#xff09;#xff0c;认为这时候代表一个数据包接收完成了主要靠的就是串口空闲idle中断,此中断的触发条件与接收的字节数无关只有当Rx引脚无后续数据进入时串口空闲时认为这时候代表一个数据包接收完成了在此时中断对数据进行分析处理即可。
实现
具体实现方式就是使用HAL库的扩展函数写在main函数里
HAL_UARTEx_ReceiveToIdle_DMA(huart2,DATE,50);
Ex 代表扩展idle代表空闲中断
参数指针地址变量一次性能接受的最大长度一般是数组长度 接下来重写回调函数
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
这个RXEvevtCallback与之前的RXCpltCallback,一个重要区别就是多了一个入参Size
因为之前都是已知数据长度但RXEvevtCallback用于接收不定长数据所以用Size来确认到底有几个数据来发送 与接收数据相同的 字节数。
来看整体代码
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{if(huart huart2){HAL_UART_Transmit_DMA(huart2,DATE,Size);HAL_UARTEx_ReceiveToIdle_DMA(huart2,DATE,50);}
}
注意1
这里要养成好习惯: 确定 是通道二 之后再执行操作。
注意2
使用DMA时会出现 “过半传输中断” 的情况即数据传输一半便会 调用回调函数。
所以要 把他关闭。
用这段代码关闭。
__HAL_DMA_DISABLE_IT(hdma_usart2_rx,DMA_IT_HT);
参数指针地址要关闭的中断
所以刚才的代码应该是
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{if(huart huart2){HAL_UART_Transmit_DMA(huart2,DATE,Size);HAL_UARTEx_ReceiveToIdle_DMA(huart2,DATE,50);__HAL_DMA_DISABLE_IT(hdma_usart2_rx,DMA_IT_HT);}
}
别忘了程序开始时也要关闭噢。 MX_GPIO_Init();MX_DMA_Init();MX_USART2_UART_Init();/* USER CODE BEGIN 2 */HAL_UARTEx_ReceiveToIdle_DMA(huart2,DATE,50);__HAL_DMA_DISABLE_IT(hdma_usart2_rx,DMA_IT_HT);