РЕДАКТИРОВАТЬ: Кажется, проблема может быть связана с Python 3. Я попытался выполнить сценарий в среде Anaconda Python 2.7.15 и смог заставить его работать.Думая, что это может быть просто Anaconda, я попытался запустить его в среде Anaconda Python 3.6.5 и столкнулся с той же ошибкой.Чтобы удалить переменную Anaconda, я попытался запустить Python 2.7.15 из новой установки без Anaconda и снова смог правильно запустить скрипт.Обратите внимание, что моя первоначальная проблема возникла при работе в среде, отличной от Anaconda Python3.Я не думаю, что это действительно отвечает на этот вопрос, но является своего рода решением для тех, кто сталкивается с той же проблемой.
Windows 10. Python 3.6.5
Я пытаюсь установить / открытьсоединение с подключенным COM-портом через pyserial.Я могу сделать это очень хорошо с помощью оболочки Python, запущенной в cmd, но получаю исключение при запуске его через скрипт.Цепочка исключений такова:
File "C:\Python\Python36-32\lib\site-packages\serial\serialwin32.py", line 62, in open
raise SerialException("could not open port {!r}: {!r}".format(self.portstr, ctypes.WinError()))
serial.serialutil.SerialException: could not open port 'COM8': OSError(22, 'Element not found.', None, 1168)
Сценарий таков:
import serial.tools.list_ports
import time
import sys
SERIAL_CONNECTION_ATTEMPTS = 3
ports = list(serial.tools.list_ports.comports())
bluetoothPorts = []
for p in ports:
if 'Bluetooth' in p.description:
bluetoothPorts.append(p)
print("Found: ", p)
selectedPort = bluetoothPorts[0]
print("selected port: ", selectedPort.device)
ser = serial.Serial()
ser.baudrate = 9600
ser.timeout = 120
ser.port = selectedPort.device
for i in range(0, SERIAL_CONNECTION_ATTEMPTS):
try:
ser.open()
time.sleep(5)
if ser.is_open():
break
except:
print(sys.exc_info())
if i == SERIAL_CONNECTION_ATTEMPTS-1:
print("Failed to connect. Will stop trying now.")
exit()
print("Failed to connect. Retrying...")
ser.close()
time.sleep(5)
print(ser.read(32))
print("Closing out now..")
ser.close()
Успешные соединения с использованием интерактивной оболочки точно следуют сценарию, исключая использование блока try-exc.
Одна вещь, которую я заметил, заключается в том, что целевое устройство, кажется, распознает попытку подключения в течение очень короткого момента.Я могу сделать это предположение, потому что целевое устройство имеет светодиод для указания установленного последовательного соединения.Когда сценарий запускается до ser.open()
, этот светодиод на мгновение мигает, а затем быстро выключается.С другой стороны, когда в интерактивной оболочке предпринимается попытка ser.open()
, оболочка блокируется до тех пор, пока не будет установлено соединение, а светодиод не горит.
Пожалуйста, дайте мне знать, если какая-либо дополнительная информация поможет.