Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
13 / 10 / 5
Регистрация: 11.10.2019
Сообщений: 290

Последовательный порт serial

22.09.2020, 16:49. Показов 4007. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребят как можно посмотреть открыт ли порт или нет.
Допустим в фукнции нашли нужный COM и хочу проверить
find_port = SEEK_PORT( scaners )
print(find_port)
q=serial.Serial(find_port,9600).isOpen() #<===не работает,точнее вылетает.Но знаю что порт остался открытым,так как цикл не завершен в котором работал сканером штрих-кодов.
print(q)

Дело в том что в одном месте я подключил порт поработали и передумали и решили принудительно закрыть по Esc, то есть порт остался открытым и не могу закрыть.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
#Перехват Событий по нажатию клавиш
    def keyPressEvent(self, e):
        if e.type() == QtCore.QEvent.KeyPress:
            #print("Код:", e.key(), ", текст:", e.text())
            if e.key() == 16777216:   #Esc
                print('esc')
 
                #Проверим на открытость порта
                #Список сканеров из ini-файла
                scaners = INI['scaners']['scaners']
                find_port = SEEK_PORT( scaners )
                print(find_port)    #получили номер порта
                serial.Serial(find_port,9600).close()  #<===пытаюсь закрыть.Не важно открыт или закрыт порт. Вылетает из проги.
То есть когда принудительно закрыли,цикл не завершен и отсюда поди и ошибки и не могу проверить.
while log:
QtWidgets.QApplication.processEvents()
while open_port0.inWaiting() > 0:
...


То есть походу нельзя использовать для проверки serial.Serial(find_port,9600) так как пытается соединиться снова,но ничего не выходит.

Добавлено через 13 минут
Делали,делали,не доделали может передумали и вышли по кнопке Esc(то есть цикл не заверщен inWaiting()). Затем снова пытаемся делать дело пытаемся подключиться к порту,то прога вылетает.
Короче по простому:нашли нужный порт и надо его закрыть.Возврат return не сработает,чтобы получить текущее соединение,так как мы принудительно вышли по esc.

Добавлено через 1 час 43 минуты
Закрыть,походу закрыл.Но повторно соединиться не могу почему то.
Python
1
2
3
4
5
6
7
8
ser = serial.Serial()
ser.braudrate = 9600
ser.port = find_port
print('dsf')
ser.close()
print(ser.isOpen()) #<===False
ser.open()            #<===вылетает 
print(ser.isOpen())
Все дело из за цикла в котором нормально не вышли?
Python
1
2
3
while log:
        QtWidgets.QApplication.processEvents()
        while open_port0.inWaiting() > 0:
А это мне и надо выявить что если пошло не так, закрыть, снова открыть порт и работать снова дальше,то есть продолжения цикла не нужно мне,именно новый запуск цикла.

Добавлено через 39 минут
Пишут что возможно дело в inWaiting().То есть команда посылает в систему ожидание сигнала. То есть не важно порт открыт или закрыт,но система ждет сигнала. Значит как то надо искусственно самому отправить завершающий сигнал в порт,можно ли такое сделать?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.09.2020, 16:49
Ответы с готовыми решениями:

Управление ИБП через порт с помощью модуля serial
Здравствуйте! У меня есть бесперебойник я нашёл команды через которые можно с ним общаться, конектюсь с ним через ttyS0. Через программу...

Последовательный порт как расчитать команду?!
Есть ТСД OPH-3001! С помощью монитора портов отлавливаю команду посылаемую прогой в Windows. Первая посылка ...

Qt и serial порт
Добрый день! Я использую Qmake 5.5.1. Установила qtserialport 1. git clone git://code.qt.io/qt/qtserialport.git - склонировала его...

18
 Аватар для kapbepucm
1566 / 739 / 321
Регистрация: 02.05.2020
Сообщений: 1,654
23.09.2020, 10:59
Цитата Сообщение от Сергей225 Посмотреть сообщение
Python
1
2
3
4
5
6
7
8
ser = serial.Serial()
ser.braudrate = 9600
ser.port = find_port
print('dsf')
ser.close()
print(ser.isOpen()) #<===False
ser.open() #<===вылетает 
print(ser.isOpen())
а что возвращает строка 7? False?
0
13 / 10 / 5
Регистрация: 11.10.2019
Сообщений: 290
23.09.2020, 11:02  [ТС]
kapbepucm,
Миниатюры
Последовательный порт serial  
0
 Аватар для kapbepucm
1566 / 739 / 321
Регистрация: 02.05.2020
Сообщений: 1,654
23.09.2020, 11:05
Вылетает ли на строке 7, может вылет на строке 8?
ещё может поможет после строки 7 почитать, что в ser.error()

Добавлено через 2 минуты
покажите вывод:
Python
1
2
3
4
5
6
7
8
ser = serial.Serial()
ser.braudrate = 9600
ser.port = find_port
print('dsf')
ser.close()
print(ser.isOpen()) 
print(ser.open())
print(ser.isOpen())
0
13 / 10 / 5
Регистрация: 11.10.2019
Сообщений: 290
23.09.2020, 11:07  [ТС]
kapbepucm, Именно на подключении вылетает,то есть open
Python
1
2
3
4
5
6
7
8
9
ser = serial.Serial()
ser.braudrate = 9600
ser.port = find_port
print('dsf')
#ser.close()
print(ser.isOpen())
ser.open()
print(ser.error())
#print(ser.isOpen())
Добавлено через 1 минуту
kapbepucm, Такая же ошибка.
Python
1
2
3
4
5
6
7
8
ser = serial.Serial()
ser.braudrate = 9600
ser.port = find_port
print('dsf')
#ser.close()
print(ser.isOpen())                
print(ser.open())
print(ser.isOpen())
Результат:
esc
COM12
dsf
False
0
 Аватар для kapbepucm
1566 / 739 / 321
Регистрация: 02.05.2020
Сообщений: 1,654
23.09.2020, 11:08
Цитата Сообщение от Сергей225 Посмотреть сообщение
Именно на подключении вылетает,то есть open
как вы это определяете?

Добавлено через 27 секунд
а, понял
0
13 / 10 / 5
Регистрация: 11.10.2019
Сообщений: 290
23.09.2020, 11:13  [ТС]
kapbepucm, Ну open закомментирую то ошибок нет,не показывает никакой ошибки.

Добавлено через 4 минуты
kapbepucm, Ситуация такая. Если все сделаю верно с портом,то есть пикаю сканером товары и прочее и правильно завершаю дело,то все ок,все как и должно работать. А хотелось бы выявить если пошло что-то не так или умышленно сами закрыли или напортачил юзер,то уже не подключиться снова к порту.Придется выходить из проги и снова входить. Вот и хочу наладить,если пошло не так то сначала надо как то закрыть,но порт вроде автоматом закрыт после каких то дел,может ожидает порт какого то сигнала,так как цикл то не завершили походу в inWaiting() вот и не знаю как все закрыть.
0
 Аватар для kapbepucm
1566 / 739 / 321
Регистрация: 02.05.2020
Сообщений: 1,654
23.09.2020, 11:22
видимо, какихто операций не хватает, помимо
serial.Serial(find_port,9600).close()

Добавлено через 1 минуту
может в цикле считавания можно добавить какито флаг, значение которого задавать в keyPressEvent, вместо close
0
13 / 10 / 5
Регистрация: 11.10.2019
Сообщений: 290
23.09.2020, 11:31  [ТС]
kapbepucm, Походу можно и не закрывать serial.Serial(find_port,9600).close() Так как он и так закрыт уже получается.То что надо. Но не подключиться теперь.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#Перехват Событий по нажатию клавиш
    def keyPressEvent(self, e):
        if e.type() == QtCore.QEvent.KeyPress:
            #print("Код:", e.key(), ", текст:", e.text())
            if e.key() == 16777216:   #Esc
                print('esc')
 
                #Список сканеров из ini-файла
                scaners = INI['scaners']['scaners']
                find_port = SEEK_PORT( scaners )    #получение нужного порта COM12
                print(find_port)   
 
                ser = serial.Serial()
                ser.braudrate = 9600
                ser.port = find_port
                print('dsf')
                #ser.close()
                print(ser.isOpen())       #<==уже стоит False
Добавлено через 5 минут
kapbepucm,
Python
1
2
3
4
5
while log:
        QtWidgets.QApplication.processEvents()
        while open_port0.inWaiting() > 0:
                сканируем и когда нужное условие выполнится то ставлю log=False все замечательно
                Но вдруг я  на полпути передумал сканировать и нажал esc,то есть цикл походу остался висеть?
Из главного окна переходу в другое окно где сканирую все что надо и по Esc закрыл это окно и перешел обратно в главное окно.Порт закрылся,но почему снова не могу подключиться когда снова перехожу в то окно где сканирую. Из за цикла или ожидания сигнала порта или еще что-то?
Вот для теста я решил сразу проверить соединение в одном месте в событии Esc чтобы пока не заморачиваться с другим окном.
0
 Аватар для kapbepucm
1566 / 739 / 321
Регистрация: 02.05.2020
Сообщений: 1,654
23.09.2020, 11:35
а что скрывается за open_port0.inWaiting()?
0
13 / 10 / 5
Регистрация: 11.10.2019
Сообщений: 290
23.09.2020, 11:44  [ТС]
kapbepucm, для краткости
Python
1
2
3
4
5
6
7
open_port = serial.Serial(find_port, 9600)
while log:
        QtWidgets.QApplication.processEvents()
        while open_port.inWaiting() > 0:
               b = open_port.read()
               делаем дальше чтото 
               log=False
Добавлено через 6 минут
kapbepucm, Походу после закрытия порта он inWaiting() ожидает еще данных? Если бы мы завершили цикл как положено,то мне кажется проблем с повторным соединением не возникло бы. Вот и думаю а как закрыть это ожидание inWaiting(). Ну не писать же ser.inWaiting().close()
0
 Аватар для kapbepucm
1566 / 739 / 321
Регистрация: 02.05.2020
Сообщений: 1,654
23.09.2020, 13:03
Цитата Сообщение от Сергей225 Посмотреть сообщение
inWaiting() ожидает еще данных?
если это из библиотеки питона serial, то это неблокирующая функция

Добавлено через 6 минут
а если заменить
while open_port.inWaiting() > 0:
на
while open_port.isOpen() and open_port.inWaiting() > 0:

Добавлено через 17 минут
т.е. чтобы строка
b = open_port.read()
ни в коем случае не выполнялась без предварительной проверки на "открытость"
open_port.isOpen()
0
13 / 10 / 5
Регистрация: 11.10.2019
Сообщений: 290
23.09.2020, 13:11  [ТС]
kapbepucm, Попробовал. Вылетает все равно.
Python
1
2
3
4
5
6
7
print('asf')
open_port = serial.Serial(find_port, 9600)   #<===вот здесь уже вылетело при попытке снова подключиться.
print('aa')
while log:
        QtWidgets.QApplication.processEvents()
        #while open_port.inWaiting() > 0:
        while open_port.isOpen() and open_port.inWaiting() > 0:
Добавлено через 3 минуты
kapbepucm, Все правильно именно из за цикла вся херня.Потому что я попробовал так:
Python
1
2
3
4
5
while log:
        print('aaa')   #<====для теста пофиг пусть подряд идет что-то
        QtWidgets.QApplication.processEvents()
        #while open_port.inWaiting() > 0:
        while open_port.isOpen() and open_port.inWaiting() > 0:
И когда я выхожу по esc цикл продолжил вращаться а порт уже закрыт. И поэтому не могу заново подключиться. Как вылечить можно? То есть надо остановить цикл,прежде чем снова соединяться.
0
 Аватар для kapbepucm
1566 / 739 / 321
Регистрация: 02.05.2020
Сообщений: 1,654
23.09.2020, 13:34
Цитата Сообщение от Сергей225 Посмотреть сообщение
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
#Перехват Событий по нажатию клавиш
    def keyPressEvent(self, e):
        if e.type() == QtCore.QEvent.KeyPress:
            #print("Код:", e.key(), ", текст:", e.text())
            if e.key() == 16777216:   #Esc
                print('esc')
 
                #Проверим на открытость порта
                #Список сканеров из ini-файла
                scaners = INI['scaners']['scaners']
                find_port = SEEK_PORT( scaners )
                print(find_port)    #получили номер порта
                serial.Serial(find_port,9600).close()  #<===пытаюсь закрыть.Не важно открыт или закрыт порт. Вылетает из проги.
а что вернет print(serial.Serial(find_port,9600).isOpen()), если это вставить до строки 13, где происходит close()?
0
13 / 10 / 5
Регистрация: 11.10.2019
Сообщений: 290
23.09.2020, 13:41  [ТС]
kapbepucm, Та же ошибка. Вылет.
Python
1
2
3
4
5
scaners = INI['scaners']['scaners']
find_port = SEEK_PORT( scaners )
print(find_port)              
print(serial.Serial(find_port,9600).isOpen())   #<==вылет
print('sdaf')
То есть из за serial.Serial(find_port,9600). Все равно склоняюсь к тому что надо как то заверщить цикл. То есть хочется как то отловить событие нажатия клавиши именно в цикле,а не в классе какого-то окна.
0
 Аватар для kapbepucm
1566 / 739 / 321
Регистрация: 02.05.2020
Сообщений: 1,654
23.09.2020, 13:43
идея такая: если тот экземпляр serial.Serial, c которым вы работаете в keyPressEvent, не является тем же самым, который "крутится" в цикле.

Добавлено через 1 минуту
Что, если передать в keyPressEvent именно ту переменную open_port0 и там open_port0.close()?
0
13 / 10 / 5
Регистрация: 11.10.2019
Сообщений: 290
23.09.2020, 13:52  [ТС]
kapbepucm, Вы хотите где у меня в другой функции работает
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
def бла бла
   open_port = serial.Serial(find_port, 9600)
   while log:
        QtWidgets.QApplication.processEvents()
        #while open_port0.inWaiting() > 0:
        while open_port0.isOpen() and open_port0.inWaiting() > 0:
 
 
class okno_scan(QtWidgets.QDialog):
    def __init__(self):
        QtWidgets.QDialog.__init__(self)
 
        gl_okno_scan( self )
                
    #Перехват Событий по нажатию клавиш
    def keyPressEvent(self, e):
        if e.type() == QtCore.QEvent.KeyPress:
            #print("Код:", e.key(), ", текст:", e.text())
            if e.key() == 16777216:   #Esc
                print('esc')
                scaners = INI['scaners']['scaners']
                find_port = SEEK_PORT( scaners )
                print(find_port)
                #ser = serial.Serial()
                #ser.braudrate = 9600
                #ser.port = find_port
                #<=========и сюда хотите получить open_port?
Так не сработает return,чтобы получить нужную переменную.
Поэтому и думаю сейчас как добавить сигнал прямо в цикл чтобы установить переменную log в False. По логике сработало бы,но не знаю как добавить функцию keyPressEvent прямо в цикл,всегда его в классе размещал какого то окна.
0
 Аватар для kapbepucm
1566 / 739 / 321
Регистрация: 02.05.2020
Сообщений: 1,654
23.09.2020, 14:01
чтото похожее на:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
open_port = None
def бла бла
   global open_port
   open_port = serial.Serial(find_port, 9600)
   while log:
        QtWidgets.QApplication.processEvents()
        #while open_port0.inWaiting() > 0:
        while open_port0.isOpen() and open_port0.inWaiting() > 0:
 
 
class okno_scan(QtWidgets.QDialog):
    def __init__(self):
        QtWidgets.QDialog.__init__(self)
 
        gl_okno_scan( self )
                
    #Перехват Событий по нажатию клавиш
    def keyPressEvent(self, e):
        if e.type() == QtCore.QEvent.KeyPress:
            #print("Код:", e.key(), ", текст:", e.text())
            if e.key() == 16777216:   #Esc
                print('esc')
                open_port.close()
ну передавать там, наверно, красивее будет через конструктор okno_scan, но, думаю, идея понятна
1
13 / 10 / 5
Регистрация: 11.10.2019
Сообщений: 290
23.09.2020, 14:22  [ТС]
kapbepucm, Ура я сделал. Вот как:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class GlData(): pass
 
class okno_scan(QtWidgets.QDialog):
    def __init__(self):
        QtWidgets.QDialog.__init__(self)
        global G1
        G1 = GlData()          #<===создадим переменную глобали.
 
        gl_okno_scan( self )
        
            
    #Перехват Событий по нажатию клавиш
    def keyPressEvent(self, e):
        if e.type() == QtCore.QEvent.KeyPress:
            #print("Код:", e.key(), ", текст:", e.text())
            if e.key() == 16777216:   #Esc
                print('esc')
                G1.flag=1                               
                print(G1.flag)
 
И там в другой функции флаг ставим
G1.flag=0
while log and G1.flag==0:
        print('aaa')
        QtWidgets.QApplication.processEvents()
        while open_port0.inWaiting() > 0:
                условие:
                      бла бла 
                      log=False
                      G1.flag=1
Если мы нажали esc то устанавливаем флаг G1.flag=1 и цикл прекратился. Можем спокойно заново подключаться.
Вопрос закрыт,буду дорабатывать над красотой. Понятно что параметр G1 передавал через функции где у нас связано с портом,чтобы в цикле поставить.
kapbepucm, спасибо что пытался помочь.плюсик поставлю все равно. Вопрос закрыт.

Добавлено через 6 минут
kapbepucm, Не нужно пытаться снова закрывать или открывать в esc,просто переменную выставить чтобы цикл закрыть. Все правильно было дело в цикле и он не давал снова подключиться,так как цикл бесконечный продолжал работать. Потому что если заново подключиться и нужно войти в этот же цикл, а он занят,работает с предыдущего подключения.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.09.2020, 14:22
Помогаю со студенческими работами здесь

Последовательный порт
Прежде всего откровенно признаюсь, что с winAPI я знакома в объёме давным давно просмотренной книжки Петзольда. Я пишу используя Qt, но в...

Последовательный порт
Пытаюсь разобраться с теорией по последовательным портам... Вот описание функции, тут меня интересует, что есть такое &quot;... в формате...

Последовательный порт
Всем доброго времени суток. Уже совсем запутался. Нужно нормально считать данные с порта, но вместо этого получается, то ничего не считает,...

Qt + последовательный порт
Добрый день. Осваиваю чтение данных из последовательного порта, и возник такой вопрос. Вот есть метод, который считывает данные: ...

Последовательный порт
Здравствуйте! При написании процедуры-реакции на событие порта DataReceived (Visual Studio 2010, C++, надо считать 1 байт шестнадцатеричных...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru