Как я могу зафиксировать “[Ошибку 6], дескриптор недопустим”. с PySerial

Я пытаюсь подключить к своему телефону от моего использования Windows 7 PC PySerial со следующим кодом:

import wmi
import serial

c = wmi.WMI()
modem = c.query("SELECT * FROM Win32_POTSModem").pop()
ser = serial.Serial(modem.AttachedTo, modem.MaxBaudRateToSerialPort)

try:
    ser.write('at \r\n')
    print ser.readline()
finally:
    ser.close()

Но получите следующую ошибку на вызове записи:

Traceback (most recent call last):
  File "D:\Alasdair\Documents\Python Scripts\Phone Interface\test.py", line 14, in <module>
    ser.write('at \r\n')
  File "C:\Python26\Lib\site-packages\serial\serialwin32.py", line 255, in write
    raise SerialException("WriteFile failed (%s)" % ctypes.WinError())
SerialException: WriteFile failed ([Error 6] The handle is invalid.)

Я попытался соединиться с TeraTerm, и это хорошо работает, таким образом, это не проблема с соединением с самим телефоном.

Я искал вокруг целую вечность попытки найти решение, но не придумал ничего, что работает. Какие-либо идеи?

7
задан skaffman 22 May 2011 в 16:08
поделиться

1 ответ

Я использую 64-разрядную версию Windows 7 с python 2.6, и это дает мне ту же ошибку.

ser = serial.Serial(3,115200,timeout=1)
ser.read()
#or ser.write("whatever")

Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    ser.read(1)
  File "build\bdist.win-amd64\egg\serial\serialwin32.py", line 236, in read
    raise SerialException("ReadFile failed (%s)" % ctypes.WinError())
SerialException: ReadFile failed ([Error 6] The handle is invalid.)

При использовании аналогичной программы с библиотекой c тот же порт отвечает правильно. Что здесь происходит? Похоже на ошибку в pyserial или ctypes. Вы тоже используете 64-битную версию?

исходный код для записи на pyserial выглядит очень просто

def write(self, data):
        """Output the given string over the serial port."""
        if not self.hComPort: 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 = bytes(data)
        if data:
            #~ win32event.ResetEvent(self._overlappedWrite.hEvent)
            n = win32.DWORD()
            err = win32.WriteFile(self.hComPort, data, len(data), ctypes.byref(n), self._overlappedWrite)
            if not err and win32.GetLastError() != win32.ERROR_IO_PENDING:
                raise SerialException("WriteFile failed (%s)" % ctypes.WinError())

возможно проблема с 64-битными ctypes?


Обновление: Определенно 64-битная проблема, по крайней мере, для меня. Я только что установил x86-версию python (на этот раз 3.1), и теперь она работает нормально. По-видимому, 64-битные типы могут импортировать только 64-битные библиотеки. Однако звучит очень странно, что невозможно получить доступ к библиотекам операционной системы.

6
ответ дан 6 December 2019 в 15:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: