完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
串口发送数据的过程中,会中间停几毫秒,导致PLC触发了MODBUS的T3.5,数据接收不对,
1、一开始用的是freemodbus,查看后发现是轮询发送,后来改为不用freemodbus,直接发。情况依旧 2、把其余线程都关掉,情况依旧 3、把发送改为DMA,情况依旧, 请问下能有什么办法让他中间不断 注:红框内的,应该是连续的,但是断开了,串口助手的超时时间是10ms |
|
相关推荐
1个回答
|
|
|
我们分析一下问题:在串口发送数据的过程中,中间会停顿几毫秒,导致MODBUS的T3.5超时(T3.5是MODBUS协议中帧间超时,通常为3.5个字符时间),从而数据接收不正确。 已经尝试的方法: 1. 一开始使用freemodbus(轮询发送),问题存在;改为直接发送,问题依旧。 2. 关闭其他线程,问题依旧。 3. 改用DMA发送,问题依旧。 注意:从串口助手看到的数据,红框内应该是连续的数据,但是断开了,而串口助手的超时时间是10ms。 可能的原因: 1. 发送数据时,数据被分成多个包发送,每个包之间有时间间隔。 2. 发送过程中有中断或高优先级任务打断了发送。 3. 硬件问题或驱动问题。 虽然已经尝试了关闭其他线程和改用DMA,但问题依旧,说明可能不是由其他任务或中断(软件层面)导致的,也可能是硬件或驱动层面的问题。 建议的排查步骤: 1. **检查发送函数**:确认发送函数是否会将数据分成多个小包发送?例如,如果发送缓冲区较小,可能会分段发送。查看发送函数内部实现。 2. **检查串口配置**:确认串口的波特率、数据位、停止位等配置是否正确。特别是,确认波特率设置是否准确(可以使用示波器检查实际波特率)。 3. **检查流控**:是否启用了硬件流控(RTS/CTS)?如果启用了,可能是流控信号导致发送暂停。 4. **使用示波器或逻辑分析仪**:这是最直接的方法,通过测量串口TX引脚上的波形,可以精确看到每个字符之间的时间间隔。如果发现字符之间有较大的间隔,那么可以确定是发送端的问题。 5. **检查DMA配置**:虽然使用了DMA,但DMA传输也可能被中断(比如DMA传输完成中断处理不及时,或者DMA被其他更高优先级的外设占用)。但通常DMA是硬件完成传输,不应有太大延迟。 6. **检查中断优先级**:如果使用了中断,确保串口中断优先级足够高,不会被其他中断长时间阻塞。 7. **检查系统时钟配置**:系统时钟配置是否正确?特别是串口使用的时钟源是否稳定? 8. **降低波特率测试**:尝试降低波特率(比如从9600到1200),看是否仍然出现停顿。如果降低波特率后停顿消失,可能是系统处理能力不足或中断延迟导致。 9. **检查MODBUS协议实现**:确认T3.5超时时间设置是否正确?T3.5超时时间应该是3.5个字符传输时间。例如,在波特率为9600时,一个字符(包括起始位、8位数据、停止位,共10位)的传输时间是1/9600*10≈1.04ms,则T3.5=3.5*1.04≈3.64ms。如果串口助手设置的超时是10ms,那么超过3.64ms的间隔就会被MODBUS认为是帧结束。所以,如果发送过程中有两个字符之间的间隔大于3.64ms,就会触发T3.5超时。 10. **发送连续数据**:尝试发送一个较长的连续数据(比如100个字节),观察在发送过程中是否在某个固定位置出现间隔?如果是,可能是发送缓冲区大小限制,或者发送函数内部有分块。 11. **检查是否使用了操作系统**:如果使用了RTOS,检查任务堆栈是否足够,以及任务优先级设置是否合理。 12. **直接寄存器操作**:如果可能,尝试用最简单的轮询方式(不使用DMA,也不使用中断)发送一个数据包,看是否仍然有间隔。这样可以排除DMA和中断的影响。 根据问题描述,已经尝试了直接发送和DMA,并且关闭了其他线程,问题依旧。那么重点可以放在: - 硬件连接问题(如线路干扰,但可能性较小) - 串口外设配置问题(比如发送使能、时钟使能等) - DMA配置问题(比如DMA传输模式、传输完成中断等) 一个可能的解决方向:确保在发送整个MODBUS帧的过程中,禁止任务切换(如果使用RTOS)或禁止所有中断(临界区保护),然后连续发送整个帧。这样就不会被其他中断打断。 但是,在DMA传输过程中,CPU可以执行其他任务,而DMA传输本身不应该被打断(因为是硬件传输)。所以使用DMA时出现间隔,可能是由于DMA传输被分成了多个事务(比如设置了DMA最大传输长度),或者DMA传输完成中断处理中重新配置DMA的时间过长。 具体操作建议: 1. **使用单次DMA传输整个帧**:确保DMA配置为一次性传输整个数据帧,而不是分成多个块。检查DMA的配置,比如DMA缓存区大小是否足够,是否配置了循环模式(应该禁用循环模式)。 2. **在DMA传输前关闭中断,传输完成后再打开中断**:虽然这可能会影响系统的实时性,但可以测试是否是因为中断导致DMA传输被延迟。 3. **检查DMA传输的触发方式**:是否在启动DMA后,外设(串口)就立即开始发送?还是需要等待触发条件? 4. **使用中断发送**:尝试使用中断发送(非DMA),但中断发送时,在发送整个帧的过程中,提升发送中断优先级,并关闭其他中断(或使用临界区)。 5. **使用轮询发送**:在发送整个帧的过程中,禁用中断,然后用轮询方式逐个字节发送。这样可以保证连续发送。 示例代码(轮询发送,禁用中断): ```c void USART_SendData(USART_TypeDef* USARTx, uint8_t *pData, uint16_t len) { // 进入临界区(禁止中断) __disable_irq(); while (len--) { // 等待发送缓冲区为空 while (!(USARTx->SR & USART_SR_TXE)); USARTx->DR = *pData++; } // 等待最后一次传输完成(可选,确保最后一个字节发送完成) while (!(USARTx->SR & USART_SR_TC)); // 退出临界区(使能中断) __enable_irq(); } ``` 注意:这种方法在发送期间会阻塞系统,但可以保证发送的连续性。 如果使用HAL库,也可以考虑在发送前调用__HAL_DISABLE_INTERRUPTS,发送后再开启。 6. **检查是否有硬件复位或看门狗复位**:在发送过程中是否有复位发生? 7. **电源问题**:电压不稳定导致单片机工作异常? 8. **更换硬件**:如果有可能,更换一个串口模块或单片机测试,以排除硬件故障。 由于问题描述中已经尝试了多种方法,所以需要逐步缩小范围。建议优先使用示波器检查波形,以确定问题的确切位置。 在串口发送数据过程中出现中间停顿几毫秒的问题,导致MODBUS的T3.5超时(通常为3.5个字符传输时间),以下是可能原因和解决方案的详细分析: 根本原因分析
针对性解决方案1. 确保数据连续发送(关键步骤)
2. 优化系统配置
3. MODBUS协议层调整
4. 硬件诊断
验证步骤
总结建议
通过上述方法,可消除发送过程中的异常间隔,解决MODBUS超时问题。如仍不生效,需结合示波器进一步诊断硬件时序。 |
|
|
|
|
只有小组成员才能发言,加入小组>>
184个成员聚集在这个小组
加入小组rtstudio是否可像keil加载ini解决虚拟串口与mcu串口通讯?
1212 浏览 0 评论
【Vision Board创客营连载体验】基于RA8D1-Vision Board的自动路径规划小车
1776 浏览 1 评论
【Vision Board创客营连载体验】基于Vision Board的垃圾分类
2156 浏览 0 评论
【Vision Board创客营连载体验】使用 Vision Board 做一个 UVC Camera
1777 浏览 0 评论
【Vision Board创客营连载体验】TinyMaix进行手写数字识别
2006 浏览 0 评论
1464浏览 5评论
在RT-Thread Studio中新建的stm32f407-atk-explorer工程运行qemu失败,是什么原因引起的?
1766浏览 3评论
为什么rt_device_read()只能读取到两个字节数据?
363浏览 3评论
连得上热点,但是ping baidu.com出现timeout,请问跟什么有关?
421浏览 3评论
420浏览 2评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 22:17 , Processed in 0.557288 second(s), Total 77, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
338
