Работа с COM-портом в Python — Краткое Руководство


Работа с COM-портом в Python

Работа с COM PORT / UART в Python на примере связи с платой Arduino

Введение

COM-порты до сих пор играют жизненно важную роль в установлении соединений между компьютерами и внешними устройствами. Не следует считать, что COM порт — это нечто безнадежно устаревшее и архаичное. Конечно, вы уже не встретите его в современных гаджетах общего назначения, таких как принтеры, сканеры и т.д. Однако COM порт широко используется до сих пор в промышленной технике, в различных световых рекламных табло. Также без работы с этим портом не обойтись если вы разрабатываете программы для микроконтроллеров, в частности для Arduino.

Python, будучи универсальным и мощным языком программирования, обеспечивает отличную поддержку работы с COM-портами. В этой статье мы рассмотрим, как использовать Python для эффективного взаимодействия с COM-портами, позволяя вам управлять различными устройствами и беспрепятственно собирать данные.

Установка библиотеки PySerial

Для работы с COM-портами в Python нам понадобится библиотека PySerial, предоставляющая удобный интерфейс для последовательной связи. PySerial можно легко установить с помощью pip, менеджера пакетов Python. Откройте терминал или командную строку и выполните следующую команду:

pip install pyserial

Получение списка доступных COM-портов

Перед подключением к определенному COM-порту очень важно определить доступные порты в вашей системе. PySerial предлагает удобную функцию serial.tools.list_ports.comports(), которая возвращает список доступных COM-портов. Давайте посмотрим, как его использовать:

import serial.tools.list_ports

ports = serial.tools.list_ports.comports()

for port in ports:
    print(port.device)

Установка соединения

После того, как вы определили нужный COM-порт, вы можете создать соединение с помощью PySerial. Класс serial.Serial() предоставляет необходимые методы для настройки и управления подключением. Вот пример:

import serial

port = "COM1"  # Replace with the appropriate COM port name
baudrate = 9600  # Replace with the desired baud rate

ser = serial.Serial(port, baudrate=baudrate)

# Perform operations on the COM port

ser.close()  # Remember to close the connection when done

Чтение и запись данных:

Для связи с устройством, подключенным к COM-порту, нам нужно понять, как читать и записывать данные. PySerial предлагает для этой цели два основных метода: ser.read() и ser.write(). Давайте рассмотрим эти методы:

# Reading data
data = ser.read(10)  # Read 10 bytes from the COM port
print(data)

# Writing data
message = b"Hello, world!"  # Data to be sent, should be in bytes
ser.write(message)

Настройка параметров COM порта

PySerial предоставляет широкие возможности для настройки COM-портов в соответствии с конкретными требованиями. Вы можете настроить такие параметры, как биты данных, стоповые биты, четность, время ожидания и управление потоком. Вот пример:

ser = serial.Serial(port, baudrate=baudrate, bytesize=8, parity='N', stopbits=1, timeout=1, xonxoff=False, rtscts=False)
# Adjust the parameters as needed

Обработка ошибок

При работе с COM-портами очень важно корректно обрабатывать ошибки. PySerial вызывает исключения для различных сценариев ошибок, таких как ненайденный порт, отказ в доступе или тайм-ауты связи. Реализация соответствующей обработки ошибок обеспечивает надежность ваших приложений.

Вот пример обработки ошибок при работе с COM-портами в Python с помощью PySerial:

import serial
import serial.tools.list_ports

try:
    # Find and open the COM port
    ports = serial.tools.list_ports.comports()
    port = next((p.device for p in ports), None)
    if port is None:
        raise ValueError("No COM port found.")

    ser = serial.Serial(port, baudrate=9600)

    # Perform operations on the COM port

    ser.close()  # Close the connection when done

except ValueError as ve:
    print("Error:", str(ve))

except serial.SerialException as se:
    print("Serial port error:", str(se))

except Exception as e:
    print("An error occurred:", str(e))

В этом примере мы пытаемся найти и открыть COM-порт, используя serial.tools.list_ports.comports(). Если COM-порт не найден, возникает ошибка ValueError. Если существует исключение последовательного порта, например порт уже используется или недоступен, перехватывается SerialException. Любые другие общие исключения перехватываются блоком Exception, который обеспечивает сбор всех непредвиденных ошибок. Каждый блок ошибок обрабатывает определенный тип исключения и выводит соответствующее сообщение об ошибке.

Реализуя обработку ошибок таким образом, вы можете изящно обрабатывать различные сценарии ошибок, которые могут возникнуть при работе с COM-портами в Python.

Пример приложения для получения данных из платы Arduino

Вот пример приложения Python, которое считывает данные из платы Arduino с помощью PySerial

import serial

# Configure the COM port
port = "COM3"  # Replace with the appropriate COM port name
baudrate = 9600

try:
    # Open the COM port
    ser = serial.Serial(port, baudrate=baudrate)
    print("Serial connection established.")

    # Read data from the Arduino
    while True:
        # Read a line of data from the serial port
        line = ser.readline().decode().strip()

        if line:
            print("Received:", line)

except serial.SerialException as se:
    print("Serial port error:", str(se))

except KeyboardInterrupt:
    pass

finally:
    # Close the serial connection
    if ser.is_open:
        ser.close()
        print("Serial connection closed.")

В этом примере мы открываем указанный COM-порт с помощью serial.Serial(), а затем непрерывно считываем данные с Arduino с помощью цикла while. Функция ser.readline().decode().strip() считывает строку данных из последовательного порта, декодирует ее из байтов в строку и удаляет все начальные или конечные пробелы. Если есть доступные данные, они выводятся на консоль.

Приложение будет продолжать работать до тех пор, пока оно не будет прервано ошибкой последовательного порта (serial.SerialException) или нажатием Ctrl+C, чтобы вызвать прерывание клавиатуры. В блоке finally мы обеспечиваем правильное закрытие последовательного соединения с помощью ser.close().

Не забудьте заменить «COM3» на соответствующее имя COM-порта, чтобы оно соответствовало соединению вашего Arduino. Кроме того, настройте значение скорости передачи данных, если ваш Arduino использует другую скорость передачи данных.

Пример приложения для отправки данных в плату Arduino

Вот пример приложения Python, которое отправляет последовательные данные на Arduino для управления устройством на основе Arduino:

import serial

# Configure the COM port
port = "COM3"  # Replace with the appropriate COM port name
baudrate = 9600

try:
    # Open the COM port
    ser = serial.Serial(port, baudrate=baudrate)
    print("Serial connection established.")

    # Send commands to the Arduino
    while True:
        command = input("Enter a command (e.g., 'ON', 'OFF'): ")

        # Send the command to the Arduino
        ser.write(command.encode())

except serial.SerialException as se:
    print("Serial port error:", str(se))

except KeyboardInterrupt:
    pass

finally:
    # Close the serial connection
    if ser.is_open:
        ser.close()
        print("Serial connection closed.")

В этом примере мы открываем указанный COM-порт с помощью serial.Serial(), а затем постоянно запрашиваем у пользователя ввод команд. Команда считывается с помощью input(), а затем отправляется в Arduino с помощью ser.write(command.encode()), где command.encode() преобразует команду из строки в байты перед отправкой через последовательный порт. .

Приложение будет продолжать работать до тех пор, пока оно не будет прервано ошибкой последовательного порта (serial.SerialException) или нажатием Ctrl+C, чтобы вызвать прерывание клавиатуры. В блоке finally мы обеспечиваем правильное закрытие последовательного соединения с помощью ser.close().

Не забудьте заменить «COM3» на соответствующее имя COM-порта, чтобы оно соответствовало соединению вашего Arduino. Отрегулируйте значение скорости передачи данных, если ваш Arduino использует другую скорость передачи данных.

С помощью этого кода вы сможете отправлять команды из своего приложения Python на Arduino и соответствующим образом управлять своим устройством на базе Arduino.

Заключение

Python в сочетании с библиотекой PySerial обеспечивает надежный и простой способ работы с COM-портами. Поняв основы COM-портов, установив PySerial и используя его возможности, вы сможете без труда взаимодействовать с внешними устройствами, собирать данные и управлять аппаратными компонентами. Независимо от того, создаете ли вы проект IoT, работаете с датчиками или взаимодействуете с микроконтроллерами, Python предлагает универсальную платформу для достижения ваших целей.

Читать также:
Работа с COM-PORT в C#…
Работа с COM-PORT в Delphi…

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *