一、核心概念对比
| 特性 | TCP | UDP | 串口通信 (Serial) |
|---|---|---|---|
| 连接方式 | 面向连接 (需三次握手) | 无连接 | 点对点直连 |
| 可靠性 | 可靠传输 (丢包重传/顺序保证) | 不可靠 (可能丢包乱序) | 物理层直连,可靠性取决于硬件 |
| 速度 | 较慢 (有连接/确认开销) | 极快 (无连接开销) | 中速 (取决于波特率) |
| 应用场景 | Web/邮件/文件传输 | 视频流/DNS/游戏实时数据 | 嵌入式设备/传感器/工业控制 |
| 数据边界 | 字节流 (无消息边界) | 数据报文 (有明确边界) | 字节流 (需自定义协议) |
二、Python 实现代码
1.TCP 通信 (可靠传输)
python
# ===== TCP Server =====
import socket
server = 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: break
print(f"收到: {data.decode()}")
client.send(b"Server Received")
client.close()
server.close()
# ===== TCP Client =====
import socket
client = 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 通信 (高速传输)
python
# ===== UDP Server =====
import socket
server = 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 socket
client = 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.串口通信 (设备直连)
python
# 首先安装: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粘包处理 :使用消息头声明长度 或 添加特殊分隔符
python# 发送带长度的消息 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