Skip to content

串口与 TCP 基础

内容类型:新手教程难度:入门适合:第一次接触设备通信、准备做串口监视工具或通信模板的读者阅读时间:约 12 分钟前置:已完成环境安装

串口和 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 和校验和只是算法不同,用途一样:检测传输错误。通信出问题时,先用通信证据包收集完整报文,再分析是参数、编码、帧格式还是校验的问题。

下一步

概念清楚了,直接开始做第一个串口监视工具,或进入通信任务模板。

动手练习

第一个小项目:WPF 串口监视工具,选串口、收发数据。

开始做项目 →

规范做法

串口/TCP 通信任务模板:缓存、解析、重连、日志。

查看模板 →

排查问题

通信出问题先整理证据包,再让 AI 分析。

通信证据包 →

别来无恙 · C# 上位机 AI 实战站 · 从零到交付 · QQ 群:1016188499