【发布时间】:2013-09-19 00:55:24
【问题描述】:
我正在运行一个 python 脚本,通过 UDP 从 Arduino 的模拟输入接收数据。
import socket
UDP_IP = "10.0.0.222"
UDP_PORT = 50000
sock = socket.socket(socket.AF_INET, # Internet
socket.SOCK_DGRAM) # UDP
sock.bind((UDP_IP, UDP_PORT))
while True:
data, addr = sock.recvfrom(12) # buffer size is 32 bytes
print len(data) #check length of data recived
sensors = struct.unpack('>hhhhhh', data)
print sensors
Arduino 正在发送一个 12 字节数据包中的 6 个模拟读数数据包。每个读数都是一个 2 字节的 16 位整数,首先是 LSB,然后是 MSB。我的脚本工作正常,直到 Arduino 上的一个读数值降至 255 以下。此时,Arduino 发送一个空字符 \x00。发生这种情况时,脚本将不再读取任何数据并停止运行。我认为我遇到的问题是将 UDP 数据读入字符串,我已经研究过使用 sock.recv_into() 但没有找到任何我理解的示例,任何帮助或指针将不胜感激。 谢谢 史蒂夫
【问题讨论】:
-
当我向它发送一个包含 12 个字节且全为零的数据包时,您的程序对我来说运行良好……问题是 Arduino 发送的数据包仅包含一个字节吗?如果是这样,您可以通过在尝试执行 struct.unpack() 之前检查 len(data) 来处理它。 Python中的FWIW字符串可以并且确实在任意位置包含NUL字节(因此它们也可以保存任意二进制数据,如您的示例所示);所以这不是问题。但是 struct.unpack() 如果你没有向它传递预期的数据量,它就会出错。