干设备联网和工业通讯这行,串口 DTU 是绕不开的一环。我印象最深的一次,是在一个泵站做数据采集,现场几台流量计全是 RS485 接口,控制室离现场快三百米,普通网线和串口线都没戏,最后给每台设备旁边加了一个串口 DTU,靠 4G 把数据送到云端。从那时候起我就知道,搞懂 RS232/RS485 怎么接入 DTU,比死记一堆协议更有用。这篇内容不是教科书,是结合现场经验把串口 DTU 的来龙去脉、接线方式、调试流程和踩坑记录完整梳理一遍。想搞远程设备数据采集、PLC 远程维护、传感器联网的新手,或者被现场杂症折腾过的老手,都值得花十分钟读完。
1. 串口DTU是什么:先搞清楚它在干什么
1.1 一个现场场景引出DTU的定义
DTU 全称是 Data Transfer Unit,数据传输单元。串口 DTU 的活很简单:把 RS232/RS485 接口收到的串口数据,封装成 TCP/IP 网络包,通过 4G、以太网或 WiFi 发到远端服务器;反过来,服务器下发的网络数据也原样拆包成串口字节,送到设备。它不解析你的业务协议,不处理 Modbus 报文内容,只做搬运,所以叫“透传”。
在设备工程师眼里,DTU 相当于一段“串口到网口”的透明管道。但硬件是有电气边界的:RS232 和 RS485 是两种完全不同的物理层标准,DTU 的串口侧必须按对应标准收发信号。为什么工业现场特别依赖 DTU?因为大多数工业设备没有网口,只有串口。电表、水表、PLC、变频器、温湿度变送器,出厂标配基本都是 RS485 或者 RS232。这些设备分布在厂区、野外、杆塔上,一台台拉专线不现实,用 DTU 走 4G 是最省事的联网方案。
1.2 “透明传输”背后隐含的设计思想
“透明”这两个字很多人觉得玄。其实你可以直接理解成传真:在这头放一张纸,那头出来一模一样的纸,传真机不关心纸上是合同还是图纸,也不检查内容。DTU 也一样,不关心你的数据是 Modbus RTU 还是自定义协议。这个特性在设计上非常重要:后台的协议栈不用改,串口那边还是老设备,中间多了一个 DTU,对两端来说都是透明的。
但透明不等于无脑。有些 DTU 会在透明传输基础上加注册包、心跳包、自定义服务器地址切换等功能。注册包是 DTU 连接服务器成功后主动发的标识数据,用来让服务器识别“这是哪一台设备”;心跳包是为了保活 TCP 连接,防止长时间没数据被 NAT 或者运营商链路断开。这些属于增值功能,不是透传本身。如果你只是做局域网里的串口转发,这些功能通常用不上,但在 4G 公网场景里必须留意,否则设备上线一会儿就被踢下线,这个问题我后面会细说。
1.3 串口DTU的常见形态与典型应用
市面上的串口 DTU 大致分三类。第一类是工业级独立 DTU,金属壳、导轨安装、宽电压输入,带 SIM 卡槽和天线,适合现场固定安装;第二类是嵌入式 DTU 模块,小板子,直接焊到用户主板上,通过 AT 指令或者串口配置,适合设备厂家集成;第三类是串口服务器,本质也是网络转串口,但有线以太网居多,有些带 4G,适合在机房或者厂区组网。形态不同,选型逻辑也不同。
典型应用场景我这几年都遇到过。水利环保监测:分布在河道、水库的监测终端用 485 总线汇集数据,再由 DTU 走 4G 上报。PLC 远程维护:出差少跑现场,用 DTU 做远程透传,从远端连上 PLC 的编程口改程序。无人售货设备:自动售货机、充电桩通过 DTU 连接云端管理平台。农业物联网:大棚里的温湿度、土壤传感器用 485 串联到 DTU,平台定时轮询。这些场景共同点是:设备位置分散,现场没有可靠的以太网,但需要实时或准实时上云,4G DTU 天生就干这个。
2. RS232与RS485:接入DTU前必须搞懂的电气特性
2.1 RS232:点对点的全双工电平标准
RS232 是串口通信里最老的标准,很多台式机主板上还留着 COM 口。它的电气定义是单端信号,发送端把逻辑 1 表示为 -3V 到 -15V,逻辑 0 表示为 +3V 到 +15V,接收端在 ±3V 范围内判定。这个电平比 TTL 的 0/3.3V 高不少,目的是提高抗干扰能力,代价是传输距离做不长,标准规定一般不超过 15 米。
DB9 接口的引脚定义要记牢:2 脚 TX、3 脚 RX、5 脚 GND,这是设备端的常见定义。转换线和 DTU 的公母头容易搞混,你只要记住“2 发 3 收、5 接地”就行。接设备时如果是直连线就逐针对应,如果是交叉线就得把 2 和 3 对调,具体看 DTU 说明书。RS232 是全双工,可以同时收发,不支持多点,只能点对点。现在 RS232 在工业现场主要出现在老仪表、老 PLC 和调试口上,凡是超过 15 米或者要挂多台设备的场景,基本都转 RS485 了。
2.2 RS485:差分信号撑起的多点远距离组网
RS485 是工业现场的主力。它用差分信号传输,一对双绞线 A 和 B,数据靠 A 与 B 之间的电压差来表示:A 比 B 高 200mV 以上判为逻辑 1,B 比 A 高 200mV 以上判为逻辑 0。接收芯片判的是电压差,不是对地电压,所以外界共模干扰只要不超出芯片的共模输入范围(常见是 -7V 到 +12V),就不会影响数据。这就是 485 能传 1200 米、能扛住电机变频器干扰的根本原因。
RS485 是半双工,同一时刻只能发或者只能收,靠收发芯片的 DE/RE 引脚切换方向。典型芯片是 MAX485、SP3485。多点能力靠芯片的负载能力决定,早期标准是总线上最多 32 个单位负载,现在很多芯片做到了 64、128 甚至 256 节点,但实际使用别满打满算,我见过标称 128 节点实际挂二三十台就不稳的现场,问题往往出在线材质量、分支长度和终端电阻上。
这里必须提醒一个容易踩的坑:RS485 的 A、B 不要叫“正负”或者“+/-”。虽然很多设备说明书上标着 D+、D-,但按 RS485 标准,A 对应同相端,B 对应反相端,接反了数据就是反的。现场接线我习惯以 DTU 和设备两侧的说明书为准,A 对 A、B 对 B,不要凭线皮颜色认。
2.3 选型对照:现场到底用RS232还是RS485
用一张表可以快速判断:
| 对比项 | RS232 | RS485 |
|---|---|---|
| 信号方式 | 单端对地 | 差分信号 |
| 传输距离 | 一般≤15米 | 可达1200米 |
| 通信方式 | 全双工 | 半双工 |
| 节点数量 | 点对点 | 32/64/128等 |
| 电平范围 | ±3V~±15V | A-B压差≥200mV |
| 典型接口 | DB9 | A/B两根线 |
| 抗干扰能力 | 一般 | 强 |
| 应用场景 | 调试口、近距离仪表 | 工业多站点组网 |
选型逻辑很简单:距离短、设备少、需要同时收发的用 RS232;距离远、设备多、现场干扰大的,一定要用 RS485。在 DTU 接入这个语境里,90% 的现场是 RS485。原因不只是距离,还因为 RS232 只能带一个设备,你想挂三台仪表就得三个串口,而 DTU 的串口数量是有限的。一条 485 总线串起来挂十几台设备,对 DTU 来说只占一个串口,这是最省资源的组网方式。另外注意,不少 DTU 的同一个串口支持 RS232/RS485 切换,选型时一定要看清楚切换方式,是拨码开关还是配置项,后面实操部分我会再讲这个坑。
2.4 电平转换电路与半双工方向控制的几个细节
如果你自己画板子、自己接 TTL 转 485,有几个细节我必须提醒。
第一个是方向控制。SP3485 这类芯片的 DE 和 RE 是方向脚,高电平发送、低电平接收。最简单的方案是 MCU 用一个 GPIO 控制 DE,先拉高发完再拉低收。讲究省 IO 的电路会用自动换向电路,常见做法是用三极管或者 MOS 管搭一个由 TX 驱动的 DE 控制:串口空闲时 TX 为高,MOS 管导通把 DE 拉低进入接收;发数据时 TX 变低,DE 被拉高进入发送。这种电路在波特率不高的时候好用,但要注意时序。
第二个是关于“MOS 搭建的硬件 RS485 自收发电路在 230400 波特率下是否有问题”。我实测过,230400 波特率下一个 bit 时间是 1/230400,约 4.34 微秒;一个字节按 10 bit 算约 43.4 微秒。如果自动换向电路里的 RC 时间常数偏大,比如延迟到几个微秒,发送的第一个字节的头几位就可能被切掉,接收端解析出来就是乱码。实测下来,自动换向电路在 115200 以下基本稳,上到 230400 就不好说了。要么换专用自动换向芯片,要么老老实实用 GPIO 控制 DE。这是个真实存在的性能边界,不是玄学。
第三个是终端电阻。RS485 总线特性阻抗是 120 欧,只在总线两端各接一个 120 欧终端电阻,不能每个节点都接,否则负载太重会把信号拖垮。后面组网章节我再详细算这个。
3. RS232/RS485接入DTU的实操指南:从接线到透传跑通
3.1 认识DTU上的串口接口与引脚定义
先从外观说起。典型工业 DTU 正面会有:SIM 卡槽、4G 天线座、电源端子、状态指示灯、一个或多个串口端子。串口有的做成 DB9(RS232),有的做成可插拔接线端子(RS485),有的一个口同时支持 232/485,靠拨码开关切换或者配置工具设置。
RS232 的 DB9 引脚定义再强调一遍:2 脚 TX、3 脚 RX、5 脚 GND。DTU 是数据设备还是终端设备,不同厂商定义不一样,直接看说明书最稳妥。RS485 端子则是 A、B 两个核心接线位,有些还带 GND 位,这个 GND 是做信号参考地用的,不是必须接,但在长距离和干扰大的场合强烈建议接。电源端子注意 DC 5~36V 宽压还是 12~24V 固定压,工业现场我一般选 24V 供电,和仪表电源统一,省一路电源。
还有一个细节:很多 DTU 的 RS485 口是两线半双工设计,不带 RTS;RS232 是三线全双工。配置时它们共享一个逻辑串口,但物理接口不同。如果一台 DTU 同时标了 RS232 和 RS485 两个口,通常意味着有两路独立串口,配置时要注意每一路的波特率、数据位、停止位、校验位是独立设置的,别一路配好了另一路用默认值,结果接上去又是乱码。
3.2 485传感器接入DTU的接线步骤与共地问题
接 485 传感器,步骤不复杂,但每步都有讲究。
第一步,确认传感器侧接口。传感器一般是四线制或者五线制:电源正、电源负、A、B,有些还带屏蔽层。先把传感器供电单独接好,注意传感器启动电流峰值,别把 24V 电源直接拉垮,尤其多台传感器共用一路电源时,要预算总功率。
第二步,接信号线。A 对 A、B 对 B。单独接一台传感器时,就把 DTU 端子的 A 和传感器 A 用一根双绞线连上,B 对 B。屏蔽层如果设备有屏蔽地,单端接地;没有就空着,不要两端都接大地,否则会形成地环路,反而引入干扰。
第三步,把 DTU 的 GND 和传感器/485 总线的 GND 连通。这一步很多人会忽略。虽然 485 是差分信号,但 A、B 的电压是相对收发芯片参考地算出来的。两地之间电位差超过共模范围就会烧芯片,可以是瞬时的,先表现为数据乱码,最后芯片彻底损坏。长距离场景只接 A、B 不接 GND,数据偶尔乱一下,大多数时候能跑,但现场一旦有变频器启动就会随机丢包。你可以用万用表量一下 DTU 侧 A 对 B 的电压,正常空闲状态大约在 -1V 到 -5V 之间,如果接近 0V,多半是没共地或者 A/B 反了。
第四步,确认波特率等参数一致。传感器默认波特率常见 9600、19200、115200。DTU 的串口参数必须和传感器完全一致,否则全是乱码,这时候问题不在 DTU,而在参数。
3.3 电脑端调试环境的搭建
搞 DTU 调试离不开电脑。现在笔记本没有原生串口,得用 USB 转串口工具。常见芯片是 CH340、FTDI、CP2102。CH340 的驱动名叫 CH340 或者 CH340G/CH340X,Windows 下插上就能识别成 COM 口;FTDI 的驱动名叫 FTDI VCP 或者 FTDI Serial,稳定性和兼容性最好;CP2102 也不错,Linux 内核自带驱动。
装好驱动后在设备管理器里看端口号,比如 COM5。COM 口号超过 10 的时候,部分老软件可能识别不正常,可以在设备管理器里手动改到 COM3 之类,这是老经验了。调试工具首选串口调试助手,基本功能我要求:能设波特率、数据位、停止位、校验位,支持十六进制发送和显示,能定时发送,能保存日志。这类软件网上一抓一大把。我的习惯是先把 USB 转串口的 TX 和 RX 短接,打开串口后发一串数据,能自发自收就说明驱动和线缆没问题,再接 DTU。自环测试能帮你把“串口线坏了”这个变量直接排除。
补充一个非常重要的习惯:涉及二进制协议时,串口调试助手一律用 HEX 显示。文本显示会把 0x0D、0x0A、转义字符等隐藏掉,你看到的是假象。用十六进制显示才能看到真实字节,这个习惯能救你很多次。
还有一个虚拟串口软件常被提到。它的作用是在电脑里创建一对虚拟串口,一端接你的程序,一端接串口调试助手。当你想把网络 TCP 数据导入成串口字符流模拟测试时,虚拟串口非常有用。调试 DTU 透传时,我习惯在服务端用网络调试助手开 TCP Server,在电脑上再用串口调试助手接 USB 转 485,这样能直接看到链路两端的数据,快速判断问题出在 DTU、网络还是服务器。
3.4 DTU参数配置与透传测试全流程
DTU 配置常见三种方式:串口 AT 指令、厂商配置工具、网页配置。工业 DTU 大多数提供 Windows 配置工具,有些支持内置网页。先把 DTU 的串口接到电脑 USB 转串口,用串口调试助手打开对应 COM 口,波特率一般出厂默认 9600 或者 115200。在调试助手里输入 AT 指令,比如 AT\r\n,收到 OK 就说明串口通路正常。
接下来要配置的核心参数是:工作模式(透传)、串口波特率、数据位、停止位、校验位、网络类型(4G 或以太网)、服务器地址和端口、传输协议(TCP 或 UDP)、是否有注册包和心跳包。4G DTU 还要确认 SIM 卡是否已激活、天线是否接好,可以在设备管理页面看到信号强度,比如 CSQ 值,一般大于 10 就比较稳,低于 5 就基本没法稳定传输。
透传测试的完整流程我平时是这样跑的。
第一步,服务器侧开一个网络调试助手,创建 TCP Server,监听比如端口 8888。
第二步,DTU 配置好服务器 IP 和端口,工作模式设为永远在线,重启 DTU。等 DTU 上线后,服务器端会看到一条 TCP 连接,有些 DTU 会立刻发注册包,比如“BOX001”。
第三步,服务器端发送一段测试字符串,比如“ping”,同时看 DTU 的串口侧有没有吐出这串字符。反过来,在 DTU 串口侧用串口调试助手发“AT”,看服务器端收没收到。两端能互通,说明透传链路通了。
第四步,接上真实传感器,用服务器的网络调试助手发一条 Modbus RTU 指令,比如读温湿度:01 03 00 00 00 02 C4 0B。这条指令的格式是地址 01、功能码 03、起始寄存器 0000、寄存器数量 0002、CRC 校验 C4 0B。如果传感器正常,服务器端会收到类似 01 03 04 00 64 00 64 51 2F 的数据,其中 00 64 就是十进制的 100,对应温度 20 摄氏度、湿度 50%。看到这串数据,说明你的 RS485 接入和 DTU 透传全部打通了。
如果只是做本地调试,也可以不配 DTU,直接用 USB 转 485 连传感器,在电脑上用串口调试助手发指令测传感器本身是否正常。这样做能隔离故障范围:传感器正常、串口线正常,DTU 才有必要被怀疑。
3.5 一个完整的现场案例:Modbus RTU设备通过DTU远程读取
举一个实际做过的例子。农业大棚里有温湿度传感器,Modbus RTU 协议,默认波特率 9600、地址 01。现场没有网,传感器输出是 RS485 两线。配置一台 4G DTU,把传感器 A/B 接到 DTU 的 RS485 端子,DTU 电源用 24V 开关电源。
DTU 配置工具里设置:串口波特率 9600、8 数据位、1 停止位、无校验;工作模式设为透明传输;服务器地址填云平台的固定 IP 或域名,端口 6001;启用注册包,注册包内容填设备编号 DZ-001;心跳包时间设为 60 秒。云平台上开一个 TCP 监听程序,确认收到 DZ-001 注册包后,按规则定时向 DTU 发送读指令 01 03 00 00 00 02 C4 0B。
第一次调试遇到的问题是服务器发指令过去,传感器没反应。排查步骤:先在现场用笔记本 USB 转 485 直接连传感器,发同样的指令,能正常返回,说明传感器没问题。再看 DTU,发现配置工具里串口模式选错了,默认是 RS232,实际接的是 RS485。改过来后重启,再发一次指令,数据回来了。这个错是新手最容易犯的,DTU 的 RS232/RS485 模式切换不是自动的,一定要看拨码或配置项,别默认它自己会判断。
再补充一个多设备场景。大棚里挂了 8 个传感器,地址分别是 01 到 08。接线采用菊花链:电源和 A/B 线从 DTU 端子引出,先到 1 号传感器,再从 1 号引出到 2 号,以此类推,最后在末端(8 号)并联一个 120 欧终端电阻。每台传感器地址用厂家工具改,不能重复。平台轮询时按地址逐个发指令,互不干扰。实测 8 个节点、9600 波特率下,轮询一轮不到 500 毫秒,稳定运行半年没掉过线。
4. 串口调试中的常见问题与排查技巧实录
4.1 接上设备后完全没数据
踩得最多的坑,按概率排:A/B 接反、没有共地、DTU 串口模式选错。A/B 接反表现为设备发送方向完全收不到,或者偶尔能收到乱码。用万用表量 A 对 B 电压,空闲状态应该稳定在一个负电平,如果量出来是正电平,大概率接反了,把 A/B 对调再试。没有共地表现为数据时好时坏,尤其在电机启动或者空调压缩机动作时掉包,这个要补接 GND 线。
还有一类情况是 DTU 串口模式和实际接线不匹配。比如明明接的是 RS485 线,DTU 拨码却在 RS232 模式,或者配置工具里串口类型选错。这类问题最容易漏,因为外观看不出来。我的习惯是拿到新 DTU 先做一遍自环测试:把 DTU 的 TX/RX 短接(RS232 模式)或 A/B 短接(RS485 模式),在串口调试助手里自发自收,能收到说明 DTU 的串口通路没问题。再接到设备上,就能把“DTU 坏了”这个变量排除掉。
还有一种情况是设备本身是四线制 485,比如 T+ T- R+ R-。需要自己接成两线半双工:把 T+ 和 R+ 并一起连 A,T- 和 R- 并一起连 B。如果只接了其中一对,数据就收不到。接完后用万用表测 A/B 之间的静态电压,两线制正常空闲应该有个负偏压,通常在 -1V 到 -5V 范围,有些高负载总线可能更接近 0V,但不会是明显正电压。
4.2 数据乱码与字节丢失
乱码的第一原因是参数不匹配。串口通信四要素:波特率、数据位、停止位、校验位,任何一项不一致,都不会出现“部分正常”,而是整帧乱码。修改后两端都要重启,不要只改一端。这个排查最简单,但也最容易被忽略,因为配置界面一眼扫过去全是默认值,很可能 DTU 是 9600 8N1,传感器却是 19200 8E1。
第二原因是干扰。485 走差分信号,抗干扰强,但不是随便走线都行。现场布线如果和动力电缆平行走几十米,又没有屏蔽层,数据就会偶发错误。解决办法是换成双绞屏蔽线,单端接地,远离变频器输出电缆。我在一个包装车间就遇到过:输送线电机一启动数据就是 FF FF FF,电机停了就正常,后来把 485 线换成屏蔽线、单端接地,再没犯过。
第三原因是电平裕量不够。总线挂太多节点、分支太长、终端电阻加太多,都会让信号幅度下降,表现为距离近没事、距离远就乱。用示波器看 A/B 波形是最直接的办法:标准波形是清晰的差分翻转,边沿陡峭;如果波形圆头圆脑、上升沿爬坡,就是总线负载太重或者线太差。简单处理:去掉多余终端电阻,分支控制在 1 米以内,必要时降低波特率到 9600。很多工程师觉得自己项目必须上 115200,其实工业轮询 9600 绰绰有余,稳定比速度重要。
4.3 RS485多站点组网的规则与终端电阻
485 组网的核心规则是“手拉手”,也就是菊花链。从 DTU 出发,A/B 线逐台串过每台设备,最后一台接终端电阻。绝对不能星形拓扑,也就是从一个节点分出三根岔路,因为分支线会产生反射信号,长距离时尤其明显。星形拓扑的反射会让总线上的波形严重畸形,低速可能没事,高速必挂。
终端电阻放两端。只有总线两端需要 120 欧,中间节点不接。如果只在一端接了 120 欧,反射消一半,距离短可能没感觉,距离长就会发现数据偶尔错。判断方法:用万用表量总线空闲状态的电阻,规范的总线在两端都接电阻时,A/B 之间量出来约 60 欧,因为两个 120 欧并联。如果量出来是 120 欧,说明只有一端接了;如果量出来是几十欧以下,可能多个节点误接了电阻。
关于节点数量,别把芯片标称当成实际可用数量。芯片标 32、64、128 是指单位负载,如果设备输入阻抗偏低,实际能挂的数量要打折。我建议一条总线最多挂 20 台以内,超过 20 台就分两条总线或者加 485 中继器。中继器本质是把总线分成两段,各自加终端电阻,这样能同时突破距离和节点限制。
4.4 Linux和嵌入式环境下的串口丢数据处理
服务端如果用 Linux 收串口数据,丢数据是很常见的问题。第一个原因是内核串口缓冲区太小,数据量一大,应用层还没来得及 read,新数据就把旧数据顶掉了。解决办法是调大内核串口缓冲,或者用更及时的读取策略。第二个原因是驱动默认的 FIFO 触发水平低,可以在驱动里调整 FIFO 大小和中断触发阈值。第三个原因是应用层用了阻塞读、一次读一个字节,效率太低,正确做法是一次性 read 一块数据,比如 512 字节,处理完再读。
嵌入式这边,STM32 的串口建议开 DMA。不开 DMA 时,中断里一个字节一个字节往接收缓存搬,波特率越高 CPU 越吃紧。用 DMA 加空闲中断可以实现不定长接收:DMA 循环接收,串口空闲中断里判断一帧结束。实测 115200 波特率、每包 100 字节,丢包率可以做到 0,CPU 占用率比中断搬运低一半以上。这里说的“空闲中断”是很多系列芯片都有的 IDLE 标志,注意看芯片手册。
还有一个高频问题:USB 转串口在 Linux 下的权限。插上 CH340 或 FTDI 设备后,默认设备节点是 /dev/ttyUSB0,普通用户没权限打开。解决办法是加 udev 规则,比如在 /etc/udev/rules.d/99-serial.rules 里写 KERNEL=="ttyUSB[0-9]*", MODE="0666",然后重新插拔设备。如果你在安卓板子上做 U 转串口,思路一样,应用层 open 时要确认权限不对导致打开失败。
4.5 RS485防护电路设计要点
如果你自己画硬件,485 口不加保护就是给自己埋雷。最简单的保护三件套:TVS 管、PTC 自恢复保险丝、共模电感。TVS 管放在 A/B 对地和对之间,用来吸收静电和浪涌;PTC 做限流保护;共模电感滤掉共模干扰。雷击多的户外场合,还要加气体放电管,或者直接用隔离 485 芯片。
隔离是另一个维度。如果总线两地电位差大,比如一个设备在楼上、一个在楼下,打雷或者零线漂移导致的地电位差超过共模范围,芯片就会烧。隔离 485 芯片内部带磁耦隔离,把系统地和总线地彻底分开,成本高个十几块,但能省下无数售后。室外用的 4G DTU,485 口也建议选带隔离方案的型号。
关于 230400 波特率自动换向电路再补充一句:选自动换向方案时,要把收发切换时间除以一个 bit 周期,算出切换时间占据了多少比例。如果切换时间大于一个 bit 周期,直接放弃自动换向,用 MCU GPIO 控制 DE 最可靠。我自己做的小板子统一预留一个 DE 脚,不省这个 IO。
4.6 故障排查速查表
| 现象 | 优先检查项 | 次级检查项 |
|---|---|---|
| 完全无数据 | A/B是否接反、DTU串口模式 | 设备供电、自环测试 |
| 数据乱码 | 波特率/校验位 | 干扰、A/B静态电压 |
| 偶发丢数据 | 共地、屏蔽接地 | 内核缓存、DMA配置 |
| 某台设备时通时断 | 手拉手顺序、分支长度 | 该节点地址、终端电阻 |
| 远距离数据错 | 终端电阻、线缆质量 | 降低波特率、加中继 |
这表是我自己排查时会贴在工位上的东西。实际经验是:80% 的 485 问题出在接线上,剩下 20% 才是配置和硬件。先把接线捋顺,再动配置,不要一上来就怀疑 DTU 坏了。
5. 工具选型与部署心得
5.1 USB转串口芯片怎么选
做 DTU 调试,一个靠谱的 USB 转串口工具值得投资。CH340 便宜,出货量大,驱动兼容性也不错,缺点是仿冒芯片多,劣质线最容易掉线。FTDI 是最稳的选择,驱动对 Linux 支持好,很多老工程师指定 FTDI,缺点是贵。CP2102 中规中矩,Linux 内核直接支持。
我自己的工具箱里常备两种:主力 USB 转 RS485 用 FTDI 的,专门跑现场稳定性要求高的调试;备用几根 CH340 线放电脑包里,临时给别人改参数用,坏了不心疼。不管用什么芯片,买线时看线径和端子做工,很多便宜线用劣质镀锡线,上了 485 现场各种通病。另外要注意:多台电脑同时调试时,每台机器各用一根独立 USB 线,不要共用地线去“串”设备,USB 转串口的 GND 接设备时也要保持一致。
有些调试场合需要多串口同时工作,比如一台电脑同时监听 DTU 串口和服务器 TCP。这时候可以买一拖二、一拖四的 USB 转串口模块。驱动识别后是 COM3、COM4,每个口独立设置参数,互不干扰。注意多口模块各口的电平要一致,别在同一个模块上混用 TTL 和 RS485。
5.2 DTU选型要点
挑 DTU 不能只看价格,几个硬指标必须过。第一,串口路数和类型。你要接一条 485 总线挂多台设备,一路 485 就够;如果要同时接 RS232 设备又接 RS485 设备,选双串口型号。第二,网络制式。室内固定点位选 4G Cat-1 足够,户外偏远地区要确认运营商覆盖,有的地方只有低频段信号,就得选支持多频段的型号。第三,协议能力。纯透传 DTU 满足大部分自研协议;如果平台端是 MQTT,可以直接选支持 MQTT 的 DTU,把协议转换在 DTU 内完成,省一台网关。第四,供电和防护。工业现场至少要求宽压输入 DC 9-36V、工作温度 -40 到 +75 度,485 口带隔离和浪涌保护。第五,看门狗和断线重连机制。好的 DTU 内置硬件看门狗,掉线后自动重拨。这些直接决定长期运行稳定性。
实测经验:4G DTU 在信号强度 CSQ 10~20 之间时,TCP 长连接维持 24 小时基本没问题;CSQ 低于 5 就建议加装外置天线或者换位置。部署时把 DTU 放在设备柜上部,天线朝上,避开金属遮挡,比塞在配电箱角落强得多。
如果预算允许,尽量选品牌主流、固件更新频繁、说明书写得详细的 DTU。小众便宜设备参数漂移严重,我见过标称 9600 实际内部参数和 9600 差几个百分点的,上位机一直报错。这种经验光看参数表看不出来,只能靠口碑。
5.3 串口服务器和DTU的边界
串口服务器和 4G DTU 容易被混为一谈。严格说,串口服务器是把串口转成以太网,主机连接局域网里的串口服务器,就像操作本地串口一样,它强调网口转串口,是 LAN 场景。4G DTU 则走蜂窝网络,适合公网远程场景。如果你的设备在机房、厂区,局域网就能搞定,串口服务器更合适;如果设备分布在全国各地,必须上 4G DTU。
Linux 下用网口转串口服务器,本质就是操作系统虚拟出一个串口,驱动加载后出现 /dev/ttySx 或者 /dev/ttyUSBx,应用层透明调用,感觉不到物理网口的存在。还有一种玩法是把串口服务器的 TCP 端口和 Linux 的 socat 绑定,把网络数据转到本地伪终端。注意用这种方式时,串口参数(波特率、校验位)在串口服务器上设置,不再由本地驱动控制,别搞反了。
有的场景两者结合:现场走有线以太网到最近的接入点,再通过云端中转,这种混合架构在大型工厂很常见。本质都绕不开“串口数据打包成 TCP”这回事,理解了这一点,串口服务器、DTU 在你眼里就是同一种东西的不同形态。
5.4 个人经验:几个容易踩的坑
第一个坑:盲目追求高波特率。DTU 和传感器都支持 115200、230400,但如果 485 线长、干扰大,实际跑起来就是不如 9600 稳。工业采集真不差这几百毫秒,稳定压倒一切。第二个坑:忽略共地。现场临时接线只拧 A/B 两根线,看着能通,环境一变化就抽风。第三个坑:把 DTU 当本地调试串口用。DTU 的串口是给数据透传用的,有些型号不能用它进 AT 配置模式,或者能进但配置容易混淆。每个型号的配置入口在说明书里都不一样,务必先看文档。第四个坑:开发上位机时占用串口。你开着串口调试助手占着 COM 口,自己的程序再去 open 就会报“端口被占用”,这不是驱动问题,先把调试助手关掉。Unity 里做串口通信也一样,SerialPort 类需要独占串口,多开 Unity 实例会冲突。
做串口屏项目时也容易踩类似的坑:串口屏的指令帧里有转义字符或者 CRC 多项式,调试时用文本显示会被隐藏字符误导,用 HEX 显示才能看到真实内容。只要涉及二进制协议,调试助手一律用 HEX 模式显示,这条经验救了我很多次,也推荐给你。
最后分享一个我一直沿用的经验:所有串口调试,先保证能自环,再连设备。自环通过只说明串口链路没问题,不代表能正确和远端设备通信,但它帮你划清了“串口本身坏没坏”这条界线。串口 DTU 这东西,原理说起来就一层纸,RS232 也好 RS485 也好,本质都是把电信号变成字节流再交给网络。真正值钱的是现场那些经验:共地、屏蔽、终端电阻、A/B 对应、模式切换。你把这些捋顺了,再杂的设备也能老老实实把数据交出来。如果有人正被某个诡异现象卡住,不妨按这个思路重新走一遍排查顺序——先自环、再接设备、再看波形。八成的问题,出在你自己手底下那一两根线上。