Olegansv 10 Posted January 30, 2017 (edited) Всем привет! Написал библиотеку для взаимодействия питона с последовательным портом. Может кому пригодится. 'Код' import os from subprocess import call __isOpened = False def s_init(port, baudRate): try: call(["serial_init.exe", str(port), str(baudRate)]) except WindowsError: print("Error: can't open \"serial_init.exe\"") def s_open(port): global __serial, __isOpened if not __isOpened: try: __serial = os.open(port, os.O_RDWR) except: print("Can't open port %s" % (port)) __isOpened = False else: print("Port %s opened" % (port)) __isOpened = True elif __isOpened: print("Port already opened") def s_close(): global __isOpened if __isOpened: print("Port closed") os.close(__serial) __isOpened = False def s_ports(lim = 10): ports = [] for i in range(1, lim + 1): try: __port = os.open("COM%s" % (i), os.O_RDWR) os.close(__port) except OSError as e: if e.errno == 13: # PermissionError ports.append({"COM%s" % (i): "busy"}) except: continue else: ports.append({"COM%s" % (i): "available"}) return ports def s_read(lastSymbol = '\n'): buffer = "" if __isOpened: while True: received = os.read(__serial, 1024).decode() buffer += received if lastSymbol in buffer: break return buffer def s_send(text): if __isOpened: os.write(__serial, text) def s_isOpened(): return __isOpened 'Описание функций' s_init(port, baudRate) - инициализирует порт. s_open(port) - открывает порт. s_read(lastSymbol) - получает данные с последовательного порта до символа lastSymbol и возращает строку. s_send(text) - отправляет данные по последовательному порту. s_ports(lim) - возращает доступные/занятые порты. s_isOpened() - возращает состояние порта. s_close() - закрывает порт. Файл serial_init.exe используется для инициализации последовательного порта (стандартные средства питона не имеют данной возможности). Билд для WoT. Исходники также здесь. Edited March 9, 2017 by Olegansv 4 Quote Share this post Link to post Short link Share on other sites