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;
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.");
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.");
}
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.