Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
2 / 2 / 0
Регистрация: 15.02.2010
Сообщений: 26

Qt & COM-port + VS2008

16.01.2012, 10:22. Показов 3106. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем ситуация следующая (пишу под windows): есть класс описывающий GUI (на Qt), в нём есть методы которые открывают, настраивают COM-порт, читают из него и пишут в него (для этого использую win API).Ставлю точку останова в начале метода, где открываю и настраиваю порт, запускаю программу в отладочном режиме (в visual studio 2008, режим debug), открываю окно дизассемблера, начинаю исполнять в пошаговом режиме (при этом посматриваю на значения в переменных, в них то что и должно быть), в итоге получается что часть с-кода отсутствует в ассемблере...

Вот с-код:
C
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
if(Port == INVALID_HANDLE_VALUE)
    {
        Port = 0;
        return -1; // CreateFile failed
    }
 
    // Port initialization
    Dcb.DCBlength = sizeof(DCB);
    // Read configuration from port
    BOOL tmp_bool = GetCommState(Port, &Dcb);
    if(!tmp_bool)
    {
        CloseHandle(Port);
        Port = 0;
        return -2; // GetCommState failed
    }
 
    Dcb.BaudRate        = 19200;
    Dcb.fBinary         = true;
    Dcb.fOutxCtsFlow    = false;
    Dcb.fOutxDsrFlow    = false;
    Dcb.fDtrControl     = DTR_CONTROL_DISABLE;
    Dcb.fRtsControl     = RTS_CONTROL_DISABLE;
    Dcb.fDsrSensitivity = false;
    Dcb.fNull           = false;
    Dcb.fAbortOnError   = false;
    Dcb.ByteSize        = 8;
    Dcb.Parity          = 0;
    Dcb.StopBits        = 0;
 
    // Load port configuration
    if(!SetCommState(Port, &Dcb))
    {
        CloseHandle(Port);
        Port = 0;
        return -3; // SetCommState failed
    }
 
    // Initialize timeout structure
    ComTimeout.ReadIntervalTimeout              = 10;
    ComTimeout.ReadTotalTimeoutConstant         = 0;
    ComTimeout.ReadTotalTimeoutMultiplier       = 0;
    ComTimeout.WriteTotalTimeoutConstant        = 0;
    ComTimeout.WriteTotalTimeoutMultiplier      = 0;
 
    // Load timeout structure inti port
    if(!SetCommTimeouts(Port, &ComTimeout))
    {
        CloseHandle(Port);
        Port = 0;
        return -4; // SetCommTimeouts failed
    }
Вод что показывает дизассемблер visual studio 2008:
Assembler
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
if(Port == INVALID_HANDLE_VALUE)
0036250C  mov         eax,dword ptr [Port (3726A8h)] 
00362511  add         esp,10h 
00362514  cmp         eax,0FFFFFFFFh 
00362517  jne         XProg::PortOpen+108h (362538h) 
00362519  pop         esi  
    {
        Port = 0;
0036251A  mov         dword ptr [Port (3726A8h)],ebx 
        return -1; // CreateFile failed
00362520  or          eax,eax 
00362522  pop         ebx  
    if(!SetCommTimeouts(Port, &ComTimeout))
    {
        CloseHandle(Port);
        Port = 0;
        return -4; // SetCommTimeouts failed
    }
 
    // Set queue size
    SetupComm(Port, 2000, 2000);
 
    // Erase receiving port buffer
    PurgeComm(Port, PURGE_RXCLEAR);
 
    SetCommMask(Port, EV_RXCHAR);
 
    return 0;
}
00362523  mov         ecx,dword ptr [esp+0C0h] 
0036252A  mov         dword ptr fs:[0],ecx 
00362531  add         esp,0CCh 
00362537  ret              
    }
 
    // Port initialization
    Dcb.DCBlength = sizeof(DCB);
    // Read configuration from port
    BOOL tmp_bool = GetCommState(Port, &Dcb);
00362538  push        offset Dcb (372290h) 
0036253D  push        eax  
0036253E  mov         dword ptr [Dcb (372290h)],1Ch 
00362548  call        dword ptr [__imp__GetCommState@8 (36A050h)] 
    if(!tmp_bool)
0036254E  test        eax,eax 
00362550  jne         XProg::PortOpen+150h (362580h) 
    {
        CloseHandle(Port);
00362552  mov         eax,dword ptr [Port (3726A8h)] 
00362557  push        eax  
00362558  call        dword ptr [__imp__CloseHandle@4 (36A04Ch)] 
0036255E  pop         esi  
        Port = 0;
0036255F  mov         dword ptr [Port (3726A8h)],ebx 
        return -2; // GetCommState failed
00362565  mov         eax,0FFFFFFFEh 
0036256A  pop         ebx  
    if(!SetCommTimeouts(Port, &ComTimeout))
    {
        CloseHandle(Port);
        Port = 0;
        return -4; // SetCommTimeouts failed
    }
 
    // Set queue size
    SetupComm(Port, 2000, 2000);
 
    // Erase receiving port buffer
    PurgeComm(Port, PURGE_RXCLEAR);
 
    SetCommMask(Port, EV_RXCHAR);
 
    return 0;
}
0036256B  mov         ecx,dword ptr [esp+0C0h] 
00362572  mov         dword ptr fs:[0],ecx 
00362579  add         esp,0CCh 
0036257F  ret              
    }
 
    Dcb.BaudRate        = 19200;
00362580  mov         ecx,dword ptr [Dcb+8 (372298h)] 
    Dcb.fBinary         = true;
    Dcb.fOutxCtsFlow    = false;
    Dcb.fOutxDsrFlow    = false;
    Dcb.fDtrControl     = DTR_CONTROL_DISABLE;
    Dcb.fRtsControl     = RTS_CONTROL_DISABLE;
    Dcb.fDsrSensitivity = false;
    Dcb.fNull           = false;
    Dcb.fAbortOnError   = false;
    Dcb.ByteSize        = 8;
    Dcb.Parity          = 0;
    Dcb.StopBits        = 0;
 
    // Load port configuration
    if(!SetCommState(Port, &Dcb))
00362586  mov         edx,dword ptr [Port (3726A8h)] 
0036258C  and         ecx,0FFFF8783h 
00362592  push        offset Dcb (372290h) 
00362597  or          ecx,1 
0036259A  push        edx  
0036259B  mov         dword ptr [Dcb+4 (372294h)],4B00h 
003625A5  mov         dword ptr [Dcb+8 (372298h)],ecx 
003625AB  mov         byte ptr [Dcb+12h (3722A2h)],8 
003625B2  mov         byte ptr [Dcb+13h (3722A3h)],bl 
003625B8  mov         byte ptr [Dcb+14h (3722A4h)],bl 
003625BE  call        dword ptr [__imp__SetCommState@8 (36A048h)] 
003625C4  test        eax,eax 
003625C6  jne         XProg::PortOpen+1C6h (3625F6h) 
    {
        CloseHandle(Port);
003625C8  mov         eax,dword ptr [Port (3726A8h)] 
003625CD  push        eax  
003625CE  call        dword ptr [__imp__CloseHandle@4 (36A04Ch)] 
003625D4  pop         esi  
        Port = 0;
003625D5  mov         dword ptr [Port (3726A8h)],ebx 
        return -3; // SetCommState failed
003625DB  mov         eax,0FFFFFFFDh 
003625E0  pop         ebx  
    if(!SetCommTimeouts(Port, &ComTimeout))
    {
        CloseHandle(Port);
        Port = 0;
        return -4; // SetCommTimeouts failed
    }
 
    // Set queue size
    SetupComm(Port, 2000, 2000);
 
    // Erase receiving port buffer
    PurgeComm(Port, PURGE_RXCLEAR);
 
    SetCommMask(Port, EV_RXCHAR);
 
    return 0;
}
003625E1  mov         ecx,dword ptr [esp+0C0h] 
003625E8  mov         dword ptr fs:[0],ecx 
003625EF  add         esp,0CCh 
003625F5  ret              
    }
 
    // Initialize timeout structure
    ComTimeout.ReadIntervalTimeout              = 10;
    ComTimeout.ReadTotalTimeoutConstant         = 0;
    ComTimeout.ReadTotalTimeoutMultiplier       = 0;
    ComTimeout.WriteTotalTimeoutConstant        = 0;
    ComTimeout.WriteTotalTimeoutMultiplier      = 0;
 
    // Load timeout structure inti port
    if(!SetCommTimeouts(Port, &ComTimeout))
003625F6  mov         ecx,dword ptr [Port (3726A8h)] 
003625FC  push        offset ComTimeout (3726ACh) 
00362601  push        ecx  
00362602  mov         dword ptr [ComTimeout (3726ACh)],0Ah 
0036260C  mov         dword ptr [ComTimeout+8 (3726B4h)],ebx 
00362612  mov         dword ptr [ComTimeout+4 (3726B0h)],ebx 
00362618  mov         dword ptr [ComTimeout+10h (3726BCh)],ebx 
0036261E  mov         dword ptr [ComTimeout+0Ch (3726B8h)],ebx 
00362624  call        dword ptr [__imp__SetCommTimeouts@8 (36A044h)] 
0036262A  test        eax,eax 
0036262C  jne         XProg::PortOpen+22Dh (36265Dh) 
    {
        CloseHandle(Port);
0036262E  mov         edx,dword ptr [Port (3726A8h)] 
00362634  push        edx  
00362635  call        dword ptr [__imp__CloseHandle@4 (36A04Ch)] 
0036263B  pop         esi  
        Port = 0;
0036263C  mov         dword ptr [Port (3726A8h)],ebx 
        return -4; // SetCommTimeouts failed
00362642  mov         eax,0FFFFFFFCh 
00362647  pop         ebx  
    if(!SetCommTimeouts(Port, &ComTimeout))
    {
        CloseHandle(Port);
        Port = 0;
        return -4; // SetCommTimeouts failed
    }
 
    // Set queue size
    SetupComm(Port, 2000, 2000);
 
    // Erase receiving port buffer
    PurgeComm(Port, PURGE_RXCLEAR);
 
    SetCommMask(Port, EV_RXCHAR);
 
    return 0;
}
00362648  mov         ecx,dword ptr [esp+0C0h] 
0036264F  mov         dword ptr fs:[0],ecx 
00362656  add         esp,0CCh 
0036265C  ret              
    }

Вот например: когда заполняю структуру Dcb, в ассемблере все в одной строчке 00362580 mov ecx,dword ptr [Dcb+8 (372298h)] , что конечно неправельно...
В чём может быть проблема?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.01.2012, 10:22
Ответы с готовыми решениями:

сложности с инжектом dll & VS2008...
незнаю,подходит ли тема для раздела,но все же - столкнулся с совершенно непонятной для меня проблемой---есть код,который инжектит dll в...

query='SELECT * FROM resume WHERE ' & ''' & RecSet('place')& ''' & '=' & '''& s_loc &''' & - что не так?
упростил для краткости запрос. в чем ошибка? RecSet - это коннекшн. query='SELECT * FROM resume WHERE ' & ''' &...

TP & com port + windows = ?
windows и turbo pascal через окно CMD-интепритатора. Вроде защищенный режим окон не даст доступа к com port? А почему например python_dos...

4
Почетный модератор
 Аватар для Humanoid
11560 / 4354 / 453
Регистрация: 12.06.2008
Сообщений: 12,455
16.01.2012, 11:10
Assembler
1
mov         dword ptr [Dcb+4 (372294h)],4B00h
- это скорость 19200
Assembler
1
mov         byte ptr [Dcb+12h (3722A2h)],8
- Dcb.ByteSize
Где он Dcb.fBinary=true делает я не понял (возможно, среди ecx что-то). А остальные значения = 0... возможно, он решил не выполнять пустые действия.
1
2 / 2 / 0
Регистрация: 15.02.2010
Сообщений: 26
17.01.2012, 11:01  [ТС]
Наверно...

Ещё вопросик: когда выполняю пошагово в отладчике, то не заходит в некоторые функции (типо выполнил, а в саму функцию не заходил, как при нажатии F10 - Step Over)... это как то можно исправить?

Добавлено через 22 часа 25 минут
Есть несколько переменных в классе (закрытых членов), пытаюсь инициализировать в конструкторе... этого не происходит, смотрю всё тем же дизассемблером... так там нет никаких инструкций для инициализации... В чем может быть трабл?

Добавлено через 31 минуту
Может когда вместе с Qt используешь стандартные типы, что то надо делать хитрым способом?
0
Почетный модератор
 Аватар для Humanoid
11560 / 4354 / 453
Регистрация: 12.06.2008
Сообщений: 12,455
17.01.2012, 12:42
Цитата Сообщение от -Xeon- Посмотреть сообщение
Есть несколько переменных в классе (закрытых членов), пытаюсь инициализировать в конструкторе... этого не происходит, смотрю всё тем же дизассемблером... так там нет никаких инструкций для инициализации... В чем может быть трабл?
Возможно, если ты их в нули выставляешь, то компилятор тоже мог это посчитать лишним действием. Так же, если ты эти переменные нигде больше не используешь, то оптимизатор их вообще выкинул и сделал вид, что их не существует.
Как показывает практика, в компиляторе проблем не бывает. Проблемы обычно бывают, когда где-то что-то не учёл сам в коде.

Цитата Сообщение от -Xeon- Посмотреть сообщение
Может когда вместе с Qt используешь стандартные типы, что то надо делать хитрым способом?
Нет. Обычный C++ можно использовать как обычно. Qt просто добавляет свои классы.
1
2 / 2 / 0
Регистрация: 15.02.2010
Сообщений: 26
17.01.2012, 13:15  [ТС]
Запалил один момент...) мало относящийся к Qt, смысл следующий: смотрю в диспетчер устройств есть второй порт (COM2, ну если зайти в его свойства там ещё куча занятых портов не в этом дело...), если своей программой цепляюсь к этому порту то всё норм, а вот если к другому (в моём случае это COM3), то при попытке отправить в порт а потом из него считать принятые данные, то принятыми данными оказывается то, что я отсылал... интересненько... Может кто пояснить эту ситуацию?...

Добавлено через 37 секунд
На СОМ2 находится моё устройство с которым надо общаться...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.01.2012, 13:15
Помогаю со студенческими работами здесь

Bruteforce & Port Knocking
Всем доброго. Вопрос по безопасности. В производственной необходимости, преимущественно для себя, между моим домашним МТ1...

error '80020009' Îøèáêà. /lalala/profile.asp, line 28
При простейшем и сто раз работавшем скрипте, вылетает ошибка! след. содержания error '80020009' ...

Помогите найти драйвера для pci\ven_8086&DEV_266E&SUBSYS_A002145&REV_05\3&13C0B0C5&0&F2
pci\ven_8086&DEV_266E&SUBSYS_A002145&REV_05\3&13C0B0C5&0&F2 Мультимедиа аудиоконтроллер помогите плз найти...

Мультимедиа контролер PCI\VEN_14F1&DEV_8800&SUBSYS_EA3D14F1&REV_05\4&25700A26&0&3020
Помогите пожалуйста найти драйвер на мультимедиа видеоконтролер ...

Нужен драйвера, код PCI\VEN_1039&DEV_7012&SUBSYS_0C98105B&REV_A0\3&B1BFB68&0&17
всем привет !! уменя нет звука нужен драйвер код PCI\VEN_1039&DEV_7012&SUBSYS_0C98105B&REV_A0\3&B1BFB68&0&17 скачал прогу их много ...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru