2016-09-27 5 views
6

Я подключаюсь к устройству, используя удар кода в MacOS, и из 100 раз этот код будет устанавливать соединение только 1 или 2 раза и не отвечает (поскольку нет таймаута) времена.Чтение последовательного выхода из Pyserial не работает надежно

ser = serial.Serial(port="/dev/xyz",timeout = None, baudrate=115200, parity = serial.PARITY_NONE, bytesize = serial.EIGHTBITS, stopbits = serial.STOPBITS_ONE) 

def exitSer(ser): 
    print("Closing") 
    ser.close() 

atexit.register(exitSer, ser) 

if ser.is_open: 
    time.sleep(2) 
    while(1): 
     print(ser.readline().decode("utf-8")) 

Не могли бы вы сказать мне, как использовать такие программы, как Fcntl и т.д., чтобы найти, если этот порт является полностью бесплатным и доступным для использования и как установить флаги TTY порта, чтобы освободить после создания порта бесплатно принудительно.

Как только это работает, я должен запустить эту многопоточность, где в каждом потоке работают разные устройства, ожидающие вывода в строках. Любые предложения для этого на всякий случай, если это работает.

+0

Другое приложение, к которому вы обращаетесь, имеет разную скорость и использует 1 стоповый бит. Не могли бы вы опубликовать код, который вы используете для чтения данных из последовательного порта? –

+0

Просто обновил вопрос. Спасибо за ответ. –

+1

Я стараюсь избегать использования readline() на последовательных устройствах, поскольку он сначала пишет что-то, когда вы получаете новый символ строки. Поэтому, если что-то еще получено, вы не увидите этого. Вместо этого вы можете использовать что-то вроде: sys.stdout.write (ser.read (1)) sys.stdout.flush() –

ответ

0
def startSerial(tty_id): 
    ser = serial.Serial(port = tty_id, timeout = None) 
    ser.close() 
    ser.open() 
    if ser.isOpen(): 
     print(ser.portstr, ":connection successful.") 
     return ser 
    else: 
     return False 

Вызов ser.close() перед .open() исправил его. Я тестировал его примерно 200 раз, и до сих пор я не был разочарован. Я тестирую его сейчас многопоточно и, надеюсь, это тоже работает.

Спасибо всем.