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

相关推荐
暖阳之下6 小时前
学习周报三十三
学习
写点什么呢6 小时前
Ltspice_安装与使用
学习·测试工具
CappuccinoRose6 小时前
CSS前端布局总指南
前端·css·学习·布局·flex布局·grid布局·float布局
mango_mangojuice6 小时前
Linux学习笔记(角色,权限管理)1.21
linux·笔记·学习
pythonchashaoyou6 小时前
静态住宅ip是什么,静态住宅IP选型全解
网络·网络协议·tcp/ip
REDcker7 小时前
HTTP请求数据包流转详解:localhost、127.0.0.1、公网 IP、公网域名访问时的数据流转
网络·tcp/ip·http
好奇龙猫8 小时前
【人工智能学习-AI入试相关题目练习-第十六次】
人工智能·学习
啊我不会诶8 小时前
Codeforces Round 1071 (Div. 3) vp补题
开发语言·学习·算法
星火开发设计9 小时前
命名空间 namespace:解决命名冲突的利器
c语言·开发语言·c++·学习·算法·知识
强子感冒了9 小时前
CSS基础学习:CSS选择器与优先级规则
前端·css·学习