linux串口服务器编程,基于Linux的串口服务器设计与实现

Modbus TCP/RTU相互转换功能的实现

这一步是串口服务器设计的关键,其转换重点在于CRC校验和MBPA报头的变换。在这里,定义mod2tcp函数来完成Modbus RTU到TCP格式的转换,定义tcp2mod函数来完成Modbus TCP到RTU格式的数据转换。例如,来自Modbus主站的TCP协议请求,经串口服务器转换成Modbus RTU格式,经485口发送给从站,并将从站相应数据经485接口送入串口服务器,转换成Modbus TCP格式信息返回主站(图4)。

f3abfc6af5bf32d14605b91535f03f4f.png

图4:Modbus TCP/RTU相互转换示例。

程序流程如图5(a)和5(b)所示。

6b8aa9ba5bfd6997c203242fc0ffe7af.png

图5:Modbus RTU 到TCP格式数据转换程序流程(a)和Modbus TCP 到RTU格式数据转换程序流程(b)。

由此可见,TCP格式字节数=RTU格式字节数-2+6,获取的可用数据均相同,因此其程序实现就不再是难题了。

CRC校验功能

CRC即循环冗余校验码,它是数据通信领域中最常用的一种差错校验码。RTU方式时,CRC校验传送的全部数据,它忽略信息中单个字符数据的奇偶校验方法。CRC校验的关键在于数据的匹配,将得到的数据如何正确的套用到CRC校验当中是其中的关键。

CRC校验有既定的规则,其程序实现非常简单,只需要以下几步:CRC字节的初始化;将数据导入进行CRC计算;返回计算出的CRC值。

串口服务器的设计与实现

此部分介绍整个程序的main()函数,它会调用前文介绍的函数来实现串口服务器功能,故其头文件中要包含前文所述的各函数文件。程序流程如图6所示。

main()函数应用Linux C函数编程,其中应尤其注意socket的应用,socket要先建立再bind();在信号量中的参数要配置正确;进程的管理方面,要注意进程退出时先退出子进程,在所有进程都完成之后再关闭socket.

7db7ce2e6773a117891b4512149fed4b.png

图6:串口服务器main()函数程序流程图。

问题及解决

串口服务器测试过程中,有时会出现TCP到RTU发送时数据包错误,不能正确地将TCP数据转换为RTU数据。

原因在于,测试过程中,Windows下的PC终端向Linux工控板发送数据,但是Windows的实时性并不很好,不能及时地发送数据,有时会出现一次发送两包数据给串口服务器的现象;另外,工控板中Linux下的TCP/IP协议剪裁封装不是很完善,导致其接收处理数据的能力比较差。

当多帧数据同时到达时,串口服务器未能正确将后一帧数据发送出去,而把一帧数据分割到两帧,导致数据帧错误。这就是发生上述数据完全错误的原因。这时,需要给串口服务器添加数据的分帧处理功能,在接收到数据时,先判断数据帧是否是有效数据帧,确保每次发送的数据都能是完整的一帧,不会出现数据帧错位,而导致数据的完全错误。

本文小结

本文的目标是在以AT91RM9200芯片构建的Multibus-CPU开发板上实现串口服务器功能。该串口服务器应用Modbus相关协议,将传统的以RS485/232串口通信设备接入工业以太网,实现上位机和设备之间的信息交互。本串口服务器程序已经能够在开发板上正确运行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值