【问题标题】:Using serializing an object in python for use with an XBee在 python 中使用序列化对象以与 XBee 一起使用
【发布时间】:2018-06-28 18:27:43
【问题描述】:

对于我正在进行的一个项目,我应该使用 XBee 无线电模块,这不是很重要,除了我必须读写它们的串行端口才能使用它们。我目前正在使用 Python 和 ROS,因此我正在尝试通过 XBees 发送 TransformStamped 消息。

我的问题是,除非我误解了 Serial.read() 和 Serial.write() 的工作原理,否则我怎么知道要读取多少字节?我打算使用 Pickle 将数据序列化为字符串,然后通过串行端口发送。有没有更好的方法被我忽略了?是否有某种循环可以读取数据,直到读取腌制字符串的末尾?

【问题讨论】:

    标签: python serialization deserialization ros robotics


    【解决方案1】:

    简短的回答是,serial.read() 无法告诉您要读取多少字节。要么您对消息的长度有一些先验知识,要么您发送的数据具有某种表示消息之间边界的方法。

    提示;知道一条消息有多长是不够的,您还需要知道一条消息实际开始在接收到的字节流中的下落。您不确定接收到的字节是否与发送的字节完全对齐:您可能没有在发送器之前启动接收器,因此它们可能不同步。

    对于任何序列化,人们不得不问,它是自定界的,还是不是?谷歌协议缓冲区不是。我认为泡菜也不是。至少在某种程度上,ASN.1 BER 是。 XML 也是如此。

    关键是 XBee 模块(假设您使用的是来自 Digi 的模块)只是不可靠的字节传输,因此无论您通过它们输入什么,都必须以某种方式进行分隔,以便接收端知道它何时具有完整的信息。因此,如果您使用 pickle 或 Google Protocol Buf 您的消息,您需要一些其他方式来构建序列化数据,以便接收端知道它有一个完整的消息(即它可以看到开头 结尾)。这可以像一些字节模式(例如 0xffaaccee00112233)一样简单,用于表示一条消息的结束和下一条消息的开始,选择它们不太可能出现在发送的消息本身中。您在接收端的代码将读取并丢弃数据,直到看到该模式,然后将后续数据读入缓冲区,直到它再次看到该模式,然后它才会尝试将数据解酸/解 GPB 回一个东西。

    使用 ASN.1 BER,数据流本身有效地合并了相同的内容,从而为您节省了工作量。它使用标签、值和长度字段来告诉解码器传入的数据,如果传入的数据与原始模式相比对解码器没有意义,则很容易忽略不正确的帧数据。

    这种问题也存在于 tcp 套接字上,尽管至少这些传递或多或少得到保证(您收到的第一个字节是发送的第一个字节)。 Digimesh 连接并不能完全达到与 tcp 套接字相同的保证交付水平,因此接收应用程序需要其他东西(如帧字节模式)才能知道它与发送者同步。

    【讨论】:

    • 感谢您的信息!我不熟悉 ASN.1 BER,但我可能会尝试使用 XML 而不是 pickle 进行编码。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    • 2016-10-01
    • 2019-10-30
    • 1970-01-01
    • 2015-08-13
    • 2016-10-12
    • 2016-01-20
    相关资源
    最近更新 更多