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

相关推荐
遇印记7 小时前
传输层,网络层
运维·服务器·网络·windows·学习
clorinda8 小时前
PyQt5学习:从界面搭建到与机器学习实战
学习
80s77710 小时前
动态IP是什么,动态IP的应用场景有哪些?
网络·网络协议·tcp/ip
欣欣之王来了10 小时前
Vue3项目脚手架:Vite vs Vue CLI怎么选?
前端·学习·架构·项目·vue3教程
kaixin_啊啊10 小时前
【零基础学AI】第 7 章——让 AI 辅助学习和办公
人工智能·学习
信奥卷王10 小时前
[GESP202506 六级] 学习小组(含视频)
学习
ITxiaobing202310 小时前
IP 库与 AppsFlyer 国家/地区数据不一致,如何系统地对账?
数据库·网络协议·tcp/ip
程序猿老A11 小时前
云服务器ECS怎么配置多IP?
运维·服务器·tcp/ip
宛 禾11 小时前
Qt 控件入门:QLabel 从拖拽到对象树,一篇讲透
c++·qt·学习
无敌贵点大王12 小时前
嵌入式软件面试经(自用)
c语言·stm32·单片机·学习·mongodb·面试·职场和发展