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

相关推荐
lingggggaaaa5 分钟前
炎魂网络 - 安全开发实习生面经
网络·学习·安全·web安全·网络安全
好奇龙猫9 分钟前
日语学习-日语知识点小记-构建基础-JLPT-N3阶段-二阶段(26):语法和单词 第5-6课
学习
知识分享小能手15 分钟前
CentOS Stream 9入门学习教程,从入门到精通, CentOS Stream 9中的文件和目录管理(3)
linux·学习·centos
暗然而日章21 分钟前
C++基础:Stanford CS106L学习笔记 4 容器(STL与序列容器)
c++·笔记·学习
richxu2025100137 分钟前
嵌入式学习之路>(二)单片机核心原理篇>1.GPIO
单片机·嵌入式硬件·学习
敲代码的嘎仔1 小时前
LeetCode面试HOT100——160. 相交链表
java·学习·算法·leetcode·链表·面试·职场和发展
敲代码的嘎仔1 小时前
LeetCode面试HOT100—— 206. 反转链表
java·数据结构·学习·算法·leetcode·链表·面试
丝斯20111 小时前
AI学习笔记整理(19)—— AI核心技术(深度学习3)
人工智能·笔记·学习
自然语1 小时前
深度学习时代结束了,2025年开始只剩下轮廓
数据结构·人工智能·深度学习·学习·算法
im_AMBER1 小时前
Leetcode 66 几乎唯一子数组的最大和
数据结构·笔记·学习·算法·leetcode