01.01.2015 Views

¦þ¹ ¼³¾Šł

¦þ¹ ¼³¾Šł

¦þ¹ ¼³¾Šł

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

SetCommState(hCom, &dcb);<br />

Ñ ðàáîòîé ïîðòîâ ðàçîáðàëèñü. Òåïåðü íàïèøåì ãðàôè÷åñêóþ îáîëî÷êó äëÿ íàøåé<br />

ïðîãðàììû.<br />

Ïèøåì GUI<br />

 ïîñëåäíåå âðåìÿ ó ìíîãèõ íà÷èíàþùèõ ïðîãðàììèñòîâ ñëîæèëîñü âïå÷àòëåíèå, ÷òî<br />

ïèñàòü ïðîãðàììû, èñïîëüçóþùèå äèàëîãè (îêîøêè), áåç VCL èëè MFC î÷åíü ñëîæíî.<br />

À âñå èç-çà ñòåðåîòèïà, áóäòî ïðèõîäèòñÿ ïðîðèñîâàòü ðó÷êàìè êàæäóþ êíîïî÷êó. Íî<br />

ýòî ñîâñåì íå òàê. Íóæíî ïðîñòî èñïîëüçîâàòü ðåñóðñû. Íàïðèìåð, ïðè ïîìîùè òîãî<br />

æå Visual Studio ìû ñîçäàäèì äèàëîã, íàáðîñàåì íà íåãî ïðÿìî êàê â Delphi èëè C++<br />

Builder âñÿêèõ êíîïî÷åê è äðóãèõ íåîáõîäèìûõ íàì êîíòðîëîâ, à çàòåì ñîçäàäèì â íàøåé<br />

ïðîãðàììå ôóíêöèþ îáðàáîòêè ñîîáùåíèé. ×òî æ, ïðèñòóïèì.<br />

Äëÿ òîãî ÷òîáû ñëåïèòü æåëàåìûé äèàëîã, íàäî çàãðóçèòü íàø ïðîåêò â VS, ïåðåéòè â çàêëàäêó<br />

Resource View, à òàì êëèêíóòü ïðàâîé êíîïêîé ìûøêè è âûáðàòü Insert (èëè Add<br />

Resource äëÿ VS .NET). Òåáå ïðåäëîæàò ðàçíûå òèïû ðåñóðñîâ. Âûáèðàé Dialog. Ïîÿâèòñÿ<br />

ðåäàêòîð, î÷åíü ïîõîæèé íà ðåäàêòîð ôîðì â äåëüôÿõ. Ïîìåñòè drug`n`drop'îì íà äèàëîã<br />

äâå êíîïî÷êè: îäíó - äëÿ îòêðûòèÿ çàäàííîãî ïîðòà, äðóãóþ - äëÿ ïîñûëêè äàííûõ,<br />

è òðè EditBox'à. Îäèí - äëÿ ââîäà íàçâàíèÿ ïîðòà, îäèí - äëÿ ïîñûëàåìûõ äàííûõ è åùå<br />

îäèí (ïîáîëüøå) - äëÿ âûâîäà ÷èòàåìûõ äàííûõ. Íà ïîñëåäíåì íóæíî êëèêíóòü, âûáðàòü<br />

ñâîéñòâà, à â ñâîéñòâàõ âêëþ÷èòü äëÿ EditBox'à ïîëîñó ïðîêðóòêè è multiline, ò.ê. äàííûå<br />

áóäóò âûâîäèòüñÿ ïîñòðî÷íî. Ó êàæäîãî ïîìåùåííîãî òîáîé íà äèàëîã êîíòðîëà áóäóò<br />

ñâîè èäåíòèôèêàòîðû. Çàïîìíè ýòè íàçâàíèÿ, ñ èõ ïîìîùüþ ìû áóäåì âçàèìîäåéñòâîâàòü<br />

ñ äèàëîãîì èç ïðîãðàììû. Ïîñëå ñîõðàíåíèÿ â ïàïêå ñ ïðîåêòîì ïîÿâèòñÿ õèäåð<br />

resource.h, åãî ìû âêëþ÷èì â íàøó ïðîãðàììó:<br />

#include "resource.h"<br />

×òîáû ïîëó÷àòü äàííûå èç ïîëåé EditBox'à, ìû âîñïîëüçóåìñÿ ôóíêöèåé<br />

GetDlgItemText. Â ïåðâîì ïàðàìåòðå åé íàäî ïåðåäàòü äåñêðèïòîð îêíà, âî âòîðîì -<br />

èäåíòèôèêàòîð edit'à, â òðåòüåì - óêàçàòåëü íà ñòðîêîâûé áóôåð, â ïîñëåäíåì - êîëè-<br />

÷åñòâî ÷èòàåìûõ èç ïîëÿ ñèìâîëîâ. Ïîñëå çàïóñêà â áóôåðå (ïîä êîòîðûé ïåðåä èñïîëüçîâàíèåì<br />

ðåêîìåíäóåòñÿ âûäåëèòü ïàìÿòü) îêàæåòñÿ òî, ÷òî áûëî ââåäåíî â ïîëå<br />

ñ çàäàííûì èäåíòèôèêàòîðîì.<br />

Ê òîìó æå âñå äàííûå ïåðåäàþòñÿ îòêðûòûì òåêñòîì, áåç êàêèõ-ëèáî ñëîæíûõ êîäîâ<br />

è ò.ï. Ïåðâîå, ÷òî ÿ ïîñëàë, áûëî AT, ìîäåì âåðíóë OK. ß ïîïðîáîâàë ïàðó<br />

ñòðîê èíèöèàëèçàöèè, âñå ïðîøëè íà óðà. Ïîòîì âñïîìíèë åùå íåñêîëüêî èíòåðåñíûõ<br />

êîìàíä, íàïðèìåð òàêèõ:<br />

ATDPíîìåð - çâîíèò ïóëüñîì ïî íîìåðó (T - òîíîâûé íàáîð)<br />

ATI3 - âûäàåò âåðñèþ ìîäåìà<br />

ATI7 - âûäàåò íàçâàíèå ìîäåìà<br />

ATH0 - âåøàåò òðóáêó<br />

ATH1 - ñíèìàåò òðóáêó è ïîäêëþ÷àåòñÿ ê ëèíèè<br />

Åñëè çàõî÷åøü óçíàòü ïîáîëüøå êîìàíä, ïîðîéñÿ<br />

â äîêóìåíòàöèè ñâîåãî ìîäåìà. Íî è ýòî<br />

åùå íå âñå. Ñåé÷àñ ïðàêòè÷åñêè ó âñåõ åñòü ìîáèëüíèêè,<br />

è ó ìíîãèõ èìååòñÿ êîìîâñêèé ïðîâîä<br />

äëÿ ñèíõðîíèçàöèè ìîáèëüíîãî òåëåôîíà<br />

ñ êîìïüþòåðîì. Òàê âîò, â êàæäîì òåëåôîíå<br />

ñóùåñòâóåò GSM-ìîäåì, à ýòî î÷åíü èíòåðåñíàÿ<br />

øòóêà. Ïîìèìî îáû÷íûõ ôóíêöèé ìîäåìà,<br />

îí ìîæåò îòïðàâëÿòü SMS. Âîò êàê ýòî ñäåëàòü<br />

ïðè ïîìîùè íàøåé ïðîãðàììû:<br />

AT+CMGS="+79033133373"<br />

Îáùàåìñÿ ñ ìîäåìîì<br />

Ìîäåì îòâåòèò. Çàòåì òû ââåäåøü òåêñò ñîîáùåíèÿ ñ ñèìâîëîì '\x1A' íà êîíöå, à ìîäåì<br />

îòïðàâèò ýòó ìåññàãó íà íîìåð +79033133373.<br />

Break<br />

Ïðîåêò äëÿ Visual Studio .NET, ïîëíûé èñõîäíûé òåêñò ïðîãðàììû c ïîäðîáíûìè êîììåíòàðèÿì<br />

è óæå ñêîìïèëèðîâàííûé exe’øíèê òû ìîæåøü âçÿòü íà äèñêå èëè ñêà÷àòü<br />

ñ ñàéòà www.xakep.ru. Íàâåðíÿêà ó íàïèñàííîé íàìè ïðîãðàììû åñòü åùå è äðóãèå<br />

ïðèìåíåíèÿ. Òàê ÷òî ýêñïåðèìåíòèðóé, à åñëè ïðèäóìàåøü ÷òî-íèáóäü îðèãèíàëüíîå,<br />

òî íàïèøè ìíå îá ýòîì.<br />

Íà ýòîì âñå. Óäà÷íîãî êîìïèëèðîâàíèÿ.<br />

Òåïåðü íàì íàäî íàó÷èòüñÿ îáðàáàòûâàòü ñîáûòèÿ, âûïîëíÿþùèåñÿ ïîñëå íàæàòèÿ íà<br />

òó èëè èíóþ êíîïêó. Äëÿ ýòîãî ñîçäàäèì ôóíêöèþ îáðàáîòêè ñîîáùåíèé. Îíà áóäåò<br />

ëîâèòü ñîîáùåíèå îêíó-ðîäèòåëþ WM_COMMAND. Ôóíêöèÿ îïèñûâàåòñÿ òàê:<br />

int Dlg_Proc(HWND hwnd, UINT wMsg, WPARAM wParam, LPARAM lParam);<br />

ãäå hwnd - ýòî äåñêðèïòîð îêíà, êîòîðîìó ïðèøëî ñîîáùåíèå, wMsg - çàðåãèñòðèðîâàííûé<br />

íîìåð ñîîáùåíèÿ (íàïðèìåð, WM_COMMAND), à wParam è lParam - äâà ïàðàìåòðà,<br />

íàõîäÿùèõñÿ â ñîîáùåíèè. Âíóòðè ôóíêöèè ìû áóäåì ñðàâíèâàòü wMsg è<br />

WM_COMMAND. Åñëè îíè áóäóò ðàâíû, çíà÷èò, íà ýòó êíîïêó íàæàëè. Èäåíòèôèêàòîð<br />

êíîïêè íàõîäèòñÿ â íèæíåì "ñëîâå" ïðàâîãî ïàðàìåòðà (LOWORD(wParam)). Äëÿ òîãî<br />

÷òîáû ñîçäàòü ñîáûòèå íàæàòèÿ ýòîé êíîïêè, ìû äîëæíû ñðàâíèòü ïîëó÷åííûé èäåíòèôèêàòîð<br />

ñ èìåþùèìñÿ ó íàñ, è åñëè îíè ðàâíû - âûïîëíèòü íóæíûé íàì êîä. Ïîñêîëüêó<br />

êíîïîê è ïðèíèìàåìûõ ñîîáùåíèé â ïðîãðàììàõ îáû÷íî íåìàëî, ïðèíÿòî<br />

ïðîèçâîäèòü ñðàâíåíèå â áëîêå switch.<br />

Ôóíêöèþ îáðàáîòêè ñîîáùåíèé íàïèñàëè, îñòàëîñü òîëüêî âûçâàòü èç ïðîãðàììû ñàìóþ<br />

ãëàâíóþ ôóíêöèþ, êîòîðàÿ ñîçäàñò ïðè çàïóñêå îêíî èç íàøåãî ðåñóðñà è ïðèêðóòèò<br />

ê íåìó Dlg_Proc. Ôóíêöèÿ íàçûâàåòñÿ DialogBox è â ïðîãðàììå çàïóñêàåòñÿ<br />

ñëåäóþùèì îáðàçîì:<br />

DialogBox(hinst, MAKEINTRESOURCE(IDD_DIALOG1), NULL, Dlg_Proc);<br />

IDD_DIALOG1 - èäåíòèôèêàòîð ðåñóðñà äèàëîãà, à Dlg_Proc - ñîçäàííàÿ íàìè ôóíêöèÿ<br />

äëÿ ñîîáùåíèé. Ýòó ñòðîêó ïîñòàâèì â ãëàâíûé ïîòîê (WinMain), è âîò, GUI äëÿ íàøåé<br />

òåðìèíàëüíîé ïðîãðàììû ïîëíîñòüþ çàâåðøåí. Ñîáèðàåì âñå âìåñòå (ñì. ëèñòèíã),<br />

è íàøà ïðîãðàììà ãîòîâà. Ïîðà ïðîâåðèòü åå â äåéñòâèè.<br />

Òåñòèðóåì<br />

Îáùàåìñÿ ÷åðåç NULL-ìîäåì<br />

Ïåðâîå, ÷òî ïðèøëî ìíå â ãîëîâó, ïîïðîáîâàòü<br />

íàøó ïðîãðàììó â êà÷åñòâå<br />

÷àòà, ïðè÷åì îáû÷íîãî null-ìîäåìíîãî.<br />

ß âçÿë com2com ïðîâîä è ñîåäèíèë<br />

èì âûõîäû ïîðòîâ com1 è<br />

com2. Ïîñëå ÷åãî çàïóñòèë äâå êîïèè<br />

ïðîãðàììû, îäíîé îòêðûâ com1, à<br />

äðóãîé - com2. Âûøëî î÷åíü óäà÷íî:<br />

äàííûå, ïîñëàííûå â îäèí ïîðò, óñïåøíî<br />

÷èòàëèñü èç äðóãîãî. Íà ýòîì ÿ<br />

íå îñòàíîâèëñÿ. Ïîñêîëüêó èçíà÷àëüíî<br />

ìû ïèñàëè òåðìèíàëüíóþ ïðîãðàììó<br />

äëÿ ìîäåìà, òî è ïðîòåñòèðóåì<br />

åå íà ìîäåìå. Ýòî íåñëîæíî, ïðîòîêîë<br />

îáùåíèÿ ñ ìîäåìîì òàêîé:<br />

\r<br />

\r\r<br />

Ëèñòèíã îêîííîé ïðîöåäóðû<br />

int __stdcall Dlg_Proc(HWND hwnd, UINT wMsg, WPARAM wParam, LPARAM<br />

lParam)<br />

{<br />

switch (wMsg){<br />

case WM_CLOSE:<br />

EndDialog(hwnd,1);<br />

break;<br />

case WM_COMMAND:<br />

switch (LOWORD(wParam)) {<br />

case IDC_BUTTON1:<br />

// Íàæàëè íà êíîïêó îòïðàâêè äàííûõ<br />

// Âûäåëÿåì ïàìÿòü ïîä áóôåðû<br />

writebuffer = (char*)malloc((size_t)128);<br />

memset(writebuffer,0,128);<br />

// ïîëó÷àåì òåêñò èç ïîëÿ<br />

GetDlgItemText(hwnd,IDC_EDIT1,writebuffer,128);<br />

writebuffer[strlen(writebuffer)] = '\r';<br />

writebuffer[strlen(writebuffer)] = '\0';<br />

// îòïðàâëÿåì<br />

TerminateThread(hThread,0);<br />

WriteFile(hCom, writebuffer,<br />

strlen(writebuffer),&n1,0); // Îòïðàâëÿåì òåêñò<br />

// Çàíîâî ñîçäàåì íèòü<br />

hThread = CreateThread(0, 0, ReadThread, (LPVOID)hwnd, 0, 0);<br />

break;<br />

case IDC_BUTTON2:<br />

// Íàæàëè íà êíîïêó îòêðûòèÿ ïîðòà<br />

combuffer = (char*)malloc((size_t)16);<br />

memset(combuffer,0,16);<br />

// Ïîëó÷àåì èìÿ ïîðòà è îòêðûâàåì åãî<br />

GetDlgItemText(hwnd,IDC_EDIT2,combuffer,16);<br />

hCom = CreateFile(combuffer, GENERIC_READ | GENERIC_WRITE,<br />

0, 0, 3, 0, 0);<br />

hThread = CreateThread(0, 0, ReadThread, (LPVOID)hwnd, 0, 0);<br />

// íàñòðàèâàåì åãî<br />

GetCommState(hCom, &dcb);<br />

dcb.BaudRate = CBR_57600;<br />

dcb.ByteSize = 8;<br />

dcb.Parity = NOPARITY;<br />

dcb.StopBits = ONESTOPBIT;<br />

SetCommState(hCom, &dcb);<br />

break;<br />

}<br />

break;<br />

}<br />

return false;<br />

}<br />

87

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!