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
相关产品推荐
相关产品推荐

