pySerial serial.open () работает в интерактивной оболочке, но вызывает исключение как скрипт - PullRequest
0 голосов
/ 11 сентября 2018

РЕДАКТИРОВАТЬ: Кажется, проблема может быть связана с 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(), оболочка блокируется до тех пор, пока не будет установлено соединение, а светодиод не горит.

Пожалуйста, дайте мне знать, если какая-либо дополнительная информация поможет.

1 Ответ

0 голосов
/ 28 мая 2019

хорошо, вы знаете Bluetooth, он не работает с первой попытки, просто попробуйте один, два и три ...

def getSerialOrNone(port, conn_att):
connec_attempts = 0
ser = None
while ser is None:
    try:
        connec_attempts+=1
        print('connect attempts to %s num %d' % (port , (connec_attempts)))
        ser = serial.Serial(port, 9600,timeout=1.5, parity=serial.PARITY_NONE, 
                                stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS)
        if connec_attempts == conn_att:
                print('Serial connection error',
                                       'Failed to commect to port  ', self.port  )        
                return None
#time.sleep(2)
    except Exception as e:
            print('Serial connection error',
                                   'Error sending message "%s" to controller:\n%s' %
                               (port, e))     
return ser
...