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

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

22.09.2020, 16:49. Показов 4107. Ответов 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
1568 / 741 / 321
Регистрация: 02.05.2020
Сообщений: 1,660
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
1568 / 741 / 321
Регистрация: 02.05.2020
Сообщений: 1,660
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
1568 / 741 / 321
Регистрация: 02.05.2020
Сообщений: 1,660
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
1568 / 741 / 321
Регистрация: 02.05.2020
Сообщений: 1,660
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
1568 / 741 / 321
Регистрация: 02.05.2020
Сообщений: 1,660
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
1568 / 741 / 321
Регистрация: 02.05.2020
Сообщений: 1,660
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
1568 / 741 / 321
Регистрация: 02.05.2020
Сообщений: 1,660
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
1568 / 741 / 321
Регистрация: 02.05.2020
Сообщений: 1,660
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
1568 / 741 / 321
Регистрация: 02.05.2020
Сообщений: 1,660
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
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru