您好,欢迎访问飞畅科技官网!
服务热线:+086 0571-87007055/56/57 EN
飞畅科技工业通信技术中心

光通信与工业互联网方案专家

EXPERT IN OPTICAL COMMUNICATION & INDUSTRIAL INTERNET SOLUTIONS

联系我们CONTACT US

全国咨询热线

0571-87007055/56/57/75

市场部直线电话:0571-87007140

手机:15306818230(微信)

QQ :2355416925

定制设计:18072828031(微信)

或给我们留言

在线留言

串口服务器为什么会拆包和粘包:从UART字节到TCP流的完整原理

浏览次数:飞畅科技原创作者:飞畅科技技术团队

FIBERIOT / 基础知识

串口服务器为什么会拆包和粘包:从UART字节到TCP流的完整原理

把RS232或RS485设备接入以太网后,程序一次读到的数据未必等于设备一次发送的完整报文。所谓拆包、粘包,常常不是串口服务器丢失数据,而是串行字节、网络传输和应用读取采用了不同的边界。理解这三层边界,才能设计可靠解析器,也才能判断现场故障究竟发生在哪里。本文讲解通用机制;飞畅具体设备支持的工作模式、缓存策略和参数范围,均以对应说明书为准。

原理图可点击查看原图;手机端可横向滑动查看清晰标注。

UART起始位数据位停止位与串口服务器接收缓存的信号路径
图1:UART的边界是单个字符;接收缓存把有效字符组合为连续字节,尚未自动获得应用报文边界。

01UART先解决字符,应用协议再定义报文

UART发送一个字符时,通常先用起始位提示接收器进入采样,再发送约定数量的数据位,可选奇偶校验,最后用停止位恢复空闲。接收器按配置的波特率和格式重建字符。因此,波特率、数据位、校验和停止位必须匹配;电平不符、噪声或采样偏差可能先表现为字符错误,而不是网络问题。

以8N1为例,一个八位字节在导线上还需要一个起始位和一个停止位,共十个位时间。若采用9600 bit/s,一个字符约占1.04毫秒。这里是计算示例,不是设备性能承诺。这个时间结构解释了为什么串口的实际字节吞吐量小于标称比特率,也解释了缓存为什么必须承接连续到来的字符。

RS232、RS422和RS485描述的是不同的电气接口与连接方式;UART描述字符收发时序。它们都不等同于应用报文。一个温度查询可以由多个字节组成,设备必须另用长度、结束符、固定格式或协议规定的间隔告诉接收方哪里是一条完整消息。

原理图可点击查看原图;手机端可横向滑动查看清晰标注。

两条应用报文经过TCP连续字节流后被不同读取长度拆分合并的原理
图2:同一串有序字节可以被应用分多次读取,也可以一次读到多条报文。图中长度只是机制示例。

02串口服务器如何把两种传输机制接起来

接收方向中,串口侧电路先把电气信号还原为字节,字节进入FIFO或软件缓存;打包逻辑根据实现选择的长度、等待时间等条件,把一段数据交给网络协议栈。反向则由网络接收缓存取出字节,经过串口发送器逐字符送上线路。两个方向具有各自的缓冲和调度。

因此,一条应用报文可能跨过多个串口接收批次,而同一批次也可能包含多条报文。打包条件帮助在等待时延与传输效率之间取舍,却不能自动理解所有上层协议。飞畅公开串口服务器资料提供TCP服务器、TCP客户端等网络工作模式;是否支持某种串口成帧策略,以及配置名称和取值,必须查对应型号手册。

当串口源持续产生数据而上联暂时阻塞,缓存占用会增长。TCP背压能够限制网络发送,但不会凭空让不支持流控的串口源暂停。缓存容量、硬件或软件流控支持、设备发送行为及断线策略,必须共同核查,不能把TCP可靠传输误解成任意拥塞下绝不丢失数据。

原理图可点击查看原图;手机端可横向滑动查看清晰标注。

长度字段与校验驱动的应用接收缓存解析和剩余字节保留机制
图3:完整报文由协议解析器识别;不足时继续积累,多余字节保留给下一帧。示例协议不是飞畅产品协议。

03TCP保证字节顺序,不保留每次发送的边界

TCP把连接看成有序字节流,用序列号表示字节位置,并通过确认、重传和流量控制管理传输。TCP报文段是网络传输单位,应用消息是业务协议单位,两者不是一一对应。发送方调用一次发送函数,并不要求接收方恰好用一次读取取得同样长度的数据。

假设设备依次产生六字节消息A和四字节消息B,接收程序最终得到的应是相同顺序的十个字节,但可以先读到A的前两字节,再读到剩余八字节;也可以一次读到全部十字节。前一种常被称为拆包,后一种常被称为粘包。只要字节完整且顺序正确,这两种现象本身都不是数据损坏。

读取长度受可用数据、接收缓冲、线程调度和读取接口参数影响;网络分段还受路径与协议栈限制影响。应用不能用抓包看到的TCP段长度推定业务报文长度,也不能把一次读取返回视为一次设备响应。连接关闭时,仍应处理已接收的完整数据,并识别残留半帧。

04可靠解析器必须保存跨读取的状态

接收程序应有一个持续存在的字节缓存,每次读取只负责追加。解析循环先判断是否已有足够的头部,再依据协议识别长度或结束条件;只有确认一帧完整,才校验并交给业务层。若仍不足,就保留当前字节,等待下次读取;若同时有两帧,就逐帧解析,不能丢弃余下部分。

例如自定义协议使用同步标记、长度字段、载荷和校验,解析器还必须明确长度是否包含头部、字段大小端、允许的最大长度和校验范围。图中只是讲解这些规则的虚构格式。现场应以真实设备协议为准,并限制缓存增长,拒绝越界长度;校验失败后的重新同步策略也要明确,避免一个错误字节让后续全部报文错位。

采用结束符的协议应处理转义或二进制载荷中的同值字节;固定长度协议要知道消息类型是否改变长度。以字符间隔成帧的协议,则必须区分串口线上观测到的间隔与网络应用收到字节的时间。经过缓存与网络调度后,原本的间隔可能改变,不能直接把TCP读取之间的间隙当作串口帧间隔。

05打包等待时间如何影响工程取舍

较长的等待时间可能把更多串口字节合并提交,降低小块传输开销,但也可能增加首字节等待。较短的等待时间有利于及时上送,却可能使应用更频繁地遇到部分报文。两种设置都不能代替正确的应用解析;优化目标应是满足业务时延与完整性,而不是强求一次读取一帧。

对请求应答通信,需要分别考虑设备处理时间、串口发送时间、服务器缓存等待、网络往返与应用调度。超时值应覆盖这些环节,并依据受控测试设置。重试也要遵循协议语义:写入或动作命令是否可重复执行,需要业务明确,不能只因等待超时就无限重发。

06验收时同时核对内容、时间与恢复

建议用可辨认的序号和长度进行受控测试,覆盖单帧、连续多帧、分段输入、长载荷和短暂停顿。接收端主动用不同读取长度运行同一解析器,确认最终消息数量、顺序、载荷与校验结果一致;这比只看串口工具显示正常更能证明解析可靠。所有示例数据都应记录为测试输入,不能冒充客户实测。

再分别测试串口格式不匹配、上联中断、网络拥塞和连接重建。串口字符错误应与网络重传区分,缓存溢出应与正常拆分区分,业务超时应与完整性错误区分。记录输入字节数、已解析消息数、残留缓存、错误原因和恢复时间,并保存抓包与串口日志的时间基准。

飞畅串口服务器用于串口设备接入网络时,选型应核对实际接口、工作模式、流控与断线行为。工程上最重要的结论是:串口服务器负责连接和传输,应用协议负责定义报文,解析器负责跨读取恢复完整消息。三层责任清楚,才能避免把正常字节流行为误判为设备故障。

技术参考:IETF RFC 9293:TCP字节流;飞畅串口服务器产品资料。原理图为原创示意,非产品内部实拍或实测。

上一篇:网管类型的解释说明

下一篇:没有了

返回