TCP、UDP 和串口通信-学习笔记

一、核心概念对比

特性 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("串口已关闭")

三、关键技术要点

  1. TCP粘包处理 :使用消息头声明长度 或 添加特殊分隔符

    python 复制代码
    # 发送带长度的消息
    msg = b"Hello World"
    client.send(len(msg).to_bytes(4, 'big') + msg)
  2. UDP应用控制:需要自行实现超时重传/数据校验

  3. 串口协议设计

    • 常用协议:Modbus, NMEA-0183 (GPS)
    • 数据帧示例:[起始符][长度][数据][校验和][结束符]
  4. 非阻塞通信 :使用setblocking(False) + select模块处理多连接

调试工具推荐

  • TCP/UDP测试:NetAssist (Windows) / nc (Linux)
  • 串口调试:Serial Port Utility (Mac/Win) / CuteCom (Linux)
  • 协议分析:Wireshark

这里是个人常用的调试工具集合

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

相关推荐
shenghaide_jiahu2 小时前
数学分析简明教程——3.5
学习
L.EscaRC3 小时前
【复习408】TCP运输层核心机制
网络协议·tcp/ip
Yurko133 小时前
【计网】基于三层交换机和 RIP 协议的局域网组建
网络·学习·计算机网络·智能路由器
lijun_xiao20094 小时前
Dubbo-学习笔记1
笔记·学习
奋斗的牛马4 小时前
硬件工程师-基础知识电阻(四)
单片机·嵌入式硬件·学习·fpga开发
楼田莉子4 小时前
Linux学习:进程的控制
linux·运维·服务器·c语言·后端·学习
降临-max5 小时前
OpenStack创建实例一直处于创建且未分配IP问题解决
笔记·学习·openstack
老虎06276 小时前
黑马点评学习笔记10(优惠券秒杀下单优化(分布式锁的优化,Lua脚本))
笔记·分布式·学习
递归不收敛6 小时前
config.json 完全指南:项目配置的核心实践
笔记·学习·json