8-900-374-94-44
[email protected]
Slide Image
Меню

Работа с com портами python: Скрипт для автоматического определения настроек COM порта на Python 3

Содержание

Скрипт для автоматического определения настроек COM порта на Python 3

 

У многих встраиваемых систем, устройств промышленной электроники для связи с внешними устройствами или выполнения сервисных функций, в том числе считывания диагностических кодов неисправностей, отладки, обноления встроенного программного обеспечения(прошивки) до сих пор присутствует последовательный интерфейс RS232, более известный как COM порт. В подобных устройствах таких интерфейсов может быть несколько и не всегда каждый интерфейс имеет свой разъем DB9. Довольно часто служебные или сервисные интерфейсы выполнены в виде штыръевого male-разъема c 3, 4, 5 пинами или могут быть не распаяны на печатной плате. При наличии исправного источника питания в исследуемом устройстве для связи нам достаточно 3 проводов: RX, TX, GND. Если источник питания отсутствует или неисправен, подключаем дополнительный провод питания Vcc, проверив соотвествие уровней напряжения (5В или 3.3В) порта компьютера и исследуемого устройства. В таких случаях ищем datasheet на используемые микросхемы и подключаемся в удобном месте. 

Работа скрипта проверена на системах Windows 7 x64, Windows 10 x64, Ubuntu 16.04 x64, Debian 8 x32. Для запуска программы необходим установленный интерпретатор python3 и библиотека pyserial. Скачать версию для различных операционных систем можно на официальном сайте python.org/downloads/. Вне зависимости от разрядности установленной операционной системы лучше устанавливать версию Python 3 x32. В большинстве Linux систем интерпретатор Python присутствует по умолчанию, но необходимо проверить его версию. Для этого запускаем окно терминала и вводим:

sudo apt-get install python3
sudo python3

 

Версия 3.4 установлена, проверяем наличие библиотеки pyserial:

sudo apt-get install python3-pip
sudo pip3 install pyserial

 Далее в домашней директории создаем файл в любом текстовом редакторе:

cd ~
nano comscanner.py

 

 И сохраняем текст скрипта:

#comscanner 0. 1
#Скрипт для автоматического определения скорости COM порта путем перебора скорости, четности, стоп-бит
#по заданной сигнатуре в полученном ответе от устройства с возможностью отправки команды перед получением данных
#для отправки команды раскомментировать строку №74 - #ser.write(cmd)
#Работа скрипта проверена на адаптерах USBtoCOM ch440, ft232 в Windows 10 x64, Debian 8 x32, Raspbian jessie
#[email protected]

import sys, glob, time, serial, os, struct, subprocess, threading, struct

std_speeds = ['1843200', '921600', '460800', '230400', '115200', '57600', '38400', '19200', '9600', '4800', '2400', '1200', '600', '300', '150', '100', '75', '50'] #Скорость COM порта
paritys = ['N', 'E', 'O']   #Бит четности
stopbitss = [1, 2]             #Количество стоп-бит
bite_size = 8               #Биты данных
t_out = 1                   #Таймаут в секундах, должен быть больше 1с
flag1=0                     #Флаг для остановки программы, устанавливается в 1, если найдена сигнатура  
reading_bytes = 10          #Количество байт для чтения после открытия порта
keyword=b'\x00\x00\x00'     #!Сигнатура для поиска
cmd = b'\x00\x34\x65'       #!Команда перед началом приема
ser = serial.

Serial()

################# Поиск доступных портов windows, linux, cygwin, darwin
def serial_ports():
    if sys.platform.startswith('win'):
        ports = ['COM%s' % (i + 1) for i in range(256)]
    elif sys.platform.startswith('linux') or sys.platform.startswith('cygwin'):
        # this excludes your current terminal "/dev/tty"
        ports = glob.glob('/dev/tty[A-Za-z]*')
    elif sys.platform.startswith('darwin'):
        ports = glob.glob('/dev/tty.*')
    else:
        raise EnvironmentError('Unsupported platform')

    result = []
    for port in ports:
        try:
            s = serial.Serial(port)
            s.close()
            result.append(port)
        except (OSError, serial.SerialException):
            pass
    return result
##################################

print('Сигнатура для поиска ', end = '')
print(keyword)

ports=serial_ports()
if ports:
        print('Доступные порты:')
        print(ports)
        if len(ports)>1:
            ser.

port = input('Введите адрес COM порта ')
        else:
            ser.port = ports[0]
            print ('Работаем с портом '+ser.port)
else:
    print('\nНет доступных COM портов, проверьте подключние.\n')
    sys.exit()

try:
    for stop_bit in stopbitss:
        for parit in paritys:
            for com_speed in std_speeds:
                ser.close()
                ser.baudrate = com_speed
                ser.timeout = t_out
                ser.bytesize = bite_size
                ser.parity = parit
                ser.stopbits = stop_bit
                ser.open()
                #ser.write(cmd)                                       #!Раскомментировать при необходимости отправки команды в устройство для инициализации связи                    
                message_b=ser.read(reading_bytes)
                if flag1==1:
                    break
                if message_b:
                    print ('\nRAW data on '+ser. port+', '+com_speed+', '+str(ser.bytesize)+', '+ser.parity+', '+str(ser.stopbits)+':')

                    print ('---------------------')
                    print (message_b)
                    print ('---------------------')
                    try:
                        if keyword in message_b:
                            print ('\n\033[0;33mСигнатура ', end = '') #желтый цвет текста
                            print(keyword, end = '')
                            print(' найдена при следующих настройках: \n'+ser.port+', '+com_speed+', '+str(ser.bytesize)+', '+ser.parity+', '+str(ser.stopbits))
                            print('\x1b[0m')
                            ser.close()
                            flag1=1
                            break
                        else:
                            ser.close()
                    except:
                        print ('error decode')
                        print ('---------------------')
                        ser. close()
                else:
                    print('timeout on '+ser.port+', '+com_speed+', '+str(ser.bytesize)+', '+ser.parity+', '+str(ser.stopbits))
                    print ('---------------------')
                    ser.close()
    if flag1 == 0:
        print('Поиск завершен, сигнатура не найдена')
except serial.SerialException:                                
    print ('Ошибка при открытии порта '+ser.port)
    sys.exit()
                                      
sys.exit()

Для запуска вводим:

sudo python3 comscanner.py

Пример работы скрипта:

 

Запуск в Windows 10:

Перезагружаемся после установки интерпретатора Python 3, сохраняем файл comscanner.py, например, в каталог C:/comscanner/. Нажимаем сочетание Win+X, в появившемся меню выбираем пункт "Командная строка (администратор)" и вводим:

c:
cd c:\comscanner
comscanner.py

Если произошла ошибка "comscanner. py не является внутренней или внешней командой, исполняемой программой или пакетным файлом." - нужно узнать полный путь к установленному Python 3. Запускаем проводник, нажимаем "Вид" - "Показать или скрыть" - отмечаем пункты "Расширения имен файлов" и "Скрытые элементы", открываем - "Локальный диск C:" - Пользователи (Users) - Имя пользователя - AppData - Local - Programs - Python - Python3x. Копируем из адресной строки полный путь как текст и вставляем в открытое окно командной строки. Далее дописываем

python.exe c:\comscanner.py

 

По умолчанию считываются первые 10 байт данных, при необходимости изменяем в переменной reading_bytes. Сигнатуру для поиска (переменная keyword) берем из datasheet на компонент или из инструкции на исследуемое устройство. Если устройство ждет команды для начала передачи дописываем текст команды в переменную cmd и убираем знак комментария # из строки 72   #ser.write(cmd). Команда отправляется последовательно перед чтением и до получения искомой сигнатуры.

 

Последовательность перебора по умолчанию:

стопбит=1, четность=нет, скорость на уменьшение от 1843200 до 50
стопбит=1, четность=чет, скорость на уменьшение от 1843200 до 50

стопбит=1, четность=нечет, скорость на уменьшение от 1843200 до 50
стопбит=2, четность=нет, скорость на уменьшение от 1843200 до 50
стопбит=2, четность=чет, скорость на уменьшение от 1843200 до 50
стопбит=2, четность=нечет, скорость на уменьшение от 1843200 до 50

 

Скачать скрипт comscanner 0.1

 [email protected]


Примеры работ
Услуги
Контакты

Время выполнения запроса: 0,00537610054016 секунд.

как с ним работать?. Блог Амперкот.ру


Очень часто при отладке различных программ на Arduino используется так называемый Serial-порт. Из него можно как считывать данные, так и отправлять команды на наше устройство.

Посмотрим, как работать с Serial, но не со стороны Arduino, а со стороны компьютера. Готовы? Поехали!

Вариант первый. Arduino IDE

Один из инструментов, входящих в состав Arduino IDE, носит гордое название - Монитор порта. Он может быть запущен только когда плата подключена к компьютеру. Есть возможность изменять скорость передачи данных, и символ окончания строки.

Если мы хотим работать только с текстом - рабочий вариант, но если при подключении открывается консоль(например в случае с Micropython), об удобстве можно забыть.

Вариант второй. Специализированное ПО

Поскольку интерфейс Serial-порта используется не только при разработке микроконтроллеров, но и в других областях IT были созданы специальные программы, для удобного взаимодействия или управления.

Одним из самых популярных решений для Windows - является программа

PuTTY. Не смотря на то, что она заявлена как SSH клиент, её очень часто используют для подключения по COM-порту.

Для этого необходимо на основной вкладке среди способов подключения выбрать Serial, ввести имя порта, скорость и нажать на Open.

К сожалению данная программа доступна только для Windows. Пользователям MacOS - можно использовать CoolTerm(кстати, он доступен и для Windows и Linux)

или программу с простым названием Serial, правда за её использование после пробного периода придётся отдать 30$.

Вариант третий.

Программирование

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

Для того, что бы написать программу для управления устройством через Serial-порт на Python, необходимо использовать библиотеку PySerial. Её можно установить через менеджер пакетов: pip install pyserial.

Для создания подключения и отправки сообщения необходим следующий код:

my_serial = serial.Serial('/dev/ttyS1', 115200)
my_serial.write(b'command_1')
my_serial.close()

Он откроет подключение на порту /dev/ttyS1, со скоростью 115200, затем отправит на устройство байтовую строчку b'command_1', а после этого закроет подключение.  

Подробнее об использовании библиотеки можно прочитать в этой статье.


Данная статья является собственностью Amperkot.ru. При перепечатке данного материала активная ссылка на первоисточник, не закрытая для индексации поисковыми системами, обязательна.


Список доступных COM-портов с Python Ru Python

Я ищу простой метод для перечисления всех доступных COM-портов на ПК.

Я нашел этот метод, но он специфичен для Windows: листинг последовательных портов (COM) в Windows?

Я использую python 3 с pyserial на win7 (Windows 7).

Я нашел в pyserial API ( http://pyserial.sourceforge.net/pyserial_api.html ) функцию serial.tools.list_ports.comports (), которая перечисляет COM-порты (именно то, что я хочу).

import serial.tools.list_ports print(list(serial. tools.list_ports.comports())) 

Но кажется, что это не работает.

Когда мой USB-шлюз COM подключен к ПК (я вижу COM5 в диспетчере устройств), у меня нет этого COM-порта. У меня только COM4, ​​который, кажется, подключен к модему (я не вижу его в разделе COM и LPT диспетчера устройств!)

Вы знаете, почему это не работает? У вас есть другое решение, которое не является специфичным для системы?

благодаря

Это код, который я использую.

Успешно протестированы в Windows 8.1 x64, Windows 10 x64, Mac OS X 10.9.x / 10.10.x / 10.11.x и Ubuntu 14.04 / 14.10 / 15.04 / 15.10 как с Python 2, так и с Python 3.

 import sys import glob import serial def serial_ports(): """ Lists serial port names :raises EnvironmentError: On unsupported or unknown platforms :returns: A list of the serial ports available on the system """ if sys.platform.startswith('win'): ports = ['COM%s' % (i + 1) for i in range(256)] elif sys. platform.startswith('linux') or sys.platform.startswith('cygwin'): # this excludes your current terminal "/dev/tty" ports = glob.glob('/dev/tty[A-Za-z]*') elif sys.platform.startswith('darwin'): ports = glob.glob('/dev/tty.*') else: raise EnvironmentError('Unsupported platform') result = [] for port in ports: try: s = serial.Serial(port) s.close() result.append(port) except (OSError, serial.SerialException): pass return result if __name__ == '__main__': print(serial_ports()) 

Возможная доработка превосходного ответа Томаса заключается в том, что Linux и, возможно, OSX также пытаются открыть порты и возвращать только те, которые могут быть открыты. Это связано с тем, что Linux, по крайней мере, перечисляет лодку портов как файлы в / dev /, которые не связаны ни с чем. Если вы работаете в терминале, / dev / tty – это терминал, в котором вы работаете, и открытие и закрытие может привести к вашей командной строке, поэтому glob не предназначен для этого. Код:

  # . .. Windows code unchanged ... elif sys.platform.startswith ('linux'): temp_list = glob.glob ('/dev/tty[A-Za-z]*') result = [] for a_port in temp_list: try: s = serial.Serial(a_port) s.close() result.append(a_port) except serial.SerialException: pass return result 

Эта модификация кода Томаса была проверена только на Ubuntu 14.04.

Доступны несколько вариантов:

Вызовите QueryDosDevice с NULL lpDeviceName, чтобы перечислить все устройства DOS. Затем используйте CreateFile и GetCommConfig с каждым именем устройства, чтобы выяснить, является ли это последовательным портом.

Вызовите SetupDiGetClassDevs с ClassGuid GUID_DEVINTERFACE_COMPORT.

WMI также доступен для программ C / C ++ .

Есть какой-то разговор о группе новостей win32 и проекте CodeProject, er,.

уточнение ответа moylop260 :

 import serial.tools.list_ports list = serial.tools.list_ports.comports() connected = [] for element in list: connected. append(element.device) print("Connected COM ports: " + str(connected)) 

В нем перечислены порты, которые существуют в аппаратном обеспечении, включая те, которые используются. В списке имеется намного больше информации в документации на pyserial tools

Python-в Windows, как взаимодействовать с последовательным портом?

Я только что получил эту работу в эти выходные на Windows 7. Вот как я это сделал:

Во-первых, модуль fdpexpect действительно кажется единственным способом "chat" с последовательным портом в Python 2.7. В последних документах модуля Python pexpect говорится, что он может принимать целочисленный (int) файловый дескриптор (например, fdpexpect), но он не работает на моей установке Ubuntu 12.10. Так что, похоже, fdpexpect-это правильный путь. Если вам от:

http:/ / www.opensource.apple.com / source/lldb/lldb-69/test/pexpect-2.4/fdpexpect.py

Во-вторых, модуль fdpexpect требует в качестве входных данных файловый дескриптор. Хотя модуль Python Pyserial ("import serial") является кроссплатформенным, чтобы использовать его с fdpexpect, необходимо использовать метод Serial.fileno() для получения дескриптора файла int для вашего последовательного порта. Но метод Serial.fileno() не существует в Windows Python; он существует только в POSIX Python, где используются целочисленные файловые дескрипторы.

К счастью, его можно заставить работать с помощью Cygwin. Cygwin-это свободная POSIX-подобная среда для Windows OS. Запустите Cygwin setup.exe и выберите следующие пакеты Cygwin:

python
nano
wget

Затем выполните следующие команды в командной строке Cygwin Bash shell:

# Install 'distribute', so we can use it to install 'pip':
wget.exe http://python-distribute.org/distribute_setup.py

# Execute the downloaded script:
python distribute_setup.py

# Now do the 'pip' installer:
wget --no-check-certificate https://raw.github.com/pypa/pip/master/contrib/get-pip.py

python get-pip.py

# Install pyserial for serial comms w/pexpect support via Serial.fileno()
pip install pyserial

Теперь, если вы запустите свой сценарий Python под установкой Cygwin Python (а не Windows native Python), вы можете передать выходные данные вашего Serial.fileno() в fdpexpect и связаться с sendline() и expect(). Я общаюсь с двумя различными встроенными системами под Windows, используя этот метод.

Обратите внимание, что конструктор serial.Serial() принимает строку типа "/dev/ttyS0" под Unix, но под Windows (ВКЛ. Cygwin) ему нужно целое число. Используйте int (2) для COM3, int(3) для COM4 и так далее. Диспетчер устройств сообщит вам, какие номера портов COM вы должны использовать.

...

Последнее замечание: если вы разговариваете с Arduino Uno... в моей системе Windows 7, подключение Arduino вызывает немедленное появление /dev/ttyS##, как и следовало ожидать. Однако, последовательный порт не будет работать, пока вы используете программное обеспечение Arduino серийный terminal, или Putty, OR команда Cygwin 'screen', чтобы открыть последовательный порт Arduino. Как только вы откроете его в одной из этих программ, он будет работать нормально, пока его не отключат. Я не знаю почему; похоже, это ошибка в драйвере Arduino. (У меня нет этой проблемы с использованием драйвера FTDI для моего устройства, не являющегося Arduino.)

Как написать сканер портов на языке Python? — asp24.ru

В этой статье мы напишем сканер портов на языке Python. С его помощью можно будет сканировать свои хосты на предмет открытых портов. Например, тот же Mikrotik Routerboard.

Приступаем к написанию.

Для написания сканера будем использовать модуль socket.

#!/usr/bin/env python

# -*- coding: utf_8 -*-

Импортируем модуль для работы с сокетами:

import socket

Вводим IP-адрес хоста, который будем сканировать:

host = raw_input("Введите ip адрес компьютера: ")

Создаем пустой список портов:

ports = []

При помощи функции xrange добавляем в список портов значения от 0 до 65535:

for i in xrange(65536):

ports.append(i)

Создаем пустой список, в который будут занесены открытые порты:

open_port = []

В цикле переберем все порты:

for port in ports:

Создаем новый сокет:

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

Устанавливаем таймаут, чтобы скрипт не приостанавливался, если сокет открыт:

sock.settimeout(0.01)

try:

Выполняем подключение:

sock.connect((host, port))

except:

Если подключиться не удалось, возникает исключение:

print ("Порт %s закрыт" % port)

else:

Если исключения не возникло, добавляем номер открытого порта в список open_port и выводим сообщение о том, что порт открыт:

open_port.append(port)

print ("Порт %s открыт." % port)

Закрываем сокет:

sock.close()

print "\033[34m Открытые порты\033[0m"

Выводим информацию об открытых портах:

print open_port

Выполним сканирование портов устройства Mikrotik Routerboard.

 

Рис.1. Запуск скрипта.

 

Запускаем скрипт для выполнения сканирования.

 

Рис.2. Ввод IP-адреса.

 

Скрипт предлагает ввести IP-адрес, который нужно просканировать.

 

Рис.3. Процесс сканирования.

 

В процессе работы скрипт проверяет весь заданный диапазон портов.

 

Рис.4. Результат работы сканера.

 

В результате работы сканер выдал список открытых портов, на которых запущены различные службы в Mikrotik Routerboard.

 

Евгений Рудченко специально для ASP24.

Python · Loginom Help