Scriem un program pentru portul com. Serial Port Monitor COM Software Monitoring Port

Despre cum să prezinți frumos datele trimise de Arduin către Serial. După părerea mea, băieții au propus o soluție foarte frumoasă, care, pe de o parte, arată destul de simplă, iar pe de altă parte vă permite să obțineți un rezultat excelent cu un minim de efort.

În comentariile la articol, ei și-au exprimat regretul că o astfel de soluție nu ar funcționa sub Firefox și au exprimat ideea că „puteți scrie și un server web simplu cu ieșire html pe baza acestui lucru”. M-a cucerit ideea asta căutare rapidă pe google soluție gata făcută nu am cedat și am decis să implementez singur ideea. Și asta a rezultat din asta.

Avertizare! Soluția propusă nu trebuie în niciun caz considerată completă. Spre deosebire de Proiectorul Serial de la Amperka, este un concept, o demonstrație a unei posibile abordări, un prototip funcțional și nimic mai mult.

Cu ceva timp în urmă am făcut un proiect în care am folosit accelerometrele încorporate într-un smartphone Android pentru a controla servomotoarele conectate la un Arduino. Apoi, în aceste scopuri, am folosit Scripting Layer pentru proiectele Android (SL4A) și RemoteSensors. Se pare că biblioteca standard Python include pachetul BaseHTTPServer, cu ajutorul căruia ridicarea unui serviciu web în Python este o sarcină de câteva linii de cod.

Nu aveam senzori Arduino la îndemână, așa că am folosit termometrul intern încorporat în Arduino Uno ca sursă de informații afișate. Din câte am înțeles, nu este foarte precis și nu este deloc destinat măsurării temperaturii ambientale, dar este destul de potrivit pentru prototipare.

După câteva căutare pe Google, a apărut această schiță pentru Arduino:

// sursa: https://code.google.com/p/tinkerit/wiki/SecretThermometer long readTemp() (rezultat lung; // Citiți senzorul de temperatură față de referința de 1,1 V ADMUX = _BV(REFS1) | _BV(REFS0) | _BV(MUX3); întârziere (2); -> Hardware -> Device Manager -> Porturi (COM și LPT).

Ca urmare, funcția CTestCOMDlg::OnInitDialog(), aflat în dosar TestCOMDlg.cpp, clasa noastră de dialog ar trebui să ia forma:

BOOL CTestCOMDlg::OnInitDialog() ( CDialog::OnInitDialog(); // Adăugați elementul de meniu „Despre...” în meniul de sistem. // IDM_ABOUTBOX trebuie să fie în intervalul de comandă de sistem. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); ) ) // Setați pictograma pentru acest dialog. Cadrul face acest lucru automat // când fereastra principală a aplicației nu este un dialog SetIcon(m_hIcon, TRUE); // Setați pictograma mare SetIcon(m_hIcon, FALSE); // Setați pictograma mică // TODO: Adăugați o inițializare suplimentară aici hFile = CreateFile("COM2", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0,NULL if(hFile==INVALID_HANDLE_VALUE) ( MessageBox("Nu s-a putut deschide portul!", "Ostbk", MB_ICONERROR); ) else; ( MessageBox("Portul deschis cu succes", "Ok", MB_OK); ) return TRUE // return TRUE dacă nu setați focalizarea pe un control )

Acum să adăugăm handlere pentru butoanele de control al liniilor. Le-am dat nume potrivite: funcția care setează unul pe linia DTR este OnDTR1(), 0 este OnDTR0(). Pentru linia RTS, în același mod. Permiteți-mi să vă reamintesc că handlerul este creat când dublu clic pe buton. Ca rezultat, aceste patru funcții ar trebui să arate astfel:

Void CTestCOMDlg::OnDTR1() ( // TODO: Adăugați aici codul de gestionare a notificărilor de control aici EscapeCommFunction(hFile, 6); ) void CTestCOMDlg::OnDTR0() ( // TODO: Adăugați aici codul de gestionare a notificărilor de control EscapeCommFunction(hFile, 5); ) void CTestCOMDlg::OnRTS1() ( // TODO: Adăugați aici codul de gestionare a notificărilor de control EscapeCommFunction(hFile, 4); ) void CTestCOMDlg::OnRTS0() ( // TODO: Adăugați aici codul de gestionare a notificărilor de control EscapeCommFunction(hFile, 3);

Lasă-mă să explic puțin cum funcționează. După cum puteți vedea, în interiorul lor ele conțin o provocare la același lucru Win API funcții EscapeCommFunction() cu doi parametri. Primul dintre ele este mânerul (MANERUL) pus portul deschis, al doilea - cod special acţiuni corespunzătoare condiție cerută linii.

Gata, compilam si lansam. Dacă totul este în regulă, ar trebui să vedeți un mesaj despre deschiderea cu succes a portului. Apoi, apăsând butoanele corespunzătoare, clipim LED-urile conectate la portul COM.

© Ivanov Dmitry
decembrie 2006

Porturile seriale sunt iubite de dezvoltatori pentru ușurința lor de întreținere și utilizare.

Și, bineînțeles, să scrieți pe consola unui program terminal este bine și bine, dar doriți propria aplicație, care, atunci când apăsați o tastă de pe ecran, efectuează acțiunile de care aveți nevoie;)

În acest articol voi descrie cum să lucrezi cu port comîn limbajul C++.

Soluția este simplă, dar din anumite motive nu a fost găsit imediat un exemplu de lucru. Așa că îl salvez aici.

Desigur, puteți folosi soluții multi-platformă precum QSerial - o bibliotecă inclusă în Qt, probabil o voi face, dar în viitor. Acum vorbim despre Windows „pur”. C++. Vom scrie în Visual Studio. Am 2010, deși asta nu contează deloc...

Creați un nou proiect de consolă Win32.

Includeți fișierele antet:

#include #include folosind namespace std;

Declarăm un handler de port com:

MÂNER hSerial;

Fac acest lucru la nivel global pentru a nu mă deranja cu pointerii atunci când îl transmit la funcții.

Int _tmain(int argc, _TCHAR* argv) (

Nu suport stilul de programare Windows. Își spuneau totul propriul nume și stăteau acolo bucurându-se...

Acum magia declarării unui șir cu numele portului. Faptul este că nu poate converti caracterul în sine.

LPCTSTR sPortName = L"COM1";

Lucrul cu porturi seriale în Windows funcționează ca un fișier. Deschiderea primului port com pentru scriere/citire:

HSerial = ::CreateFile(sPortName,GENERIC_READ | GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);

Verificarea functionalitatii:

If(hSerial==INVALID_HANDLE_VALUE) ( if(GetLastError()==ERROR_FILE_NOT_FOUND) (cout