Kuinka lukea dataa tietoliikenneportista. Sarjaportin valvonta COM-portin valvontaohjelmisto



Tämä kirjasto on ns SerialGate.dll. Jos haluat käyttää esimerkkejä tästä ja myöhemmistä artikkeleista, lataa se (kirjasto) ja halutessasi sen lähteet tämän osan edellisestä artikkelista.

"Koulutuspohjana" päätin harkita melko yleisen ongelman ratkaisemista - tietojen siirtämistä kahden tietokoneen välillä. Tietysti siirrämme tiedot COM-portin kautta.

Niin oudolta kuin se saattaakin tuntua, aloitetaan laitteistosta. Tietojen siirtämiseksi kahden tietokoneen välillä ne on liitettävä erityisellä kaapelilla. Sitä kutsutaan "nollamodeemikaapeliksi". COM-portti. Sitä myydään nimellä "DB9 Null Modem Cable" missä tahansa radioosaliikkeessä. COM-portti - naarasliitin on asennettu molempiin päihin. Yhdistä kahden tietokoneen portit tällä kaapelilla.

Tietysti jotkut lukijat kysyivät - minulla ei ole kahta tietokonetta, kuinka voin yrittää lähettää tietoja COM-portin kautta? Tässä tapauksessa seuraava vaihtoehto on täydellinen testaukseen ja todentamiseen - käytä saman tietokoneen kahta COM-porttia. Nuo. lähettää tietoja ohjelmasta yhteen porttiin ja lukea tietoja toisesta liittämällä ne aiemmin nollamodeemikaapelilla.


Mennään ohjelmointiin. Ensin kirjoitetaan konsolisovellus, joka lukee merkin näppäimistöltä ja lähettää sen COM-porttiin. Luomme tavalliseen tapaan Microsoftissa Visual Studio konsolisovellus ja kutsu sitä esim. COMServer. SerialGate.dll-kirjasto on liitettävä tyhjään tilaan. Toimintojen järjestys on täysin samanlainen kuin työskentely inpout32.dll-kirjaston kanssa. Sijoita tiedostot ladatusta arkistosta SerialGate.lib, SerialGate.h projektikansioon ja SerialGate.dll kansioon suoritettava ohjelma(Debug tai Release). Lisää seuraavaksi lib- ja h-tiedostot itse projektiin. Jos olet liian laiska tekemään kaikkea tätä, projekti voidaan ladata valmiina.

Tämä on itse asiassa itse ohjelmakoodi. Mietitään, mitä siinä tapahtuu. Ensin luodaan SerialGate-luokan esiintymä - sg. Seuraavaksi yritämme avata pääsyn COM-porttiin OpenPort()-luokkamenetelmällä. Tätä varten sinun on välitettävä COM-portin numero (kokonaisluku) funktiolle. Eli jos tietokoneellesi on asennettu esimerkiksi COM-portti nimeltä COM3 ja haluat avata sen, sinun on välitettävä funktiolle ensimmäisenä parametrina numero 3. Toinen parametri on nopeus, jolla portti toimii tiedonsiirron aikana. COM-porttien nopeus mitataan bitteinä sekunnissa, ja se voi saada jonkin arvon tietystä listasta. Oletuksena seuraavia nopeuksia voidaan käyttää Windowsissa:

110, 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 38400, 57600, 115200, 128000 ja 256000 bps.

Kuitenkin monet virtuaaliset COM-portit tukea paljon enemmän suuret nopeudet(jopa 1 Mt/s). Tässä tapauksessa sinun on käytettävä niitä nopeuksia, joita yksi tai toinen kolmannen osapuolen portti tukee. Yllä luetellut nopeudet toimivat ehdottomasti kaikissa porteissa.

Esitetyssä esimerkissä portti "COM1" avataan nopeudella 57600 bps. Seuraavaksi "loputtomassa silmukassa" syötetään merkki näppäimistöltä ja lähetetään COM-porttiin käyttämällä Send()-luokkamenetelmää. Funktiolle välitetään kaksi parametria: sen puskurin osoite, jossa lähetettävä data sijaitsee, ja toinen parametri on tämän tiedon koko tavuina. Viimeistele syöttäminen kirjoittamalla "#" -symboli - ohjelma poistuu silmukasta ja sulkee portin Close()-menetelmällä.

#include #include #include "SerialGate.h" int main() ( int portti = 1; int bool res = sg.Open(port, rate); if (res == false return 0; ) else ( printf("Avaa OK!..\n"); ) printf("Paina näppäintä lähettääksesi sen COM-porttiin.\n"); printf("Poistu painamalla "#".\n\n"); while (true) ( ​​​​char c = getch(); printf("%c", c); sg.Send(&c, koko (c)); if (c == "#") break ; ) sg.Close(); getch( ); palauta 0;)

Tässä on yksinkertainen sovellus tietojen lähettämiseen. Nyt kirjoitetaan toinen ohjelma, joka avaa ensimmäisen kaapelin toisen COM-portin ja lukee tietoja sieltä. Valmis sovellusprojekti COMClient voi ladata artikkelin otsikosta.

Joten taas luomme SerialGate-luokan esiintymän ja avaamme "COM2"-portin nopeudella 57600 bps. Huomaa, että tiedon vastaanottaminen/lähettäminen edellyttää molempien tiedonvaihtoon osallistuvien porttien olevan auki samalla nopeudella. Seuraavaksi "loputtomassa" silmukassa yhden sekunnin välein luemme tiedot COM-portista Recv()-menetelmällä. Sen on läpäistävä kaksi parametria: sen puskurin osoite, johon luetut tiedot sijoitetaan, ja tämän puskurin koko, jotta vältytään siirtymästä taulukon ulkopuolelle. Funktio palauttaa luettujen tavujen määrän. Sitten luetut tiedot tulostetaan tavu kerrallaan ja jos "#"-merkki löytyy, COMServer on lopettanut toimintansa ja tämän ohjelman on tehtävä sama.

#sisällytä #sisällytä #sisällytä "SerialGate.h" int main() ( int portti = 2; int rate = 57600; SerialGate sg; bool res = sg.Open(port, rate); if (res == false ) ( printf ("Avaa virhe..\n"); getch(); return 0; ) else ( printf("Avaa OK!..\n"); ) printf("Hae tiedot COM-portista 1 sekunnin välein.\n\ n"); char buf; int dwBytesRead = 0; bool lopeta = epätosi; while (!terminate) ( Sleep(1000); dwBytesRead = sg.Recv(buf, sizeof (buf)); for (int i = 0; i if(buf[i] == "#") ( terminate = true ; break ; ) ) ) sg.Close(); return 0; )

On aika testata tätä koko järjestelmää. Tarkista, oletko liittänyt portit kaapelilla. Kokoamme ja suoritamme molemmat sovellukset. COMServer-ohjelmassa kirjoitamme tekstiä näppäimistöltä - pienellä viiveellä sen pitäisi ilmestyä COMClient-ohjelmaikkunaan.


Seuraavissa artikkeleissa kirjoitamme Windows-sovellus tiedon vastaanottamiseen/lähettämiseen ja harkitsemaan muita kirjaston ominaisuuksia.

© Ivanov Dmitry
toukokuuta 2007

Tietoja siitä, kuinka kauniisti esittää Arduinin sarjalle lähettämät tiedot. Mielestäni kaverit ehdottivat erittäin kaunista ratkaisua, joka toisaalta näyttää melko yksinkertaiselta ja toisaalta antaa sinulle mahdollisuuden saada erinomainen tulos vähällä vaivalla.

Artikkelin kommenteissa he pahoittelivat, että tällainen ratkaisu ei toimi Firefoxissa ja ilmaisivat ajatuksen, että "tämän asian perusteella voi myös kirjoittaa yksinkertaisen web-palvelimen html-ulostulolla." Tästä ideasta jäin koukkuun, nopea Google-haku ei löytänyt valmista ratkaisua ja päätin toteuttaa idean itse. Ja tämä siitä tuli.

Varoitus! Ehdotettua ratkaisua ei missään tapauksessa pitäisi pitää täydellisenä. Toisin kuin Amperkan sarjaprojektori, se on konsepti, mahdollisen lähestymistavan esittely, toimiva prototyyppi eikä mitään muuta.

Tein jokin aika sitten projektin, jossa ohjasin Arduinoon kytkettyjä servoja Android-älypuhelimen sisäänrakennetuilla kiihtyvyysantureilla. Sitten näihin tarkoituksiin käytin Scripting Layer for Android (SL4A) ja RemoteSensors -projekteja. Osoittautuu, että sisään tavallinen kirjasto python sisältää BaseHTTPServer-paketin, jonka avulla verkkopalvelun nostaminen Pythonissa on muutaman koodirivin tehtävä.

Minulla ei ollut Arduino-antureita käsillä, joten käytin Arduino Unoon sisäänrakennettua sisäistä lämpömittaria näytettävän tiedon lähteenä. Ymmärtääkseni se ei ole kovin tarkka eikä ole ollenkaan tarkoitettu ympäristön lämpötilan mittaamiseen, mutta prototyyppien tekemiseen se on varsin sopiva.

Pienen googlauksen jälkeen ilmestyi tämä luonnos Arduinolle:

// lähde: https://code.google.com/p/tinkerit/wiki/SecretThermometer long readTemp() ( pitkä tulos; // Lue lämpötila-anturi 1,1 V:n referenssiä vastaan ​​ADMUX = _BV(REFS1) | _BV(REFS0) | _BV(MUX3); viive(2); // Odota, että Vref ratkaisee ADCSRA:n |= _BV(ADSC); // Muunna while (bit_is_set(ADCSRA,ADSC)); tulos = ADCL; tulos |= ADCH