Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Pristup serijskom portu u windows-u

[es] :: C/C++ programiranje :: Pristup serijskom portu u windows-u

[ Pregleda: 1914 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

vs2000

Član broj: 281455
Poruke: 12
*.adsl-a-3.sezampro.rs.



+1 Profil

icon Pristup serijskom portu u windows-u25.04.2011. u 19:50 - pre 158 meseci
Ljudi da li može pomoć od nekoga ko se razume u windows programiranje.
Upravo sam završio program koji skuplja neke podatke preko serijskog porta, prikazuje ih itd.
Program radi dobro na Linux-u, i tu za komunikaciju preko serijskog porta koristim neku biblioteku
qport. Isti program treba da radi i na Windows-u, i to sve radi, kompajlira se, funkcioniše isto,
osim šta imam problem da kada se otovori serijski port program zauzima 99% procesorskog vremena.
Na Linux-u isti program uzima 2-3%. Ne umem ra rešim problem.
Poslednja 4 dana probavam razne varijante; probao sam QextSerialPort koji svi preporučuju,
ali to jednostavno ne radi kako treba, šta god da sam pokušavao, pravi ozbiljen probleme.
Najbolje mi izgleda da pristupim portu preko widnows api funkcija, i pokušavam celo veče
ali nikako mi ne uspeva.
Da li može neko ko se bolje razume u ovo da mi kaže u čemu je problem.
Kôd je sledeći:

Imam jednu globalnu promenjivu:

Code:
HANDLE serijski_port;



Zatim kod za otvaranja datoteke za pristup portu i neko podešavanje parametara brzine i ostalog:

Code:
serijski_port = CreateFileA( "COM1",GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL) ;

        if(serijski_port==INVALID_HANDLE_VALUE)
        {
            qDebug("Ovaj port ne postoji");
        }

        DCB dcbSerialParams = {0};
        dcbSerialParams.BaudRate=CBR_300;
        dcbSerialParams.ByteSize=8;
        dcbSerialParams.StopBits=ONESTOPBIT;
        dcbSerialParams.Parity=NOPARITY;

        qDebug("Port valjda otvoren bez greške.");




I deo za čitanje:


Code:
DWORD dwVelicina = 0;
    char  chProcitano[9] = {0};

    BOOL fWaitingOnRead = FALSE;
    OVERLAPPED osReader = {0};

    osReader.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

    if (!SetCommMask(serijski_port, EV_RXCHAR))
    {
        qDebug("Greška...");
    }

        if (ReadFile(serijski_port, &chProcitano, 8, &dwVelicina, &osReader))
       {

          for(int i=0;i<dwVelicina;i++)
          {
            qDebug("Podaci: %d",chProcitano[i]);
          }
       }
       else
       {
           qDebug("Nema podataka na portu.");
       }



Problem je sa ovim delom programa koji treba da čita podatke. Kada nema podataka, on ispisuje normalno
da ih nema, ali kada stignu promenjiva chProcitano sadrži uvek samo nule (0).
Šta ne radim kako treba?

Hteo bih još da odradim ako ovo bude radilo da kada stignu podaci pokrene se funkcija koja ih pročita.
Samo što ne znam kako da to uradim za ovaj HANDLE.
 
Odgovor na temu

bventil
desp

Član broj: 67391
Poruke: 50
109.72.52.*

Sajt: www.geocities.com/bope999


+1 Profil

icon Re: Pristup serijskom portu u windows-u26.04.2011. u 00:24 - pre 158 meseci
Nadam se da cu uspeti da ti pomognem.

Ono sto moras da uradis je da kod za citanje stavis u thread obavezno, ako nisi do sad.
Mozda je to razlog sto je zauzece procesora 99%. (verovatno ne, ali probaj)

Druga stvar je vezana za citanje.
Ponekad ReadFile ne procita sve odmah, onda treba proveriti da li je citanje zavrseno, sto se radi WaitForSingleObject f-jom,
koju postavljas u else od if (ReadFile...

Od te fje, dobijas odgovore da li je vreme za citanje isteklo ili je citanje zavrseno.
Ako jeste uspesno zavrseno, onda tek proveravas da li ima greske u citanju ili je sve uspesno, pa ako jeste uspesno uradis isto ono sto i posle ReadFile.

Negde na netu sigurno imas gotov kod za ovo.
Ako ne nadjes, iskopacu ti ja i paste-ovacu ti, sad je kasno i mrzi me da trazim :D

 
Odgovor na temu

vs2000

Član broj: 281455
Poruke: 12
*.adsl-1.sezampro.rs.



+1 Profil

icon Re: Pristup serijskom portu u windows-u26.04.2011. u 19:17 - pre 158 meseci
Pretraživao sam net uzduž i popreko da nađem neki primer koji radi. Sve što nalazim su nekakvi školski primeri. Windows programiranje mi je strano, i ne snalazim se. SAmo ne mogu da verujem da nikako ne uspevam da napravim nešto što bi trebalo da bude tako jednostavno kao čitanje podataka sa serijskog porta.
Da li može neki primer od nekoga ko zna kako se to radi samo za ovu funkciju koja čita podatke?

Što se tiče onog što sam prethodno koristio to je neka gotova kontrola, ne uspevam da nađem šta je problem u njoj, osim što sumnjam da je to zato što je izrgrađena na QextPort klasi, koja je problematična i ne radi dobro, na šta sam pročitao mnoge komentare.
 
Odgovor na temu

[es] :: C/C++ programiranje :: Pristup serijskom portu u windows-u

[ Pregleda: 1914 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.