DC娱乐网

串口转网口通讯失败:波特率数据位配置误区

串口转网口的设备现在用得很多,老仪表、老PLC、门禁控制器等,只要设备上有个RS232或者RS485口,接个串口服务器就

串口转网口的设备现在用得很多,老仪表、老PLC、门禁控制器等,只要设备上有个RS232或者RS485口,接个串口服务器就能扔进局域网,上位机通过TCP/IP来访问。听起来很简单,但实际调试的时候通讯失败的情况多得很,而且排查起来往往绕了一大圈,最后发现就是几个参数没对上。

一、串口参数这个东西,错一位都不行

串口通讯有几个基本参数:波特率、数据位、停止位、校验位。这四个参数两端必须完全一致,差任何一个,数据就是乱的,或者根本收不到。

听起来是常识,但实际上出问题的频率高得出乎意料。原因是串口参数的默认值各家不统一。有的设备出厂默认9600,8N1;有的是19200,8E1;还有些老设备是7位数据位加偶校验,这种配置现在不常见,很多人压根没想到数据位还能设成7。串口服务器这边如果没有按照从机设备的实际参数配置,两边就是鸡同鸭讲。

最坑的情况是设备手册写的是默认参数,但实际出厂的时候被改过,或者现场之前有人动过配置没有记录。所以拿到一台不熟悉的设备,第一步不是猜参数,是去找它的实际配置,要么查手册、要么用串口调试工具把所有常见波特率挨个试一遍。

二、波特率不匹配的典型表现

波特率差得多,比如一边9600一边115200,基本上什么都收不到,或者收到一堆乱码,这种情况还好判断。

更难搞的是波特率接近但不完全一样。RS232/485的波特率有一定容忍范围,通常允许±2%~5%的偏差。但如果两端都使用内部晶振产生波特率,晶振本身有误差,加上温度漂移,两边实际波特率可能相差超过容忍范围,在通讯量小的时候看不出来,数据多了或者帧比较长,累积误差就导致停止位判断错误,出现偶发性丢包或者误码。这种问题不稳定,时好时坏,排查起来特别费时间。

三、数据位和校验位的坑

数据位7和8的区别,很多人没注意过。ASCII码只用了7位,早期的串口通讯很多用7位数据位,剩下一位留给校验。现在的设备大多数用8位数据位,但老仪表、老电表、老门禁系统里,7E1(7位数据位、偶校验、1位停止位)的配置并不少见。

串口服务器默认一般是8N1,遇到7E1的设备就直接不通,改一下数据位和校验位设置就好了,但前提是你得知道对方是什么配置。

校验位这个东西也有容易搞混的地方。奇校验(Odd)和偶校验(Even)概念上很简单,但有些软件界面上的标注方式不一样,有写O/E的,有写Odd/Even的,也有些国产设备软件翻译有问题,奇偶标反了。建议配置完之后发几个测试帧验证一下,别光看参数对上了就以为好了。

四、串口服务器本身的配置逻辑

串口转网口的设备,除了串口参数之外,网络侧的配置也有几个容易出错的地方。

工作模式是第一个。串口服务器通常支持TCP Server、TCP Client、UDP几种模式。上位机软件如果是主动发起连接,串口服务器应该设成TCP Server,监听一个端口等待连接。如果串口服务器要主动连接某个服务器,就要设成TCP Client,填目标IP和端口。这两个模式搞反了,连接根本建立不起来,抓包才能看出来问题在哪。

虚拟串口这个坑也踩过不少次。有些上位机软件只支持本地串口,不支持TCP直连,所以要在电脑上安装虚拟串口驱动,把TCP连接映射成一个COM口,软件看到的还是串口。虚拟串口的波特率设置很多人以为无所谓,因为"反正走的是网络",其实不是。虚拟串口驱动和串口服务器之间的协商,有些产品还是会用到波特率参数,设错了照样不通。具体要看串口服务器厂家的说明,不同产品行为不一样。

五、流控这个参数别忽略

硬件流控(RTS/CTS)和软件流控(XON/XOFF),大多数场合用不到,但偶尔会遇到必须开流控才能正常通讯的设备。问题是,如果设备那边开了流控,串口服务器这边没开,或者接线的时候RTS/CTS没接,设备发送方会一直等对方的允许信号,数据就卡死在那里,看起来像完全没有响应。这种情况在RS232连接里比较常见,RS485一般不涉及流控。

排查方法是先把两边的流控都关掉,测试能不能基本通讯,排除其他参数问题之后,再考虑流控的因素。

六、实际排查的顺序

遇到串口转网口通讯失败,比较有效率的排查顺序是这样的:先确认网络连通性,ping一下串口服务器,确认TCP连接能建立,排除纯网络问题。然后用串口调试工具直接接串口设备,绕过串口服务器,确认串口设备本身是正常工作的,同时把实际的串口参数确认清楚。再按照确认的串口参数配置串口服务器,重新测试。如果还是不通,抓一下TCP数据包,看数据有没有到达、内容是不是正确,再回头对照协议文档检查上层的Modbus或者其他协议有没有问题。

七、快问快答

Q:波特率对上了还是乱码,最可能是什么问题?

A:大概率是数据位或者校验位没对上。8N1和7E1收到的内容会完全不同,用串口调试工具把原始十六进制数据抓出来,对照正确帧格式,基本上能判断是哪个参数出了问题。

Q:串口服务器配置好了,上位机软件就是连不上,怎么排查?

A:先用telnet或者网络调试助手手动连串口服务器的IP和端口,看TCP连接能不能建立。能建立说明网络和串口服务器没问题,问题在上位机软件的配置。连不上就查防火墙、IP地址、端口号是否正确,或者串口服务器的工作模式设置有没有问题。

Q:同样的配置,有时候通有时候不通,怎么回事?

A:这种不稳定的情况,常见原因有几个:波特率偏差在临界值附近、线缆质量差导致偶发误码、串口服务器的TCP连接超时断开没有自动重连、或者现场有间歇性干扰。用抓包工具记录一段时间的数据,看故障发生时的具体表现,比盲猜有效率多了。

Q:Modbus RTU转Modbus TCP,功能码和寄存器地址要改吗?

A:功能码不需要改,Modbus RTU和Modbus TCP的功能码是一样的。寄存器地址也不需要改,串口服务器做的是透明转换,只是把串口帧包进TCP里传输。需要注意的是Modbus TCP有自己的MBAP报文头,如果上位机软件直接发RTU帧过来,串口服务器不一定能正确处理,要看设备是否支持RTU over TCP模式。