将内存视图传递给 win32.ReadFile 以用于 Pyserial readinto() 函数

问题描述 投票:0回答:1

我想为 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 区域而无需额外复制。

python pyserial
1个回答
0
投票

下面从内存视图中获取一个 char*,它与 win32.ReadFile 调用一起使用:

dst = (ctypes.c_char * size).from_buffer(buf)

© www.soinside.com 2019 - 2024. All rights reserved.