Python работа с com портом в windows


Работа с 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-порту очень важно определить доступные порты в вашей системе. 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…

I have Python 3.6.1 and PySerial installed. I am able to get a list of COM ports connected. I want to send data to the COM port and receive responses:

import serial.tools.list_ports as port_list
ports = list(port_list.comports())
for p in ports:
    print (p)

Output:

COM7 — Prolific USB-to-Serial Comm Port (COM7)
COM1 — Communications Port (COM1)

From PySerial documentation:

>>> import serial
>>> ser = serial.Serial('/dev/ttyUSB0')  # open serial port
>>> print(ser.name)         # check which port was really used
>>> ser.write(b'hello')     # write a string
>>> ser.close()             # close port

I get an error from ser = serial.Serial('/dev/ttyUSB0') because ‘/dev/ttyUSB0’ makes no sense in Windows. What can I do in Windows?

user4157124's user avatar

user4157124

2,76513 gold badges27 silver badges42 bronze badges

asked May 18, 2017 at 20:02

Neil Dey's user avatar

4

This could be what you want. I’ll have a look at the docs on writing.
In windows use COM1 and COM2 etc without /dev/tty/ as that is for unix based systems. To read just use s.read() which waits for data, to write use s.write().

import serial

s = serial.Serial('COM7')
res = s.read()
print(res)

you may need to decode in to get integer values if thats whats being sent.

Erik Campobadal's user avatar

answered May 18, 2017 at 20:07

pointerless's user avatar

pointerlesspointerless

7539 silver badges20 bronze badges

On Windows, you need to install pyserial by running

pip install pyserial

then your code would be

import serial
import time

serialPort = serial.Serial(
    port="COM4", baudrate=9600, bytesize=8, timeout=2, stopbits=serial.STOPBITS_ONE
)
serialString = ""  # Used to hold data coming over UART
while 1:
    # Wait until there is data waiting in the serial buffer
    if serialPort.in_waiting > 0:

        # Read data out of the buffer until a carraige return / new line is found
        serialString = serialPort.readline()

        # Print the contents of the serial data
        try:
            print(serialString.decode("Ascii"))
        except:
            pass

to write data to the port use the following method

serialPort.write(b"Hi How are you \r\n")

note:b»» indicate that you are sending bytes

answered Feb 15, 2021 at 19:28

Ali Hussein's user avatar

Ali HusseinAli Hussein

1802 silver badges8 bronze badges

Opening serial ports¶

Open port at “9600,8,N,1”, no timeout:

>>> import serial
>>> ser = serial.Serial('/dev/ttyUSB0')  # open serial port
>>> print(ser.name)         # check which port was really used
>>> ser.write(b'hello')     # write a string
>>> ser.close()             # close port

Open named port at “19200,8,N,1”, 1s timeout:

>>> with serial.Serial('/dev/ttyS1', 19200, timeout=1) as ser:
...     x = ser.read()          # read one byte
...     s = ser.read(10)        # read up to ten bytes (timeout)
...     line = ser.readline()   # read a '\n' terminated line

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<id=0xa81c10, open=False>(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

Also supported with context manager:

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.

Note

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.

Note

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 <port_name>
(use option -h to get a listing of all options).

pySerial Build status Documentation

Overview

This module encapsulates the access for the serial port. It provides backends
for Python running on Windows, OSX, Linux, BSD (possibly any POSIX compliant
system) and IronPython. The module named «serial» automatically selects the
appropriate backend.

  • Project Homepage: https://github.com/pyserial/pyserial
  • Download Page: https://pypi.python.org/pypi/pyserial

BSD license, (C) 2001-2020 Chris Liechti <cliechti@gmx.net>

Documentation

For API documentation, usage and examples see files in the «documentation»
directory. The «.rst» files can be read in any text editor or being converted to
HTML or PDF using Sphinx. An HTML version is online at
https://pythonhosted.org/pyserial/

Examples

Examples and unit tests are in the directory examples.

Installation

pip install pyserial should work for most users.

Detailed information can be found in documentation/pyserial.rst.

The usual setup.py for Python libraries is used for the source distribution.
Windows installers are also available (see download link above).

or

To install this package with conda run:

conda install -c conda-forge pyserial

conda builds are available for linux, mac and windows.

PySerial is a Python module that allows for serial communication between a computer and microcontroller or other device. This can be useful for interfacing with various hardware devices such as sensors, actuators, and other peripherals that require serial communication. To read and write from a COM Port using PySerial, the following methods can be used:

Method 1: Initializing the Serial Port

To read and write from a COM Port using PySerial in Python, you need to initialize the serial port first. Here are the steps to do it:

Step 1: Install PySerial

Before you can use PySerial, you need to install it. You can install it using pip:

Step 2: Import the PySerial module

To use PySerial, you need to import the module:

Step 3: Initialize the Serial Port

To initialize the serial port, you need to create an instance of the Serial class. Here is an example:

ser = serial.Serial('COM1', 9600, timeout=1)

In this example, we are initializing the serial port with the following parameters:

  • COM1: The name of the COM port. You can change it to the name of the COM port you want to use.
  • 9600: The baud rate of the serial port. You can change it to the baud rate you want to use.
  • timeout=1: The timeout value in seconds. This is the maximum amount of time to wait for data to arrive. You can change it to the timeout value you want to use.

Step 4: Read from the Serial Port

To read from the serial port, you can use the read() method. Here is an example:

In this example, we are reading 10 bytes of data from the serial port and storing it in the data variable.

Step 5: Write to the Serial Port

To write to the serial port, you can use the write() method. Here is an example:

ser.write(b'Hello, World!')

In this example, we are writing the string «Hello, World!» to the serial port.

Step 6: Close the Serial Port

When you are done using the serial port, you should close it using the close() method. Here is an example:

In this example, we are closing the serial port.

That’s it! These are the steps to initialize the serial port and read from/write to it using PySerial in Python.

Method 2: Reading from the Serial Port

To read data from a COM port using PySerial in Python, you can follow these steps:

  1. Import the PySerial module:
  1. Create a Serial object:
ser = serial.Serial('COM1', 9600, timeout=1)

Where ‘COM1’ is the port name and 9600 is the baud rate. The timeout parameter specifies the time to wait for the data to arrive.

  1. Read data from the port:

Where 10 is the number of bytes to read. You can also use the readline() method to read a line of data.

  1. Close the port:

Here is an example code that reads data from a COM port:

import serial

ser = serial.Serial('COM1', 9600, timeout=1)

while True:
    data = ser.readline().decode('utf-8').rstrip()
    print(data)

ser.close()

This code reads a line of data from the port and prints it to the console. The decode() method is used to convert the bytes to a string, and rstrip() is used to remove any trailing whitespace.

I hope this helps you to read data from a COM port using PySerial in Python.

Method 3: Writing to the Serial Port

PySerial is a Python library used to communicate with serial ports. In this tutorial, we will discuss how to read and write from a COM port using PySerial.

Before we start, make sure you have PySerial installed. If you don’t have PySerial installed, you can install it using pip:

To write to a serial port using PySerial, you need to create a Serial object and use the write() method to send data. Here’s an example:

import serial

ser = serial.Serial('COM1', 9600)  # Replace 'COM1' with your serial port name and 9600 with your baud rate

data = 'Hello, world!'
ser.write(data.encode())

In the above example, we first create a Serial object by specifying the serial port name and baud rate. We then create a variable data that contains the message we want to send. Finally, we use the write() method to send the data. Note that we need to encode the data as bytes before sending it.

After you’re done using the serial port, it’s important to close it using the close() method. Here’s an example:

import serial

ser = serial.Serial('COM1', 9600)  # Replace 'COM1' with your serial port name and 9600 with your baud rate

data = 'Hello, world!'
ser.write(data.encode())

ser.close()

Method 4: Closing the Serial Port

Here’s how you can read and write from a COM port using PySerial in Python with the added step of closing the serial port.

Step 1: Import PySerial

Step 2: Define Serial Port Settings

ser = serial.Serial(
    port='COM1', # replace with your COM port
    baudrate=9600, # set baudrate
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.EIGHTBITS
)

Step 3: Write to the Serial Port

ser.write(b'Hello, World!\n')

Step 4: Read from the Serial Port

response = ser.readline()
print(response)

Step 5: Close the Serial Port

That’s it! You’ve successfully read and written from a COM port using PySerial in Python while also closing the serial port.

  • Python создать исполняемый файл windows
  • Qbittorrent x64 на русском для windows 10 скачать бесплатно
  • Python приложение для windows exe
  • Python создание виртуального окружения windows
  • Python перекодировать из utf 8 в windows 1251