一、通信基础概念
1. 串行通信与并行通信
- 串行通信
- 定义:通过一条线路逐位传输数据,每个字节包含起始位、数据位、校验位和停止位。
- 特点 :
- 传输稳定,但速度较慢(因逐位传输)。
- 常用接口:RS-232、RS-485、USB(本质为串行,但通过协议模拟并行)。
- 应用场景:工业控制(如 Modbus RTU)、嵌入式设备通信。
- 并行通信
- 定义:通过多条线路同时传输多个比特位,同时接收和发送多个字节 (如 8 位数据总线)。
- 特点 :
- 传输速度快,但线路成本高(需多条物理线路)。
- 应用场景:早期计算机内部总线(如 ISA、PCI)、打印机并行接口。
2. 关键术语
- 比特(bit) :二进制最小单位,如
10101111
为 8 比特。 - 字节(byte):1 字节 = 8 比特,是数据传输的基本单位。
- 波特率(Baud Rate):单位时间内传输的数据,定位是位每秒,即bit/s。波特率用bps表示 ,每秒传输的比特数,常见值:9600bps、115200bps。
- 校验位:用于检测数据传输错误,常见方式:奇偶校验、CRC 校验、LRC 校验。
- 停止位:标识字节传输结束,通常为 1 或 2 位。
二、TCP 与 UDP 协议
1. TCP(传输控制协议)
- 特点 :
- 面向连接:通信前需建立连接(三次握手),结束后释放连接(四次挥手)。
- 可靠传输:通过序列号、确认应答、重传机制确保数据完整性。
- 流式传输:无固定数据边界,数据可能分块传输(需应用层处理分包)。
- 应用场景:对可靠性要求高的场景,如文件传输(FTP)、网页浏览(HTTP)、邮件(SMTP)。
- 端口示例:HTTP(80)、HTTPS(443)、FTP(21)。
2. UDP(用户数据报协议)
- 特点 :
- 无连接:无需建立连接,直接发送数据报(不可靠传输,可能丢包)。
- 高效快速:无额外开销,适合实时性要求高的场景。
- 数据报边界:每个 UDP 包有固定边界,适合小数据量传输。
- 应用场景:实时音视频(如视频会议、在线游戏)、DNS 解析、传感器数据上报。
- 端口示例:DNS(53)、SNMP(161)、DHCP(67/68)。
三、Socket 编程基础
所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象
Server:服务器
Client:客户端

1. 核心概念
- Socket(套接字) :
- 网络通信的端点抽象,封装了 IP 地址和端口号,用于标识网络中的进程。
- 分为流式套接字(TCP)和数据报套接字(UDP)。
- IP 地址 :标识网络中的设备,如
192.168.1.2
(内网)、8.8.8.8
(谷歌 DNS)。 - IP 中还包括 ICMP 协议和 ARP 协议
ICMP
用于告知网络包传送过程中产生的错误以及各种控制信息。ARP
用于根据 IP 地址查询相应的以太网 MAC 地址。- 端口号:标识设备中的应用程序,范围:0~65535(0~1023 为系统保留端口,如 HTTP 80)。
- 网卡驱动程序负责控制网卡硬件
- 硬件负责实际的收发操作
2. TCP Socket 通信流程
socket客户端:
1.创建Socket对象,绑定IP,构建链接
2.发送send
3.接收数据Receive,注意,需要持续性接收,加While,异步操作Task,取消CancellationTokenSource
4.注意,有链接就应该有断开 (3*)
socket服务端:
1.创建socket对象,绑定IP,启用监听
2.监听对象的获取使用Accept方法
3.推送消息的方法跟客户端相同都是Send
-
服务端步骤:
-
创建 Socket :指定协议族(IPv4)、套接字类型(流式)、协议(TCP)。
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
-
绑定 IP 和端口 :关联本地 IP 和端口号。
IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8888); serverSocket.Bind(endpoint);
-
监听连接 :设置最大连接队列。
serverSocket.Listen(10); // 最多允许10个等待连接
-
接受连接 :阻塞等待客户端连接。
Socket clientSocket = serverSocket.Accept(); // 阻塞直至客户端连接
-
收发数据 :通过
Send()
和Receive()
读写数据。 -
关闭连接 :释放资源。
clientSocket.Close(); serverSocket.Close();
-
-
客户端步骤:
-
创建 Socket:同上。
-
连接服务端 :指定服务端 IP 和端口。
Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); clientSocket.Connect("127.0.0.1", 8888);
-
收发数据:同上。
-
关闭连接。
-
3. UDP Socket 通信流程
-
无连接,无需监听和接受连接 ,直接发送 / 接收数据报:
// 服务端 Socket udpServer = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); udpServer.Bind(new IPEndPoint(IPAddress.Any, 8888)); byte[] buffer = new byte[1024]; IPEndPoint clientEndPoint = new IPEndPoint(IPAddress.Any, 0); int length = udpServer.ReceiveFrom(buffer, ref clientEndPoint); // 接收数据报 // 客户端 Socket udpClient = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); byte[] data = Encoding.UTF8.GetBytes("Hello UDP"); udpClient.SendTo(data, new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8888)); // 直接发送数据报
四、虚拟串口与调试工具
- 虚拟串口驱动 :
- 在单台计算机上模拟两个串口(如 COM1 和 COM2),用于调试串口通信程序。
- 应用场景:开发时无硬件设备,通过虚拟串口测试串口协议(如 Modbus RTU)。
- 调试工具 :
- 串口调试助手:模拟硬件设备,发送 / 接收串口数据(如 Modbus Poll/Slave)。
- 网络调试助手:测试 Socket 通信,支持 TCP/UDP 收发(如 NetAssist)。
五、总结:协议选择指南
场景 | 推荐协议 / 技术 | 理由 |
---|---|---|
工业设备近距离通信 | Modbus RTU(串行) | 简单可靠,适合 RS-485 总线,支持主从模式。 |
远程可靠数据传输 | TCP + Socket | 面向连接,保证数据完整性,适合文件传输、配置指令下发。 |
实时音视频流 | UDP + Socket | 低延迟,允许少量丢包,适合音视频实时传输。 |
跨网络设备互联 | Modbus TCP | 基于以太网,支持跨网段通信,适合物联网平台对接。 |
临时调试或老旧设备 | Modbus ASCII(串行) | 可读性强,便于人工分析,适合数据量小的场景(如早期 PLC)。 |
通过理解不同协议的特点和适用场景,可针对性选择通信方案,优化数据传输的效率和可靠性。