You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Wireshark可捕获MCU发送的UDP数据包但Python脚本无法读取

问题描述

我通过以太网端口从微控制器(MCU)向PC发送数据,Wireshark能验证数据传输成功,但Python脚本无法读取该数据。

  • 已实现Python脚本向MCU发送数据(功能正常),但接收MCU响应失败
  • MCU的响应可在Wireshark中捕获,但Python脚本无输出

PC IPv4配置

  • IPv4地址:192.168.0.3
  • 子网掩码:255.255.255.0
  • 默认网关:192.168.0.1

MCU网络配置

#define ETHERNET_CONF_IPADDR0                         192
#define ETHERNET_CONF_IPADDR1                         168
#define ETHERNET_CONF_IPADDR2                         0
#define ETHERNET_CONF_IPADDR3                         2


#define ETHERNET_CONF_GATEWAY_ADDR0                   192
#define ETHERNET_CONF_GATEWAY_ADDR1                   168
#define ETHERNET_CONF_GATEWAY_ADDR2                   0
#define ETHERNET_CONF_GATEWAY_ADDR3                   250

/** The network mask being used. */
#define ETHERNET_CONF_NET_MASK0                       255
#define ETHERNET_CONF_NET_MASK1                       255
#define ETHERNET_CONF_NET_MASK2                       255
#define ETHERNET_CONF_NET_MASK3                       0

当前Python接收脚本

import socket

def receive_udp_data(host, port):
    # Create a UDP socket
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    # Bind the socket to the specified host and port
    udp_socket.bind((host, port))
    print(f"Listening for UDP data on {host}:{port}")

    try:
        while True:
            # Receive data from the socket
            data, addr = udp_socket.recvfrom(1024)

            # Print the received data
            print(f"Received data from {addr}: {data.decode('utf-8')}")

    except KeyboardInterrupt:
        print("Stopping UDP listener...")
    finally:
        # Close the socket when done
        udp_socket.close()

if __name__ == "__main__":
    # Set the host and port to listen on
    host = "192.168.0.3"  # Listen on all available interfaces
    port =1234  # Choose a suitable port

    # Start listening for UDP data
    receive_udp_data(host, port)
排查与解决方法

1. 核对Wireshark数据包细节

  • 确认数据包的目标IP是192.168.0.3、目标端口是1234,协议类型为UDP
  • 检查数据包内容编码:若不是UTF-8格式,decode('utf-8')会导致解码失败

2. 修改Socket绑定地址

脚本注释标注监听所有接口,但实际绑定了192.168.0.3,若PC有多网卡(如WiFi+以太网),可能数据包走了其他接口,改为绑定所有接口:

host = "0.0.0.0"  # 监听所有可用网络接口

3. 检查端口占用

确认1234端口未被其他程序占用:

  • Windows:执行netstat -ano | findstr :1234
  • Linux/macOS:执行lsof -i :1234
    若端口被占用,更换端口(如5000),同时同步修改MCU端的目标端口配置

4. 验证网络连通性

在PC上执行ping 192.168.0.2测试与MCU的双向连通性,若不通,检查以太网链路或MCU网络配置是否生效

5. 增加异常处理定位问题

添加解码异常处理,避免脚本崩溃并查看原始数据:

try:
    print(f"Received data from {addr}: {data.decode('utf-8')}")
except UnicodeDecodeError:
    print(f"Received data from {addr}: (非UTF-8数据) {data.hex()}")

6. 检查防火墙设置

临时关闭PC防火墙测试,或添加允许Python程序接收UDP端口1234入站数据的规则

内容的提问来源于stack exchange,提问作者uday10022

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 08:13:27