Short introduction¶
Open port at “38400,8,E,1”, non blocking HW handshaking:
>>> ser = serial.Serial('COM3', 38400, timeout=0, . parity=serial.PARITY_EVEN, rtscts=1) >>> s = ser.read(100) # read up to one hundred bytes . # or as much is in the buffer
Configuring ports later¶
Get a Serial instance and configure/open it later:
>>> ser = serial.Serial() >>> ser.baudrate = 19200 >>> ser.port = 'COM1' >>> ser Serial(port='COM1', baudrate=19200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=0, rtscts=0) >>> ser.open() >>> ser.is_open True >>> ser.close() >>> ser.is_open False
with serial.Serial() as ser: ser.baudrate = 19200 ser.port = 'COM1' ser.open() ser.write(b'hello')
Readline¶
readline() reads up to one line, including the \n at the end. Be careful when using readline() . Do specify a timeout when opening the serial port otherwise it could block forever if no newline character is received. If the \n is missing in the return value, it returned on timeout.
readlines() tries to read “all” lines which is not well defined for a serial port that is still open. Therefore readlines() depends on having a timeout on the port and interprets that as EOF (end of file). It raises an exception if the port is not opened correctly. The returned list of lines do not include the \n .
Both functions call read() to get their data and the serial port timeout is acting on this function. Therefore the effective timeout, especially for readlines() , can be much larger.
Do also have a look at the example files in the examples directory in the source distribution or online.
The eol parameter for readline() is no longer supported when pySerial is run with newer Python versions (V2.6+) where the module io is available.
EOL¶
To specify the EOL character for readline() or to use universal newline mode, it is advised to use io.TextIOWrapper:
import serial import io ser = serial.serial_for_url('loop://', timeout=1) sio = io.TextIOWrapper(io.BufferedRWPair(ser, ser)) sio.write(unicode("hello\n")) sio.flush() # it is buffering. required to get the data out *now* hello = sio.readline() print(hello == unicode("hello\n"))
Testing ports¶
Listing ports¶
python -m serial.tools.list_ports will print a list of available ports. It is also possible to add a regexp as first argument and the list will only include entries that matched.
The enumeration may not work on all operating systems. It may be incomplete, list unavailable ports or may lack detailed descriptions of the ports.
Accessing ports¶
pySerial includes a small console based terminal program called serial.tools.miniterm . It can be started with python -m serial.tools.miniterm (use option -h to get a listing of all options).
© Copyright 2001-2020, Chris Liechti Revision 31fa4807 .
Versions latest stable Downloads pdf html epub On Read the Docs Project Home Builds Free document hosting provided by Read the Docs.
Как настроить USB-последовательное подключение программы #1
Использование последовательного USB-кабеля применяется, когда соединение, которое вы хотите установить, находится между вашим компьютером или мэйнфреймом, имеющим только USB-порт, и устройством, имеющим только последовательный порт. На компьютере также находится программа, с помощью которой мы хотели бы инициировать связь и управлять потоком к терминалу/устройству.
| Компьютер: Моя программа | USB→ USB-SERIAL→ последовательный порт RS232 | Устройство|
Некоторые факты
- Кабель usb-serial основан на чипе, который соединяет протоколы USB ‹-›serial.
- необходимо установить драйвера, которые обычно можно найти на сайте производителя
Используемый кабель
Конвертер USB-Serial: Адаптер ATEN USB-RS-232 (35 см) UC232A
Система: macOS
Язык: Python
Библиотека: PySerial
Установить PySerial :
- установить из пункта: python -m pip install pyserial
- установите pip в macOS (если у вас еще нет pip):
«Как установить pip в macOS? — GeeksforGeeks
Необходимое условие: введение в язык Python
Используйте PySerial :
Соединять
Подключите usb — последовательный порт к Mac и устройству
Установите драйверы USB-последовательного преобразователя для macOS. Драйверы обычно разрабатываются производителями микросхем преобразователя/контроллера моста преобразователя USB-Serial. Например, адаптер ATEN USB to RS-232 (35 см) UC232A использует чип «PL2303hxd» (извините, забыл название производителя, тайваньская компания, насколько я помню).
Найти порт
в терминале macOS введите ioreg -p IOUSB , проверьте, видите ли вы «USB-последовательный контроллер D» (для ATEN UC232A) или любое другое имя последовательного контроллера в разделе «Концентратор USB 2.0» или «Концентратор USB 3.0», или просто ls /dev/cu* , чтобы проверить, есть ли это любой «usbserial» порт.
В python используйте serial.tools.list_ports.comports() (предлагается pyserial ) для перечисления всех портов. проверьте, подходит ли какой-либо дескриптор к используемому вами продукту USB-последовательного преобразователя. Запишите порт для последующего использования.
python import serial from serial.tools import list_ports enmu_ports = enumerate(list_ports.comports()) port = "" for n, (p, descriptor, hid) in enmu_ports: print(p, descriptor, hid) if descriptor == “USB-Serial Controller D”: port = p
Не знаю как у вас на Маке, но там 2 порта
/dev/cu.usbserial-14110 /dev/cu.usbserial-14
которые имеют тот же дескриптор на моем Mac. Не знаю, почему. Выберите тот, который работает… Я выбрал более длинный, так как говорят, что число в конце порта указывает на его baud rate . Так что более длинный определенно больше похож на него…
Настройте порт
port = “/dev/cu.usbserial-14110” serial = serial.Serial() serial.port = port serial.baudrate = 115200 serial.timeout = 1
serial.timeout : если установлено 0, означает отсутствие ожидания. Немедленно прочитайте/запишите и считайте, что это сделано. Единица вторая. Например, если serial.timeout=2 и вызвать read(1024) , это означает: if received=1024 or 2seconds expired , он переходит к выполнению следующей строки.
serial.baudrate скорость, по-моему по умолчанию 9600 но вроде самая низкая? Это зависит от устройства.
serial.parity нечетное или четное
В pyserial есть и другие параметры, которые вы можете установить для управления способом передачи данных через последовательный порт, но в основном вы можете оставить все по умолчанию, но настроить желаемую скорость передачи данных и время ожидания.
Напишите
- прежде чем что-либо отправлять, самое главное предварительно обработать данные. Отправить строку char очень просто. Но отправка шестнадцатеричных строк требует небольшого преобразования — для этого требуются байты или массив байтов:
message = “80FE0EAA81B9CDA60003” #message_hex = message.encode(“hex”) #python v2.7 message_bytes = bytes.fromhex(message) #python V3+ message_barry = bytearray.fromhex(message) #python v3+ serial.open() # here apply some logics to make sure port is really opened serial.write(message_barry) serial.flush()
Читать
- чтение немного сложнее; обычно это происходит после отправки, но может затормозить основной поток (требуется ожидание), и с ним нужно обращаться деликатно.
- В зависимости от фактического устройства, с которым вы имеете дело, слишком раннее или слишком позднее получение может привести к осложнениям. Вы можете разработать свои собственные стратегии, либо подождать в основном потоке, либо использовать отдельный поток.
- но в любом случае ванильный прием:
serial.timeout = 100 #up to you received = serial.read(1024) # either it collects all 1024 bytes or timeout, whichever happens ealier
4. У pyserial есть поток, ожидающий получения. Только после явного вызова read() он выдает данные при выполнении заданных условий. Но если вы не сможете извлечь данные за заданное время, более новые данные могут сбросить буфер приема (до его емкости). В значительной степени вы уже должны знать, чего ожидать от передачи данных на устройство и с него. Итак, следуйте намеченному потоку.