如何用Python接收LIDAR设备发送的UDP数据包?
解决UDP接收LIDAR数据的Socket错误问题
错误原因分析
- WinError 10049:你尝试绑定LIDAR的IP(192.168.1.201),但该IP不属于你的PC,Socket绑定仅能指定本机存在的网络接口IP,或用
0.0.0.0代表监听所有本机IP。 - 绑定PC IP后挂起无输出:默认Socket为阻塞模式,若绑定的端口不是LIDAR发送的目标端口(或绑定配置有误),程序会一直等待数据。需确认LIDAR确实向PC的2368端口发送数据。
- WinError 10035:非阻塞模式下,无数据可接收时调用
recv()会直接抛出该错误,需通过异常捕获或IO多路复用处理此场景。
正确实现代码
方式1:阻塞模式(推荐,简单可靠)
该模式下Socket会等待直到收到数据,适合确认有稳定数据传输的场景:
import socket # 配置参数 PC_IP = "192.168.1.202" LISTEN_PORT = 2368 # LIDAR发送数据的目标端口 # 创建UDP socket sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 绑定本机IP和监听端口,也可用0.0.0.0监听所有接口 sock.bind((PC_IP, LISTEN_PORT)) print(f"等待接收LIDAR数据,绑定地址:{PC_IP}:{LISTEN_PORT}") try: while True: # 接收数据,bufsize设为LIDAR数据包的大小,4096适配多数场景 data, addr = sock.recvfrom(4096) print(f"收到来自{addr}的数据:{data}") # 若需转字符串,可根据LIDAR编码格式处理,例如utf-8: # print(f"收到来自{addr}的字符串数据:{data.decode('utf-8')}") finally: sock.close()
方式2:非阻塞模式(配合异常捕获)
若需同时处理其他任务,可使用非阻塞模式,捕获无数据时的异常:
import socket import time PC_IP = "192.168.1.202" LISTEN_PORT = 2368 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.bind((PC_IP, LISTEN_PORT)) sock.setblocking(0) # 设置为非阻塞模式 print(f"非阻塞模式监听LIDAR数据:{PC_IP}:{LISTEN_PORT}") try: while True: try: data, addr = sock.recvfrom(4096) print(f"收到来自{addr}的数据:{data}") except BlockingIOError: # 无数据时执行其他操作,或短暂休眠 time.sleep(0.01) finally: sock.close()
验证要点
- 用Wireshark确认UDP数据包的目标端口确实为2368。
- 若不确定本机IP,直接用
0.0.0.0代替192.168.1.202,监听所有本机网络接口的对应端口,避免IP配置错误。 - 运行代码前关闭可能占用2368端口的其他程序,避免端口占用导致绑定失败。
内容的提问来源于stack exchange,提问作者Tony Carrick
相关产品推荐
相关产品推荐

