图0:串口服务器 - 系统信息
0. 前言
串口服务器是一种将串口数据转换为网口数据的设备,它在工业方面使用较多。这类设备需要非常高的稳定性,但是稳定性跟设计人员的硬件水平、软件水平以及测试等关系密切,这个范围太大,这里只是谈串口服务器软件如何设计。1. 核心数据结构设计
1.1 串口数据结构
- 串口参数:波特率、流控制、接口方式等
- 操作模式:TCP服务器、UDP服务器等
- 协议类型:Modbus TCP转Modbus RTC、自定义协议等
- 与串口打包有关:打包时间、打包长度、分隔符
- 串口运行信息:发送和接收字节数、缓冲区溢出次数等
- 与底层串口发送和接收相关数据结构
- 环形队列控制数据结构和环形队列缓冲区
1.2 网口数据结构
- IP类型:静态获取和动态获取
- IP地址
- 子网掩码
- 网关地址
2.参数存储设计
串口数据结构中,串口参数、操作模式、协议类型以及与串口打包有关的数据需要存储在非易失性存储器中;网口数据结构需要存储在非易失性存储器中。
在设计参数存储程序时,应考虑易扩展性。因为将来串口的个数可能会比当前设计的个数增加,新增加的串口,不应该再去考虑参数存储的事情。
3.数据缓冲区设计
串口接收的数据和网口接收的数据应该分别存储,环形队列这种数据结构能很好的满足我们的需求。它用两个指针分别管理读和写入口,一般写队列的优先级都会大于或等于读队列优先级,这样就可以不用设置临界区。在我们这个应用中,环形队列每次写入和读出的数据都不一定相同,所以我们需要改造通用的环形队列实现方法,将每一帧的长度字段和数据一起存入到环形队列中去。
4.数据打包策略
数据打包一般只针对串口,这是因为串口在硬件层面上是不支持"数据帧"的,它是一个字节一个字节发送和接收(即使有FIFO,但通常不会超过16字节)。网口与串口不同,它会将数据打包,在一包数据前面和后面各增加一些位形成数据帧,可以说网口硬件已经将数据打包好了,串口没有这种硬件功能,需要软件打包。一般可以根据设置的参数来打包,比如根据打包时间参数、打包长度参数、分隔符等等。如果没有使能这些参数,或者打包时间参数和打包长度参数设置为0,就需要程序默认一个打包时间。
打包时间这个参数很容易被误解,它并不是说这个时间内的数据打成一包数据,而是当接收一个字节数据之后,超过打包时间也没有接收到下一个字节数据,我们就会把这之前接收的数据打包。
打包长度这个参数是指接收到的数据个数等于打包长度时,这些数据打成一包。需要注意的是程序中隐藏着另外一个固定的打包长度,并且这个打包长度优先级最高,只要接收到的数据长度等于这个打包长度,会忽略掉其它所有打包参数,立刻将数据打包。这个隐含打包长度就是串口接收缓冲区长度。
分隔符可以有1个也可以有多个,当接收的数据流中包含了分隔符后,数据立刻被打包,它会忽略打包时间参数。
如果支持软件协议,要根据软件协议规定的打包策略执行。
5.协议
添加自定义协议层,可以实现数据过滤、更详细的数据统计功能等等;可以将串口服务器用作Modbus网关,用于将Modbus TCP转换成Modbus RTU;可以实现其它协议转换。6.IP发现
如果隔个半年,还得让你记得某个串口服务器的IP地址,那么这样的产品是相当没有人性化设计的。所以我们必须设计一种功能,通过一个上位机软件,去发现当前局域网下的所有串口服务器IP地址、MAC地址等信息。这一功能,叫做IP发现。一般是利用UDP广播功能,向特定端口发送一个特定数据包,串口服务器收到数据包后,将自己的IP地址等信息上传给上位机。图6-1显示上位机软件获取到的一个串口服务器信息。
图6-1:IP发现示意图
7.网页服务器
主要用来修改参数和显示统计信息。需要注意的是要具有非法参数检查功能。图0、图7-1和图7-2显示了部分网页服务器一般内容。图7-1:网络设置
图7-2:串口设置