串口、TCP、UDP 区别(结合 C# 实际开发)
一、一句话理解
| 串口 | 两个设备之间直接传输字节 | PLC、单片机、传感器 |
| TCP | 网络中可靠传输数据 | 文件、网页、数据库 |
| UDP | 网络中快速发送数据 | 视频、游戏、实时控制 |
串口:电脑 ↔ 设备
TCP:电脑 ↔ 网络 ↔ 电脑
UDP:电脑 ↔ 网络 ↔ 多个设备
串口主要负责设备之间的数据传输,而 TCP/UDP 是建立在 IP 网络上的数据传输协议。
二、串口通信
1. 串口到底是什么?
串口(Serial Port)是一种设备通信方式,常见有 UART、RS-232、RS-485。其中 UART 是异步串行通信的逻辑协议,RS-232、RS-485 是基于 UART 的两种电气物理接口标准,常用于工控、嵌入式设备。
它最大的特点:两个设备之间通过一根通信线直接交换数据,不需要 IP 地址、路由器和网络连接,只需要双方约定:波特率、数据位、校验位、停止位。
115200 8N1 // 波特率115200、数据位8、无校验、停止位1;双方参数必须一致
2. C# 串口代码
C# 中主要使用 SerialPort:
SerialPort serialPort = new SerialPort();
serialPort.PortName = "COM3"; // 串口号
serialPort.BaudRate = 115200; // 波特率
serialPort.DataBits = 8; // 数据位
serialPort.Parity = Parity.None; // 校验位
serialPort.Open();
发送数据:
byte[] data = Encoding.UTF8.GetBytes("启动");
serialPort.Write(data, 0, data.Length);
// 参数:要发送的数据、起始位置、长度
接收数据(DataReceived 事件回调):
private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
string data = serialPort.ReadExisting(); // 读取当前接收的数据
}
三、TCP 通信
1. TCP 是什么?
TCP 是面向连接、可靠、有序的网络通信协议,像打电话——通信前要先"建立连接",确认对方在线后再开始传数据。
2. C# TCP 服务器
TcpListener server = new TcpListener(IPAddress.Any, 8080); // 监听本机所有IP的8080端口
server.Start(); // 启动监听
TcpClient client = await server.AcceptTcpClientAsync(); // 等待并接受客户端连接
流程:启动服务器 → 等待连接 → 接收数据 → 处理数据 → 返回结果。
3. C# TCP 客户端
TcpClient client = new TcpClient();
await client.ConnectAsync("192.168.1.100", 8080); // 连接目标服务器的IP和端口
发送数据:
NetworkStream stream = client.GetStream();
byte[] data = Encoding.UTF8.GetBytes("Hello");
stream.Write(data, 0, data.Length);
// 参数:要发送的数据、起始位置、长度
四、UDP 通信
1. UDP 是什么?
UDP 和 TCP 最大的区别:发送数据前不需要建立连接,类似发短信——发出去就不管对方有没有收到。特点是速度快、延迟低,但不保证可靠、不保证顺序。
2. C# UDP 代码
发送:
UdpClient client = new UdpClient();
byte[] data = Encoding.UTF8.GetBytes("Hello");
client.Send(data, data.Length, "192.168.1.100", 8080);
// 参数:数据、长度、目标IP、目标端口
接收:
IPEndPoint point = new IPEndPoint(IPAddress.Any, 8080); // 监听本机所有IP的8080端口
byte[] data = client.Receive(ref point); // 接收数据并拿到发送方地址
五、数据传输边界(实际开发最容易踩坑)
串口
串口是字节流,连续发送 ABC、DEF,接收端可能一次拿到 ABCDEF,不知道一条消息从哪到哪,所以需要自己定义协议(如开始符 + 数据 + 结束符)。
TCP
TCP 同样是字节流,会出现粘包和拆包:
- 粘包:Send("Hello")、Send("world"),接收端可能一次收到 HelloWorld;
- 拆包:一条完整数据可能被拆成 Hel、loWorld 分两次收到。
因此 TCP 必须由应用层自己处理分包(如长度前缀协议:长度 + 数据)。
UDP
UDP 天然保留消息边界:发几次,就收几次,不会粘包也不会拆包。
六、实际项目怎么选
| 工业设备(PLC、传感器、仪表) | RS-485 + Modbus | 稳定、抗干扰、成本低 |
| 软件系统(客户端↔服务器、数据库) | TCP | 数据不能丢(登录、订单、支付) |
| 实时数据(机器人控制、视频、游戏) | UDP | 实时性优先,旧数据无意义 |
Modbus 是一种工业通信协议:串口/TCP/UDP 解决"数据怎么传过去",Modbus 解决"传过去的数据代表什么"。
七、常见问题
八、如何选择
- 设备之间直接连接 → 串口(电脑 ↔ PLC / 单片机)
- 数据必须可靠 → TCP(文件、网页、数据库)
- 数据要求实时 → UDP(视频、游戏、实时控制)
总结
串口:解决设备之间怎么传数据
TCP :解决网络中如何可靠传输数据
UDP :解决网络中如何快速传输数据
C# 对应类库:SerialPort 负责串口,TcpClient/TcpListener 负责 TCP,UdpClient 负责 UDP。
核心对比表
| 连接方式 | 物理直连,上电即通 | 三次握手建立连接,四次挥手断开 | 无连接,发完即走 |
| 可靠性 | 靠硬件校验(奇偶/CRC),出错重发需应用层实现 | 可靠:确认重传(ARQ)、超时重传 | 不可靠:丢包不重传,到达即交付 |
| 数据顺序 | 字节按发送顺序到达 | 严格有序(序列号重组) | 不保证顺序,可能乱序 |
| 数据边界 | 字节流,无消息边界 | 字节流,无消息边界(需应用层分包) | 数据报,保留包边界(一次发=一次收) |
| 流量控制 | 无(或 RTS/CTS 硬件流控) | 滑动窗口,接收方控制发送速率 | 无 |
| 拥塞控制 | 无 | 有(慢启动、拥塞避免、快重传/快恢复) | 无 |
| 头部开销 | 起始位+停止位+校验位,每字节约 20% 开销 | 最小 20 字节(可带选项至 60 字节) | 固定 8 字节 |
| 传输延迟 | 低且稳定(微秒~毫秒级,取决于波特率) | 较高且可变(握手、重传、拥塞控制) | 低,无握手无重传 |
| 传输速率 | 典型 9600~115200 bps,最高可达数 Mbps | 受网络带宽限制,可达 Gbps | 同左 |
| 传输距离 | RS-232 ≤15m;RS-485 ≤1200m | 全球范围(互联网) | 全球范围 |
| 寻址方式 | 端口号(COM1、/dev/ttyS0),无网络地址 | IP + 端口 | IP + 端口 |
| 通信模式 | 全双工(UART)/ 半双工(RS-485) | 全双工 | 全双工 |
| 广播/多播 | 不支持(RS-485 可一主多从轮询) | 不支持(仅单播) | 支持广播和多播 |
| 典型应用 | 单片机、传感器、PLC、调试控制台、嵌入式设备 | 网页(HTTP)、文件传输(FTP)、邮件、SSH、数据库 | 直播、视频通话、DNS、游戏、IoT 心跳、广播发现 |


