最近搞串口接收完整的数据帧,虽然很早就接触串口,但是工作上用还是会遇到不少问题。串口收包过程,首先要解决的问题就是要保证接收到完整的数据包,参考网上的串口收包方法,多数是使用定时器做超时判断,又或者加DMA之类的,考虑到我的串口只是做小数据量收发(收发指令),要额外使用一个定时器,就太复杂了。查资料过程中发现了串口空闲中断,故想空闲中断来接收串口数据帧。以下是空闲中断的参考demo: 参考:主函数 main.c /** ****************************************************************************** * @file main.c * @author Lewis * @version V1.0 * @date 2019-12-18 * @brief 调试函数PR的Demo ****************************************************************************** * @attention * Software Truestudio for STM32 */ #include "stm32f10x.h" #include "bsp_usart.h" #include "bsp_GeneralTim.h" #include "string.h" extern unsigned char data_buffer[256]; extern unsigned char rx_done; extern unsigned char rx_cnt; /** * @brief 主函数 * @param 无 * @retval 无 */ int main(void) { unsigned char i = 0; USART_Config(); // USART1 115200 8-N-1 // GENERAL_TIM_Init(); PR("IEM init done...rn"); // 开定时器 // TIM_Cmd(GENERAL_TIM, ENABLE); while(1) { if( rx_done == 1 ) { rx_done = 0; PR("UART RX done...rn"); PR("rx_cnt = %d.rn",rx_cnt); for( i = 0; i < rx_cnt; i++ ) { PR( "data_buffer[%d] = 0x%xrn", i, data_buffer[i] ); } // 清空数组 memset( data_buffer, 0x00, rx_cnt ); PR("---------------------------rn"); for( i = 0; i < rx_cnt; i++ ) { PR( "data_buffer[%d] = 0x%xrn", i, data_buffer[i] ); } USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE); PR("UART1 reopen done.rn"); } } } /*--------------------------------------------------------------------------------*/ 串口初始化部分: 略-就是常见的配置端口,波特率,开中断之类的 /*--------------------------------------------------------------------------------*/ // 串口中断服务函数 void USART1_IRQHandler(void) { // 接收中断 if( USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET ) { if( state == STATE_READY ) { state = STATE_START; // 串口计数清零 rx_cnt = 0; // 开启串口1空闲中断 USART1->CR1 |= (1<<4); // USART_ITConfig(USART1, USART_IT_IDLE, ENABLE); //开启串口1空闲中断 // 接收首字节 data_buffer[rx_cnt] = USART_ReceiveData(USART1); rx_cnt ++; }else if( state == STATE_START ) { data_buffer[rx_cnt] = USART_ReceiveData(USART1); rx_cnt ++; } // 清接收标志 } // 进入空闲中断 if( USART_GetITStatus(USART1,USART_IT_IDLE) != RESET ) { // 关闭空闲中断 USART1->CR1 &= ~(1<<4); // USART_ITConfig(USART1, USART_IT_IDLE, DISABLE); // 关闭串口1接收中断 USART1->CR1 &= ~(1<<5); // USART_ITConfig(USART1, USART_IT_RXNE, DISABLE); // 状态表明一帧数据接收完成了,需要处理。处理完以后再把接收中断打开 rx_done = 1; // 清除空闲中断 clear = USART1->DR; // 复位状态机 state = STATE_READY; } }
测试: hex 发送 11 22 33 44 55 66 [10:27:18.672]发→◇"3DUf□ [10:27:18.675]收←◆UART RX done... rx_cnt = 6. data_buffer[0] = 0x11 data_buffer[1] = 0x22 data_buffer[2] = 0x33 data_buffer[3] = 0x44 data_buffer[4] = 0x55 data_buffer[5] = 0x66 --------------------------- data_buffer[0] = 0x0 data_buffer[1] = 0x0 data_buffer[2] = 0x0 data_buffer[3] = 0x0 data_buffer[4] = 0x0 data_buffer[5] = 0x0 UART1 reopen done.
利用stm32串口空闲中断接收不定长数据
https://www.eemaker.com/stm32-uart-budingchangshuju.html
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算