欢迎光临
我们一直在努力

C# 通信三件套:串口、TCP、UDP 到底怎么选?(附示例代码与选型指南)

串口、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 解决"传过去的数据代表什么"。


七、常见问题

  • TCP 收到的数据不完整? —— TCP 没有消息边界,需自己设计长度协议或起止标记分包。
  • 串口收到乱码? —— 多半是双方参数不一致(如一边 115200、一边 9600),核对波特率等四项参数。
  • UDP 收不到? —— UDP 没有保证机制,可能是网络丢包、目标端口错误或防火墙拦截。

  • 八、如何选择

    • 设备之间直接连接 → 串口(电脑 ↔ PLC / 单片机)
    • 数据必须可靠 → TCP(文件、网页、数据库)
    • 数据要求实时 → UDP(视频、游戏、实时控制)

    总结

    串口:解决设备之间怎么传数据
    TCP :解决网络中如何可靠传输数据
    UDP :解决网络中如何快速传输数据

    C# 对应类库:SerialPort 负责串口,TcpClient/TcpListener 负责 TCP,UdpClient 负责 UDP。

    核心对比表

    维度串口TCPUDP
    连接方式 物理直连,上电即通 三次握手建立连接,四次挥手断开 无连接,发完即走
    可靠性 靠硬件校验(奇偶/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 心跳、广播发现

    赞(0)
    未经允许不得转载:171主机测评 » C# 通信三件套:串口、TCP、UDP 到底怎么选?(附示例代码与选型指南)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址