【问题标题】:Binary data with pyserial(python serial port)带有pyserial(python串口)的二进制数据
【发布时间】:2010-10-03 03:29:51
【问题描述】:
pyserial 中的

serial.write() 方法似乎只发送字符串数据。我有像 [0xc0,0x04,0x00] 这样的数组,并且希望能够通过串口发送/接收它们?是否有任何单独的原始 I/O 方法?

我想我可能需要将数组更改为 ['\xc0','\x04','\x00'],但空字符可能会造成问题。

【问题讨论】:

    标签: python binary serial-port pyserial


    【解决方案1】:

    另一种方法,不使用array 模块:

    def a2s(arr):
        """ Array of integer byte values --> binary string
        """
        return ''.join(chr(b) for b in arr)
    

    【讨论】:

    • 地图可能会更快:def a2s(arr): return ''.join(map(chr,arr))
    【解决方案2】:

    您需要将数据转换为字符串

    "\xc0\x04\x00"
    

    空字符在 Python 中不是问题——字符串不是以空字符结尾的,零字节的行为就像另一个字节 "\x00"

    一种方法:

    >>> import array
    >>> array.array('B', [0xc0, 0x04, 0x00]).tostring()
    '\xc0\x04\x00'
    

    【讨论】:

      【解决方案3】:

      我遇到了类似(但可以说更糟)的问题,必须通过 UART 从 python 脚本发送控制位来测试嵌入式设备。我的数据定义是“field1:8 位,field2:3 位,field3 7 位”等。事实证明,您可以使用 BitArray 库为此构建一个强大而干净的接口。这是一个 sn-p(减去串行设置)

      from bitstring import BitArray
      
      cmdbuf = BitArray(length = 50)     # 50 byte BitArray
      cmdbuf.overwrite('0xAA', 0)       # Init the marker byte at the head
      

      这就是它变得灵活的地方。下面的命令替换了 4 位 位位置 23 与 4 位通过。请注意,它需要一个二进制文件 位值,以字符串形式给出。我可以在任何位置设置/清除任何位 这样在缓冲中,不用担心踩到 相邻字节或位中的值。

      cmdbuf.overwrite('0b0110', 23)
      
      # To send on the (previously opened) serial port 
      ser.write( cmdbuf )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-15
        • 1970-01-01
        • 2017-08-22
        • 2012-06-29
        相关资源
        最近更新 更多