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

相关推荐
旖旎夜光8 小时前
C++(17)
c++·学习
专注于大数据技术栈9 小时前
java学习--StringBuilder
java·学习
qcwl669 小时前
操作系统 真象还原 学习笔记#13
笔记·学习
元亓亓亓9 小时前
考研408--计算机网络--day10--传输层&UDP&TCP
tcp/ip·计算机网络·考研·udp·408
车载测试工程师10 小时前
CAPL学习-CAN相关函数-概述
网络协议·学习·capl·canoe
roman_日积跬步-终至千里10 小时前
【人工智能导论】08-学习-如何让计算机理解序列数据——用RNN/LSTM建模时序依赖,用文本嵌入表示序列元素
人工智能·rnn·学习
m0_6896182810 小时前
30 分钟打印!多材料3D打印软机器人内置驱动 + 自主避障
笔记·学习·机器人
charlie11451419110 小时前
现代嵌入式C++教程:C++98——从C向C++的演化(2)
c语言·开发语言·c++·学习·嵌入式·教程·现代c++
速易达网络11 小时前
基于Java TCP 聊天室
java·开发语言·tcp/ip
Rousson11 小时前
硬件学习笔记--93 静电防护方案(电阻、磁珠、电感、TVS等)
笔记·单片机·学习