我想为 pyserial 包(适用于 Windows)创建一个正确的 readinto 函数。 pyserial 通过调用 read() 来实现 readinto(),这违背了 readinto 的目的。调整现有的 read() 函数似乎很容易接受内存视图:
def serial_read_into(serial_object, buf, size) -> int:
if not serial_object.is_open:
raise PortNotOpenError()
if size == 0:
return 0
win32.ResetEvent(serial_object._overlapped_read.hEvent)
flags = win32.DWORD()
comstat = win32.COMSTAT()
if not win32.ClearCommError(serial_object._port_handle, ctypes.byref(flags), ctypes.byref(comstat)):
raise SerialException("ClearCommError failed ({!r})".format(ctypes.WinError()))
length = min(comstat.cbInQue, size) if serial_object.timeout == 0 else size
if length == 0:
return 0
# buf = ctypes.create_string_buffer(n) <---- Note this in the read() implementation
rc = win32.DWORD()
read_ok = win32.ReadFile(
serial_object._port_handle,
buf,
size,
ctypes.byref(rc),
ctypes.byref(serial_object._overlapped_read))
if not read_ok and win32.GetLastError() not in (win32.ERROR_SUCCESS, win32.ERROR_IO_PENDING):
raise SerialException("ReadFile failed ({!r})".format(ctypes.WinError()))
result_ok = win32.GetOverlappedResult(
serial_object._port_handle,
ctypes.byref(serial_object._overlapped_read),
ctypes.byref(rc),
True)
if not result_ok:
if win32.GetLastError() != win32.ERROR_OPERATION_ABORTED:
raise SerialException("GetOverlappedResult failed ({!r})".format(ctypes.WinError()))
read = rc.value
return read
问题:win32.ReadFile() 函数不接受内存视图。如何将内存视图传递给 win32.ReadFile() 函数? 错误是
ctypes.ArgumentError: argument 2: <class 'TypeError'>: wrong type
我有一个内存视图,因为我想接收到 multiprocessing.SharedMemory 区域而无需额外复制。
下面从内存视图中获取一个 char*,它与 win32.ReadFile 调用一起使用:
dst = (ctypes.c_char * size).from_buffer(buf)