我已经查看了一些线程来解决类似的问题,但是还没有看到任何针对这个特定问题的线程。
我在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
答案 0 :(得分:1)
>>> struct.pack('<I', 1234567)
b'\x87\xd6\x12\x00'
>>> struct.pack('>I', 1234567)
b'\x00\x12\xd6\x87'
发送其中一个,然后将另一侧的4个字节读入long
。