FIBERIOT / 基础知识
串口服务器为什么会拆包和粘包:从UART字节到TCP流的完整原理
把RS232或RS485设备接入以太网后,程序一次读到的数据未必等于设备一次发送的完整报文。所谓拆包、粘包,常常不是串口服务器丢失数据,而是串行字节、网络传输和应用读取采用了不同的边界。理解这三层边界,才能设计可靠解析器,也才能判断现场故障究竟发生在哪里。本文讲解通用机制;飞畅具体设备支持的工作模式、缓存策略和参数范围,均以对应说明书为准。
原理图可点击查看原图;手机端可横向滑动查看清晰标注。

01UART先解决字符,应用协议再定义报文
UART发送一个字符时,通常先用起始位提示接收器进入采样,再发送约定数量的数据位,可选奇偶校验,最后用停止位恢复空闲。接收器按配置的波特率和格式重建字符。因此,波特率、数据位、校验和停止位必须匹配;电平不符、噪声或采样偏差可能先表现为字符错误,而不是网络问题。
以8N1为例,一个八位字节在导线上还需要一个起始位和一个停止位,共十个位时间。若采用9600 bit/s,一个字符约占1.04毫秒。这里是计算示例,不是设备性能承诺。这个时间结构解释了为什么串口的实际字节吞吐量小于标称比特率,也解释了缓存为什么必须承接连续到来的字符。
RS232、RS422和RS485描述的是不同的电气接口与连接方式;UART描述字符收发时序。它们都不等同于应用报文。一个温度查询可以由多个字节组成,设备必须另用长度、结束符、固定格式或协议规定的间隔告诉接收方哪里是一条完整消息。
原理图可点击查看原图;手机端可横向滑动查看清晰标注。

02串口服务器如何把两种传输机制接起来
接收方向中,串口侧电路先把电气信号还原为字节,字节进入FIFO或软件缓存;打包逻辑根据实现选择的长度、等待时间等条件,把一段数据交给网络协议栈。反向则由网络接收缓存取出字节,经过串口发送器逐字符送上线路。两个方向具有各自的缓冲和调度。
因此,一条应用报文可能跨过多个串口接收批次,而同一批次也可能包含多条报文。打包条件帮助在等待时延与传输效率之间取舍,却不能自动理解所有上层协议。飞畅公开串口服务器资料提供TCP服务器、TCP客户端等网络工作模式;是否支持某种串口成帧策略,以及配置名称和取值,必须查对应型号手册。
当串口源持续产生数据而上联暂时阻塞,缓存占用会增长。TCP背压能够限制网络发送,但不会凭空让不支持流控的串口源暂停。缓存容量、硬件或软件流控支持、设备发送行为及断线策略,必须共同核查,不能把TCP可靠传输误解成任意拥塞下绝不丢失数据。
原理图可点击查看原图;手机端可横向滑动查看清晰标注。

03TCP保证字节顺序,不保留每次发送的边界
TCP把连接看成有序字节流,用序列号表示字节位置,并通过确认、重传和流量控制管理传输。TCP报文段是网络传输单位,应用消息是业务协议单位,两者不是一一对应。发送方调用一次发送函数,并不要求接收方恰好用一次读取取得同样长度的数据。
假设设备依次产生六字节消息A和四字节消息B,接收程序最终得到的应是相同顺序的十个字节,但可以先读到A的前两字节,再读到剩余八字节;也可以一次读到全部十字节。前一种常被称为拆包,后一种常被称为粘包。只要字节完整且顺序正确,这两种现象本身都不是数据损坏。
读取长度受可用数据、接收缓冲、线程调度和读取接口参数影响;网络分段还受路径与协议栈限制影响。应用不能用抓包看到的TCP段长度推定业务报文长度,也不能把一次读取返回视为一次设备响应。连接关闭时,仍应处理已接收的完整数据,并识别残留半帧。
04可靠解析器必须保存跨读取的状态
接收程序应有一个持续存在的字节缓存,每次读取只负责追加。解析循环先判断是否已有足够的头部,再依据协议识别长度或结束条件;只有确认一帧完整,才校验并交给业务层。若仍不足,就保留当前字节,等待下次读取;若同时有两帧,就逐帧解析,不能丢弃余下部分。
例如自定义协议使用同步标记、长度字段、载荷和校验,解析器还必须明确长度是否包含头部、字段大小端、允许的最大长度和校验范围。图中只是讲解这些规则的虚构格式。现场应以真实设备协议为准,并限制缓存增长,拒绝越界长度;校验失败后的重新同步策略也要明确,避免一个错误字节让后续全部报文错位。
采用结束符的协议应处理转义或二进制载荷中的同值字节;固定长度协议要知道消息类型是否改变长度。以字符间隔成帧的协议,则必须区分串口线上观测到的间隔与网络应用收到字节的时间。经过缓存与网络调度后,原本的间隔可能改变,不能直接把TCP读取之间的间隙当作串口帧间隔。
05打包等待时间如何影响工程取舍
较长的等待时间可能把更多串口字节合并提交,降低小块传输开销,但也可能增加首字节等待。较短的等待时间有利于及时上送,却可能使应用更频繁地遇到部分报文。两种设置都不能代替正确的应用解析;优化目标应是满足业务时延与完整性,而不是强求一次读取一帧。
对请求应答通信,需要分别考虑设备处理时间、串口发送时间、服务器缓存等待、网络往返与应用调度。超时值应覆盖这些环节,并依据受控测试设置。重试也要遵循协议语义:写入或动作命令是否可重复执行,需要业务明确,不能只因等待超时就无限重发。
06验收时同时核对内容、时间与恢复
建议用可辨认的序号和长度进行受控测试,覆盖单帧、连续多帧、分段输入、长载荷和短暂停顿。接收端主动用不同读取长度运行同一解析器,确认最终消息数量、顺序、载荷与校验结果一致;这比只看串口工具显示正常更能证明解析可靠。所有示例数据都应记录为测试输入,不能冒充客户实测。
再分别测试串口格式不匹配、上联中断、网络拥塞和连接重建。串口字符错误应与网络重传区分,缓存溢出应与正常拆分区分,业务超时应与完整性错误区分。记录输入字节数、已解析消息数、残留缓存、错误原因和恢复时间,并保存抓包与串口日志的时间基准。
飞畅串口服务器用于串口设备接入网络时,选型应核对实际接口、工作模式、流控与断线行为。工程上最重要的结论是:串口服务器负责连接和传输,应用协议负责定义报文,解析器负责跨读取恢复完整消息。三层责任清楚,才能避免把正常字节流行为误判为设备故障。
技术参考:IETF RFC 9293:TCP字节流;飞畅串口服务器产品资料。原理图为原创示意,非产品内部实拍或实测。


