【问题标题】:Dealing with Null Character when receiving UDP in Python在 Python 中接收 UDP 时处理空字符
【发布时间】: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() 如果你没有向它传递预期的数据量,它就会出错。

标签: python sockets null udp


【解决方案1】:

您不能将二进制数据视为以空字符结尾的字符串,特别是您不能使用字符串函数来确定其长度。数据报包含接收到的数据的长度。确定 Python 提供了一种从数据报中获取它的方法吗?

【讨论】:

  • Python 中的字符串不是 NUL 终止的;它们可以包含任意二进制数据。
  • Python 字符串(与任何其他 Python 对象一样)由 Python 解释器存储为 C 结构——在本例中,它是 PyStringObject。该结构包含一个名为 ob_size 的成员变量,它是对象占用的字节数。所以 len() 调用了 C 函数 PyString_GetSize(),它返回一个从 ob_size 值派生的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-10
  • 1970-01-01
  • 1970-01-01
  • 2013-11-19
  • 2013-03-29
  • 1970-01-01
相关资源
最近更新 更多