Dobrý deň.
Vytvoril som si program vo WinApi na komunikáciu s PIC obvodom, a potrebujem čítať impulzy z jedného jeho pinu. Rozhodol som sa ku tomuto účelu využiť port CTS na zbernici RS232. K jeho čítaniu používam funkciu:
bool GetCTS(void)
{ DWORD ModemStatus;
GetCommModemStatus(ComHandle, &ModemStatus);
ModemStatus = ModemStatus & MS_CTS_ON;
return ((bool)ModemStatus);
}
Túto funkciu potom volám k vyskúšaniu v handleri:
case WM_KEYDOWN:
{ switch (wParam)
{ case VK_RETURN:
{ pocitadlo = 0;
for ( f = 0; f < 100; f++ )
{ if ( GetCTS() )
signal_CTS = 1;
else
signal_CTS = 0;
pocitadlo++;
}
}
}
}
Čiže keď stlačím ENTER a nechám si zobraziť premennú počítadlo, vizuálne vidím, koľko času asi uplynulo, než 100x prečíta port CTS na RS232. Je to celkovo asi 2 sekundy. To je však pre môj účel veľmi-veľmi pomaly. Funkcia GetCTS() síce číta impulzy správne (z obvodu PIC16F628), to už som inde vyskúšal, po tejto stránke som spokojný, avšak číta to veľmi pomaly. Neviem čo ďalej robiť. Vyskúšal som všetko možné, čo som vedel. Googlením som strávil radu dní, čo pri tom sedím od rána do večera, a nič som nevyriešil.
Vyskúšal som aj takú vec, že som zámerne napísal chybné číslo COMu. Vtedy po stlačení ENTER ten cyklus for prebehne okamžite. Aj keď zvýšim cieľovú hodnotu na 100000, prebehne takmer okamžite. Toto by mi úplne vyhovovalo. Avšak akonáhle je COM port načítaný správne, číta to opäť veľmi pomaly.
Port otváram pomocou funkcie:
HANDLE ComHandle;
CloseHandle(ComHandle);
ComHandle = CreateFile(
"COM3",
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
0);
. . . . . . . . .
CloseHandle(ComHandle);
Skúšal som sa hrať aj so štruktúrou DCB (i keď bežnú sériovú komunikáciu RS232 tx/rx nevyužívam, lebo ju nepotrebujem). Testovall som i rôzne nastavenia - napr.:
DCB dcb;
dcb.DCBlength = sizeof(DCB);
GetCommState(ComHandle, &dcb);
dcb.BaudRate = 9600;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
.
.
. . . ale nič nepomohlo. Menil som aj rôzne ďalšie paramete, ale nič nepomohlo. Stále rovnako pomaly.
Skúšal som i funkcie SetCommMask(), WaitCommEvent(), a štruktúru OVERLAPPED, ale ani to nepomohlo.
Cyklus správ vo funkcii WinMain() používam klasický:
while ( GetMessage ( &Msg, NULL, 0, 0 ) > 0 )
{ TranslateMessage( &Msg );
DispatchMessage( &Msg );
}
return Msg.wParam;
Mohli by ste mi prosím poradiť? -Neviem, ako ďalej.