STM32F103C8T6跑485半双工老丢帧,快被搞疯了

STM32 · 潘东 · 8 浏览
各位同行大佬,求指点。我们一台小型PLC扩展模块,用的STM32F103C8T6,跟外面仪表走RS485半双工,9600波特率,Modbus RTU。最近一个月陆续有客户反馈通讯偶发丢帧,比例不大,大概几百帧掉一帧,但现场有个工艺是连续读流量计,掉一帧就得重来,产线停一下,客户那边已经催了三次了。 我这边排查过:485芯片换过两批,AB端加了120Ω终端电阻,屏蔽线单点接地,软件上DE使能前后都加了延时,收发切换用的是中断里拉GPIO。示波器看AB波形没明显畸变,但发现STM32发完最后一字节,DE拉低那个时刻偶尔和停止位尾部重叠,怀疑是USART的TC标志处理时机问题。规格书上第3页那个时序参数我对着看了半天,也没完全吃透。 想问下有没有朋友遇到过类似情况?是不是得改成TC中断里再关DE,还是说F1系列USART在低速下本身有坑?有勘误表相关经验也求分享,谢谢!

回答(1)

你这情况我见过,八成是TC标志用错了。发完最后一字节,要等USART的TC真正置位再拉低DE,别用TXE,TXE是发送寄存器空,最后一个字节可能还在移位寄存器里没出去,DE一拉低就把停止位尾巴切了,偶发丢帧就是这么来的。 先改一处:发送完成中断里判TC,置位后再拉低DE,拉低前可以再插个几十微秒的死区。另外再确认两点:一是DE拉低后至少等1个字节时间再开接收,防止总线冲突;二是看下你的485芯片使能脚有没有RC延时,有些片子使能响应慢,软件时序得留余量。 先改TC这一处,九成能好。
崔健 · 2026-11-04