当前位置: 首页 > news >正文

串口接收,环形缓冲区+解析

串口接收,环形缓冲区+解析

环形缓冲区存储结构体

#define RX_RING_SIZE 256typedef struct {uint8_t buf[RX_RING_SIZE];  // 实际存数据volatile uint16_t head;     // 写指针(中断在改),(volatile)防止编译器优化导致 中断/主循环不同步volatile uint16_t tail;     // 读指针(主循环在改)
} ring_buf_t;

初始化串口

void USART3_IRQHandler(void);//提前声明串口接收中断
void uart3_Init(u32 baud)
{          GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); 			RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);			GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; 			GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;				GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;				GPIO_Init(GPIOB,&GPIO_InitStructure); 				GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; 			GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;				GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;				GPIO_Init(GPIOB,&GPIO_InitStructure); USART_InitStructure.USART_BaudRate = baud;				USART_InitStructure.USART_WordLength = USART_WordLength_8b;		USART_InitStructure.USART_StopBits = USART_StopBits_1;			USART_InitStructure.USART_Parity = USART_Parity_No;			USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;		USART_Init(USART3, &USART_InitStructure); 	NVIC_InitStruct.NVIC_IRQChannel = USART3_IRQn;NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;NVIC_Init(&NVIC_InitStruct);//配置NVICUSART_Cmd(USART3, ENABLE);  					USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);	USART_ITConfig(USART3, USART_IT_ERR, ENABLE);BSP_IntVectSet(BSP_INT_ID_USART3,USART3_IRQHandler);BSP_IntEn(BSP_INT_ID_USART3);}

配置结构体

ring_buf_t rx_ring3 = {0, 0, 0};

串口接收中断(基础)

void USART3_IRQHandler(void)
{if (USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) {uint8_t ch = (uint8_t)USART_ReceiveData(USART3);uint16_t next = (rx_ring3.head + 1) % RX_RING_SIZE;// 如果缓冲区没满,存入 数据if (next != rx_ring3.tail) {rx_ring3.buf[rx_ring3.head] = ch;rx_ring3.head = next;}USART_ClearITPendingBit(USART3, USART_IT_RXNE);}
}

解析函数(放循环,阻塞等待)

void Extract_select_Data(void)//判断数据包
{static uint8_t state_r4 = 0;static uint8_t data_len_r4 = 0;static uint8_t count_r4 = 0;static uint8_t frame_buf[32];// 只要缓冲区里有数据,就一直处理while (rx_ring3.head != rx_ring3.tail) {// 1. 从环形缓冲区读取一个字节  uint8_t ch = rx_ring3.buf[rx_ring3.tail];rx_ring3.tail = (rx_ring3.tail + 1) % RX_RING_SIZE;switch (state_r4){case 0: // 等待帧头if (ch == 0x2A){frame_buf[0] = ch;count_r4 = 1;state_r4 = 1;}break;case 1: // 校验 CMDif (ch == 0x11){frame_buf[count_r4++] = ch;state_r4 = 2;}else{state_r4 = 0;   // CMD 不匹配,丢弃}break;case 2: // 校验 LENif (ch == 0x04){data_len_r4 = ch;frame_buf[count_r4++] = ch;state_r4 = 3;}else{state_r4 = 0;   // LEN 不匹配,丢弃}break;case 3: // 接收 DATA(4字节) + CRCframe_buf[count_r4++] = ch;// 1(2E) + 1(CMD) + 1(LEN) + 4(DATA) + 1(CRC) = 8if (count_r4 >= 8){/* ========= 业务判断 ========= */uint8_t byte6 = frame_buf[5]; // DATA2if (byte6 & 0x04)   // bit2 = 1{select_bit2_flag = 1;//解析结果BLE_TO_MCU_OK_FLAG=1;}else{BLE_TO_MCU_OK_FLAG=0;select_bit2_flag = 0;}/* ============================ */state_r4 = 0;   // 准备下一帧}break;default:state_r4 = 0;break;}}
}

清除缓存区

void RingBuf3_ClearAndResetParser(void)
{
//    __disable_irq();  // 关中断,保证原子性// 1. 清空环形缓冲区数据memset(rx_ring3.buf, 0, RX_RING_SIZE);// 2. 重置 head/tailrx_ring3.head = 0;rx_ring3.tail = 0;// 3. 重置解析器状态state_r3 = 0;count_r3 = 0;data_len_r3 = 0;pkg_ready = 0;//    __enable_irq();  // 重新使能中断
}
http://www.jsqmd.com/news/361759/

相关文章:

  • 价格、资源、安全如何平衡?高性价比商标转让平台排名揭秘 - 资讯焦点
  • AAAI 2026这篇杰出论文说了什么?用LLM给CLIP换了个“聪明大脑”
  • 分析适配具身智能的空间智能公司,北京地区哪家口碑好又靠谱 - 工业推荐榜
  • 新手如何建立网站?2026年主流建站步骤与工具全指南
  • P0926GH FBM224接线端子
  • 基于信息间隙决策理论的综合能源系统优化调度IGDT探索
  • Ab3d.PowerToys 12.0 Crack
  • 暴雨夜 3 小时寻回被困布偶猫:上海专业找猫团队救援实录,真实绝了 - 资讯焦点
  • 与学习相关的技巧(超参数的验证)
  • 非标机械设计中设备的三伤验证
  • P0926GU FBM230通信模块
  • 霍尔传感器:绿电追溯困局的破局之钥
  • 2026年2月随州招聘/随州找工作/随州进厂/随州劳务外包服务TOP5品牌深度评测与选型指南 - 2026年企业推荐榜
  • 六 非标设备项目
  • 318. Java Stream API - 深入理解 Java Stream 的中间 Collector —— mapping、filtering 和 flatMapping
  • 2026年期货量化交易文档编写_代码注释与文档规范
  • 不怕行业冷,就怕找不到厂!天下工厂400万数据库,覆盖所有细分赛道
  • 基于python的麻辣烫餐馆管理系统[python]-计算机毕业设计源码+LW文档
  • 2026年期货量化交易最佳实践_从开发到部署的完整流程
  • 四川旅游旅行社怎么挑?认准这家老牌国企!2026成都出境游、九寨沟旅游首选指南 - 深度智识库
  • 基于python的猫眼电影数据可视化分析系统[python]-计算机毕业设计源码+LW文档
  • 编写阅读助手APP,上传书籍/文章,自动生成阅读摘要,提取核心观点,好词好句,支持标注阅读笔记,还能记录阅读时间,生成阅读打卡日历,适合阅读爱好者。
  • 2026 东莞英语雅思培训教育机构推荐、雅思培训课程中心权威口碑榜单 - 老周说教育
  • 编写编程学习助手,根据用户编程水平(新手/入门/进阶),编程语言(python/Java/C++),推荐合适的学习课程,练习题,项目,生成编程学习计划,还能在线运行代码。
  • PHP 8.x时代:性能、类型安全与开发者体验的革命性飞跃
  • 2026年期货量化交易代码重构_提升代码质量的实践方法
  • AI编程经验总结
  • 基于python的路面缺陷监测系统[python]-计算机毕业设计源码+LW文档
  • 【瑞芯微平台实时Linux方案系列】第三十八篇 - 瑞芯微平台实时Linux网络中断优化方案
  • 2026年期货量化交易单元测试_策略代码质量保障