Я пытаюсь подключить к своему телефону от моего использования 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, и это хорошо работает, таким образом, это не проблема с соединением с самим телефоном.
Я искал вокруг целую вечность попытки найти решение, но не придумал ничего, что работает. Какие-либо идеи?
Я использую 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-битные библиотеки. Однако звучит очень странно, что невозможно получить доступ к библиотекам операционной системы.