Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
3 / 3 / 0
Регистрация: 05.04.2020
Сообщений: 69
1

Как добавить постоянно работающий кусок кода в грабли из WM_DEVICECHANGE

09.06.2021, 14:26. Показов 754. Ответов 1

Author24 — интернет-сервис помощи студентам
Здравствуйте знатоки! Я пытаюсь написать на питоне прогу, которая будет отслеживать подключение и обмениваться данными по COM порту с ардуинкой. Вот до чего я дошёл:
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
from serial.tools import list_ports
import win32api, win32con, win32gui
from ctypes import *
 
#
# Device change events (WM_DEVICECHANGE wParam)
#
DBT_DEVICEARRIVAL = 0x8000
DBT_DEVICEQUERYREMOVE = 0x8001
DBT_DEVICEQUERYREMOVEFAILED = 0x8002
DBT_DEVICEMOVEPENDING = 0x8003
DBT_DEVICEREMOVECOMPLETE = 0x8004
DBT_DEVICETYPESSPECIFIC = 0x8005
DBT_CONFIGCHANGED = 0x0018
 
#
# type of device in DEV_BROADCAST_HDR
#
DBT_DEVTYP_OEM = 0x00000000
DBT_DEVTYP_DEVNODE = 0x00000001
DBT_DEVTYP_VOLUME = 0x00000002
DBT_DEVTYPE_PORT = 0x00000003
DBT_DEVTYPE_NET = 0x00000004
 
#
# media types in DBT_DEVTYP_VOLUME
#
DBTF_MEDIA = 0x0001
DBTF_NET = 0x0002
 
WORD = c_ushort
DWORD = c_ulong
 
 
    
 
 
listdev=list_ports.comports()
 
class Notification:
    def __init__(self):
        message_map = {
            win32con.WM_DEVICECHANGE: self.onDeviceChange
        }
 
        wc = win32gui.WNDCLASS()
        hinst = wc.hInstance = win32api.GetModuleHandle(None)
        wc.lpszClassName = "DeviceChangeDemo"
        wc.style = win32con.CS_VREDRAW | win32con.CS_HREDRAW
        wc.hCursor = win32gui.LoadCursor(0, win32con.IDC_ARROW)
        wc.hbrBackground = win32con.COLOR_WINDOW
        wc.lpfnWndProc = message_map
        classAtom = win32gui.RegisterClass(wc)
        style = win32con.WS_OVERLAPPED | win32con.WS_SYSMENU
        self.hwnd = win32gui.CreateWindow(
            classAtom,
            "Device Change Demo",
            style,
            0, 0,
            win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT,
            0, 0,
            hinst, None
        )
 
    def onDeviceChange(self, hwnd, msg, wparam, lparam):
        global listdev
        #
        # WM_DEVICECHANGE:
        #  wParam - type of change: arrival, removal etc.
        #  lParam - what's changed?
        #    if it's a volume then...
        #  lParam - what's changed more exactly
        #
       
        
        if wparam == DBT_DEVICEARRIVAL:
            print("Something's arrived")
            l=list_ports.comports()
            for dev in l:
                if not dev in listdev:
                    if dev.pid==61 and dev.vid==9025:
                        print(dev.description)
            listdev=l
        
        elif wparam == DBT_DEVICEREMOVECOMPLETE:
            print("Something's d")
            l=list_ports.comports()
               
            for dev in listdev:
                if not dev in l:
                    if dev.pid==61 and dev.vid==9025:
                        print(dev.description)
            listdev=l
 
            
 
        return 1
 
 
if __name__ == '__main__':
    w = Notification()
    
    win32gui.PumpMessages()
Для получения сведений об COM port я использую serial.tools. Да, я знаю что можно подписаться на нужные события и получать данные об устройстве сразу из сообщений, но я такт и не разобраться толком как это сделать.
Теперь мне в случаи подключения ардуинки нужно открыть порт и опрашивать его с некоторой периодичностью.
Я без проблем по туториалам напишу подобную функцию, но куда её вставить, что бы она вызвалась не единожды?
Внутри цикл использовать тоже нельзя: это угробит обработчик сообщений и мы не отреагируем на отключение устройства.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.06.2021, 14:26
Ответы с готовыми решениями:

Грабли с WM_DEVICECHANGE
Потратил кучу времени на изучение структур связанных с WM_DEVICECHANGE. Все работает как надо...

Как добавить кусок кода в строку?
Имеется простенький php сервер. Если отправить на него post-запрос: const fs = require('fs');...

C++ Как добавить 1 кусок кода? ПоТеме login/password
Вот у меня есть код логина и пароля(шифр цезаря) шифрует пароль. Как мне в этот код добавить вот...

Как сделать постоянно работающий консольный сервер. Как обмениваться с ним данными?
Доброго времени суток, коллеги программисты! ) Появилась необходимость разораться с...

Как убрать кусок кода
Всем, доброго времени суток! Ситуация следующая. Наш программист, который писал нам под заказ,...

1
Модератор
Эксперт Python
2692 / 1598 / 513
Регистрация: 21.02.2017
Сообщений: 4,211
Записей в блоге: 1
09.06.2021, 14:41 2
Muramur2000, callback функции или asyncio в помощь.

Добавлено через 10 минут
Можно еще с помощью потоков опрашивать порт:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import serial
import threading
 
 
def handler(device: serial.Serial):
    while device.is_open:
        print(device.readline())
 
 
device = serial.Serial("COM1", 115200)
 
thread = threading.Thread(target=handler, args=(device, ), daemon=True)
thread.start()
 
...
 
device.close()
1
09.06.2021, 14:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.06.2021, 14:41
Помогаю со студенческими работами здесь

Как зациклить кусок кода?
как его зациклить чтобы он выполнялся постоянно private void button1_Click(object sender,...

Как вставить кусок кода в MSIL?
Вообщем дело такое: Есть MSIL код(рабочий, компилируется), мне нужно вставить в него свою функцию...

Как найти кусок кода в Wordpress от vk
Всех приветствую! Есть небольшая проблемка с поиском куска кода, который я сам лично запихал на...

Как закрыть от индексации кусок кода?
Нужно закрыть от индексации кусок кода (некий список ссылок), который подгружается в виде блока на...

Как вырезать из DLL кусок кода
DLL написана на Visual C++ | native C++. Открыл dll рефлектором: internal static unsafe...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru