1、本文档为个人原创 2、遇到的兆讯MH1902S-UART FIFO丢失数据问题,为实战项目的具体解决方案。 3、文档中详细记录了相关信息:问题描述、分析过程、相关代码片段 4、文档中的代码片段经验证是OK的,仅供参考 ### 兆讯MH1902S-UART FIFO丢失数据问题分析 #### 一、问题背景及描述 本文档详细记录了一个实战项目中遇到的兆讯MH1902S-UART FIFO丢失数据的问题及其解决方案。该问题发生在使用兆讯MH1902S-UART与蓝牙模块进行通讯过程中,在进行压力测试时发现通讯不稳定的现象。 **具体表现为:** - 在进行蓝牙通讯压力测试过程中,使用手机与蓝牙模块配对,并通过手机向蓝牙模块发送64字节的随机数。 - 蓝牙模块(即MH1902S)接收到数据后立即回传同样的64字节数据。 - 手机接收回传数据并与原发送数据进行对比。 - 如果数据一致,则继续发送新的随机数;如果不一致,则停止发送数据。 在这一过程中,随机地出现了数据丢失现象,导致蓝牙通讯不稳定。数据丢失的具体原因在于兆讯MH1902S-UART的FIFO(先进先出队列)存在数据丢失的情况。 #### 二、问题分析 **MH1902S-UART配置情况:** - 波特率:115200 bps - 数据位:8位 - 奇偶校验:无 - 停止位:1位 - FIFO配置:开启,Rx/Tx阈值设置为1/4满,未使用DMA传输。 **调试分析过程:** - 在调试时,启用了UART的Receiver Line Status Interrupt (ELSI)中断功能,以便在出现异常时可以获取到状态信息。 - 当出现数据丢失时,读取LSR寄存器(Line Status Register)的值为0x63。 - 根据MH1902S芯片手册中的描述,该值表示“Overrun Error”位被置1,意味着当FIFO已有数据等待处理时,新的数据到来但无法存储,导致新数据被丢弃。 - 进一步分析发现,接收中断有时会出现滞后的情况,即当FIFO中的数据量达到设定阈值后,MH1902S-UART未能及时产生中断并处理数据。 - 结果导致FIFO溢出,新到达的数据被丢弃,进而影响蓝牙通讯的稳定性。 #### 三、解决方案 **解决办法:** - 在发送数据时进行分包处理,确保每次发送的数据量不超过16字节(与MH1902S-UART的FIFO大小相匹配)。 - 当发送的数据不足16字节时,按照实际长度发送。 - 通过这种方式,确保每个数据包都能够被FIFO正确处理,避免数据丢失。 #### 四、代码实现 下面是针对MH1902S-UART配置的代码示例: ```c static int mh1902_uart_startup(struct bluetooth_device *port, unsigned int baudrate, unsigned int parity) { UART_TypeDef *UART = (UART_TypeDef *)port->regaddr; UART_InitTypeDef UART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; UART_FIFOInitTypeDef UART_FIFOInitStruct; // 配置UART的基本参数 UART_InitStructure.UART_BaudRate = baudrate; UART_InitStructure.UART_Parity = parity; UART_InitStructure.UART_StopBits = UART_StopBits_1; UART_InitStructure.UART_WordLength = UART_WordLength_8b; UART_Init(UART, &UART_InitStructure); // 配置FIFO UART_FIFOInitStruct.FIFO_TX_TriggerIntEnable = ENABLE; UART_FIFOInitStruct.FIFO_DMA_Mode = UART_FIFO_DMA_Mode_0; UART_FIFOInitStruct.FIFO_RX_Trigger = UART_FIFO_RX_Trigger_1_4_Full; UART_FIFOInitStruct.FIFO_TX_Trigger = UART_FIFO_TX_Trigger_1_4_Full; UART_FIFOInitStruct.FIFO_Enable = ENABLE; UART_FIFOInit(UART, &UART_FIFOInitStruct); // 设置中断优先级 NVIC_SetPriorityGrouping(NVIC_PriorityGroup_0); NVIC_InitStructure.NVIC_IRQChannel = port->irqno; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); // 开启接收中断 UART_ITConfig(UART, UART_IT_RX_RECVD, ENABLE); return 0; } ``` #### 五、总结 通过对兆讯MH1902S-UART FIFO丢失数据问题的深入分析和解决,我们可以得出以下结论: - 在使用兆讯MH1902S-UART进行通讯时,需要特别注意其FIFO配置及性能限制。 - 当进行大量数据传输时,必须采取有效的分包策略来避免数据丢失。 - 通过本案例的学习,可以更好地理解如何在实际项目中有效利用硬件资源,优化通讯协议,提高系统的稳定性和可靠性。 通过对该问题的详细解析与实践解决,不仅能够帮助工程师们更好地应对类似的技术挑战,还能够在一定程度上提升整个团队的技术水平和项目成功率。
- 粉丝: 28
- 资源: 38
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- java医院人事管理系统源码数据库 MySQL源码类型 WebForm
- 道路养护病害数据集-含原图和标签
- 2023-04-06-项目笔记 - 第三百一十九阶段 - 4.4.2.317全局变量的作用域-317 -2025.11.16
- 2023-04-06-项目笔记 - 第三百一十九阶段 - 4.4.2.317全局变量的作用域-317 -2025.11.16
- 1503ANDH1503002016_20241116222825
- 时间序列-黄金-15秒数据
- C#HR人事管理系统源码数据库 MySQL源码类型 WebForm
- C#CS餐饮管理系统源码数据库 SQL2008源码类型 WinForm
- 蛾类识别系统(深度学习+UI可视化)
- 时间序列-黄金-5秒数据