在Python 3中使用PySerial串行发送字节

时间:2016-10-29 00:29:15

标签: python-3.x pyserial

我已经查看了一些线程来解决类似的问题,但是还没有看到任何针对这个特定问题的线程。

我在Python 3.5中使用PySerial库,程序传输的csv文件只包含0 - >范围内的整数值。 2G(千兆),这意味着每个整数值可以是1到4个字节。

内置的Python bin()函数很好地为我提供了要传输的整数的二进制STRING表示。然后我可以删除" 0b"在字符串的前面,以传输剩余字符串的int()值。我遇到的问题是使用Pyserial的write()函数。

write()函数只接受序列(bytesarray,bytes等)。如果我将二进制值转换为bytesarray(),它将返回我的二进制值的每个数字的值数组(0-256),这不是我想要的。

当我进行任何类型的编码时,我可以在Hercules中看到每个位都以字节形式发送。例如,

00001000 results in 8 bytes being sent.
Terminal: {30}{30}{30}{30}{31}{30}{30}{30}

如果我尝试传输十六进制值,我会遇到同样的问题。所以我的问题是,如何使用Pyserial的库将我的二进制数据作为真正的字节传输。

如果我的问题不明确,请告诉我,我会尝试澄清。基本上,最终结果将是:

00001000 results in 1 bytes being sent.
Terminal: {08}

我对write()定义做了一些调整,看看我能不能做到我想做的事情,但是我对python做得不够熟练,无法做出任何重大改变。这是最初的定义:

def write(self, data):
    """Output the given byte string over the serial port."""
    if not self.is_open:
        raise portNotOpenError
    #~ if not isinstance(data, (bytes, bytearray)):
        #~ raise TypeError('expected %s or bytearray, got %s' (bytes,type(data)))
    # convert data (needed in case of memoryview instance: Py 3.1 io lib), ctypes doesn't like memoryview
    data = to_bytes(data)
    if data:
        #~ win32event.ResetEvent(self._overlapped_write.hEvent)
        n = win32.DWORD()

        success = win32.WriteFile(self._port_handle, data, len(data), ctypes.byref(n), self._overlapped_write)

        if self._write_timeout != 0:  # if blocking (None) or w/ write timeout (>0)
            if not success and win32.GetLastError() != win32.ERROR_IO_PENDING:
                raise SerialException("WriteFile failed ({!r})".format(ctypes.WinError()))

            # Wait for the write to complete.
            #~ win32.WaitForSingleObject(self._overlapped_write.hEvent, win32.INFINITE)
            win32.GetOverlappedResult(self._port_handle, self._overlapped_write, ctypes.byref(n), True)
            if win32.GetLastError() == win32.ERROR_OPERATION_ABORTED:
                return n.value  # canceled IO is no error


            if n.value != len(data):
                raise writeTimeoutError
            return n.value
        else:
            errorcode = win32.ERROR_SUCCESS if success else win32.GetLastError()
            if errorcode in (win32.ERROR_INVALID_USER_BUFFER, win32.ERROR_NOT_ENOUGH_MEMORY,
                             win32.ERROR_OPERATION_ABORTED):
                return 0
            elif errorcode in (win32.ERROR_SUCCESS, win32.ERROR_IO_PENDING):
                # no info on true length provided by OS function in async mode
                return len(data)

            else:
                raise SerialException("WriteFile failed ({!r})".format(ctypes.WinError()))
    else:
        return 0

1 个答案:

答案 0 :(得分:1)

>>> struct.pack('<I', 1234567)
b'\x87\xd6\x12\x00'
>>> struct.pack('>I', 1234567)
b'\x00\x12\xd6\x87'

发送其中一个,然后将另一侧的4个字节读入long