Appearance
串口与 TCP 基础
串口和 TCP 是上位机与设备对话的两种最常见通道。这页只讲理解通信所必需的基础概念,不展开代码;具体的开发步骤在串口/TCP 通信任务模板里。
1. 串口是什么
串口(Serial Port,电脑上显示为 COM1、COM2…)是一条点对点的物理通信通道:一根串口线连接电脑和设备,按约定的参数逐字节收发数据。常见物理标准有 RS-232(短距离)和 RS-485(长距离、多设备),但对写上位机代码的人来说,接口用法是一致的:打开端口 → 配置参数 → 收发字节。
2. 串口四个参数:波特率、数据位、停止位、校验位
收发双方必须用完全相同的参数才能正确通信。打开串口前要确认设备的参数表(在设备说明书或协议文档里):
| 参数 | 是什么 | 常见值 |
|---|---|---|
| 波特率(Baud Rate) | 每秒传多少位,相当于通信"速度" | 9600、115200 |
| 数据位(Data Bits) | 每个字节的数据位数 | 8(最常用)、7 |
| 停止位(Stop Bits) | 每个字节后的间隔位数 | 1(最常用)、2 |
| 校验位(Parity) | 用一位做错误检查 | None(最常用)、Even、Odd |
最常见的组合是 9600/115200、8、N、1(即 8 个数据位、无校验、1 个停止位),设备说明书里常写成 "115200 8N1"。
如果数据是乱码或完全收不到:先检查这四个参数是否和设备一致,这是最高频的"通信不工作"原因。
3. 串口传的是字节,不是文字
串口只能传字节(0-255 的整数)。文字、数值、命令都要先编码成字节:
- 文字:按编码(如 ASCII、UTF-8、GBK)转成字节——编码不一致就会出现乱码(排查见编码与乱码排查)。
- 数值:按高低字节顺序拆成多个字节发送(大端/小端,协议文档会写明)。
上位机里最常见的两种显示方式:十六进制(如 01 03 00 00 00 02)和 ASCII 文本(如 AT\r\n)。调试助手和你的程序要选对模式,否则看到的"数据"会互相误解。
4. 帧:给字节流画边界
设备不会只发一个字节,而是一串字节。这一串字节按什么格式组织,就叫"帧"(Frame)。协议文档通常会定义帧格式,例如:
text
帧头(2字节) + 命令字(1字节) + 数据长度(1字节) + 数据(N字节) + 校验(1字节)
示例:AA 55 01 02 12 34 校验帧格式里要找到:帧头(怎么知道一帧从哪里开始)、长度(怎么知道一帧在哪里结束)、校验(怎么确认数据没传错)。
5. 粘包和半包:字节流没有边界
串口和 TCP 都是流式传输:数据像水流一样连续到达,程序不知道"这一帧到哪结束"。于是出现两个典型问题:
| 现象 | 表现 | 原因 |
|---|---|---|
| 粘包 | 一次收到两帧拼接在一起 | 两帧连续到达,接收缓冲区里已经连成一片 |
| 半包 | 收到的一帧不完整,缺尾部 | 一帧还没传完,程序就读取了缓冲区 |
处理思路统一是按帧解析:把收到的字节先放进缓冲区,然后不断按帧头 + 长度规则从缓冲区里"切"出完整帧,剩余的不完整数据留在缓冲区等下一次到达。DataReceived 事件里直接解析就是常见的错误写法。
详细的解析和缓存设计见 串口 TCP 通信任务模板。
6. TCP 和串口有什么不同
TCP 是网络通信:通过 IP 地址和端口连接(如 192.168.1.10:502),一个连接可以承载任意方向的连续数据流。
| 对比项 | 串口 | TCP |
|---|---|---|
| 物理连接 | 串口线,点对点 | 网线/Wi-Fi,可跨局域网 |
| 连接方式 | 打开端口即通 | 客户端 Connect / 服务端 Listen+Accept |
| 断线感知 | 基本没有,靠超时判断 | 有连接状态,但仍要处理断线重连 |
| 数据形态 | 字节流 | 字节流(同样有粘包半包问题) |
| 典型场景 | 近端设备、测试工装 | 远程设备、多设备接入 |
TCP 依然要按帧解析——很多新手以为 TCP 有"消息边界",实际没有,粘包半包一样要处理。
7. 校验:怎么知道数据没传错
设备协议常在帧尾加一个校验字节(校验和或 CRC),接收方按同样算法重新计算并与收到的校验值比对。对不上就丢弃或要求重发。CRC 和校验和只是算法不同,用途一样:检测传输错误。通信出问题时,先用通信证据包收集完整报文,再分析是参数、编码、帧格式还是校验的问题。
下一步
概念清楚了,直接开始做第一个串口监视工具,或进入通信任务模板。