TCP、UDP 和串口通信-学习笔记
一、核心概念对比
| 特性 | TCP | UDP | 串口通信 (Serial) |
|---|---|---|---|
| 连接方式 | 面向连接 (需三次握手) | 无连接 | 点对点直连 |
| 可靠性 | 可靠传输 (丢包重传/顺序保证) | 不可靠 (可能丢包乱序) | 物理层直连,可靠性取决于硬件 |
| 速度 | 较慢 (有连接/确认开销) | 极快 (无连接开销) | 中速 (取决于波特率) |
| 应用场景 | Web/邮件/文件传输 | 视频流/DNS/游戏实时数据 | 嵌入式设备/传感器/工业控制 |
| 数据边界 | 字节流 (无消息边界) | 数据报文 (有明确边界) | 字节流 (需自定义协议) |
二、Python 实现代码
1.TCP 通信 (可靠传输)
# ===== TCP Server =====
import socketserver = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('0.0.0.0', 8888))
server.listen()print("TCP Server 等待连接...")
client, addr = server.accept()
print(f"客户端 {addr} 已连接")while True:data = client.recv(1024)if not data: breakprint(f"收到: {data.decode()}")client.send(b"Server Received")client.close()
server.close()# ===== TCP Client =====
import socketclient = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('localhost', 8888))client.send(b"Hello TCP Server!")
response = client.recv(1024)
print(f"服务端响应: {response.decode()}")client.close()
2.UDP 通信 (高速传输)
# ===== UDP Server =====
import socketserver = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind(('0.0.0.0', 9999))print("UDP Server 等待数据...")
while True:data, addr = server.recvfrom(1024)print(f"收到来自 {addr} 的消息: {data.decode()}")server.sendto(b"ACK", addr)# ===== UDP Client =====
import socketclient = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
client.sendto(b"Hello UDP Server!", ('localhost', 9999))response, addr = client.recvfrom(1024)
print(f"收到响应: {response.decode()}")client.close()
3.串口通信 (设备直连)
# 首先安装:pip install pyserial# ===== 串口收发示例 =====
import serial
import time# 配置串口参数 (根据实际设备修改)
ser = serial.Serial(port='/dev/ttyUSB0', # Windows 用 'COM3'baudrate=9600, # 波特率bytesize=serial.EIGHTBITS,parity=serial.PARITY_NONE,stopbits=serial.STOPBITS_ONE
)try:while True:# 发送数据ser.write(b"PING\n") print("发送: PING")# 接收数据 (带超时)if ser.in_waiting > 0:data = ser.readline().decode().strip()print(f"收到: {data}")time.sleep(1)except KeyboardInterrupt:ser.close()print("串口已关闭")
三、关键技术要点
- TCP粘包处理:使用消息头声明长度 或 添加特殊分隔符
# 发送带长度的消息 msg = b"Hello World" client.send(len(msg).to_bytes(4, 'big') + msg) - UDP应用控制:需要自行实现超时重传/数据校验
- 串口协议设计:
- 常用协议:Modbus, NMEA-0183 (GPS)
- 数据帧示例:
[起始符][长度][数据][校验和][结束符]
- 非阻塞通信:使用
setblocking(False)+select模块处理多连接
调试工具推荐:
- TCP/UDP测试:NetAssist (Windows) / nc (Linux)
- 串口调试:Serial Port Utility (Mac/Win) / CuteCom (Linux)
- 协议分析:Wireshark
这里是个人常用的调试工具集合

https://www.123865.com/s/2bMHvd-PL4xd
https://www.123865.com/s/2bMHvd-PL4xd
