Příklad otevření COM a zápisu do něj. Je to vypreparováno z větší aplikace:
Kód: Vybrat vše
OVERLAPPED ovlp;
void open_comm()
{
int r, rcnt, tcnt=0;
char s[300];
char t[50];
char *hw;
HANDLE comm_device; // komunikacni handle
COMSTAT cs;
DWORD errors;
strcpy(t, "\\\\.\\"); strcat(t, cfgdt.port);
comm_device = CreateFile(t, GENERIC_READ|GENERIC_WRITE,
0, NULL, OPEN_EXISTING,
NULL, NULL);
if(comm_device == INVALID_HANDLE_VALUE) // otevri port
{
MessageBox(MainWindowHandle, STR(ID_S_OpenCommErr), "KTA",
MB_OK|MB_ICONEXCLAMATION);
return; // navrat pri chybe
}
SetupComm(comm_device, 7000L, 7000L); // nastav I/O fronty
strstream(s, sizeof(s), ios::out) << cfgdt.port <<
":9600,n,8," << cfgdt.stopbits << ends; // sestav retezec parametru
if(!BuildCommDCB(s, &comm_blok)) // sestav ridici blok spojeni
{
MessageBox(MainWindowHandle, STR(ID_S_OpenCommErr), "KTA",
MB_OK|MB_ICONEXCLAMATION);
CloseHandle(comm_device); // navrat pri chybe
comm_device = INVALID_HANDLE_VALUE;
return;
}
comm_blok.fBinary = 1; // binarni prenos
comm_blok.fOutxCtsFlow = 0; // nastav pouziti signalu
comm_blok.fOutxDsrFlow = 0;
comm_blok.fRtsControl = RTS_CONTROL_ENABLE;// rizeni RTS
comm_blok.fDtrControl = DTR_CONTROL_ENABLE;// rizeni DTR
comm_blok.fDsrSensitivity = false;
comm_blok.EvtChar = '\xff'; // nastav markant
if(!SetCommState(comm_device, &comm_blok))
{
MessageBox(MainWindowHandle, STR(ID_S_OpenCommErr), "KTA",
MB_OK|MB_ICONEXCLAMATION);
CloseHandle(comm_device);
comm_device = INVALID_HANDLE_VALUE;
return;
}
if(!SetCommTimeouts(comm_device, &comm_to))
{
MessageBox(MainWindowHandle, STR(ID_S_OpenCommErr), "KTA",
MB_OK|MB_ICONEXCLAMATION);
CloseHandle(comm_device);
comm_device = INVALID_HANDLE_VALUE;
return;
}
// ---------------------- Escape na zacatek ----------------
WriteFile(comm_device,"A", 1,(DWORD*)&rcnt,&ovlp);
Sleep(10); // prvotni AT pro autodetekci rychlosti
WriteFile(comm_device,"\r\n", 2,(DWORD*)&rcnt,&ovlp);
Sleep(100);
PurgeComm(comm_device, PURGE_RXCLEAR); // vycisti buffery
ClearCommError(comm_device, &errors, &cs);
TransmitCommChar(comm_device, '\x1b'); // vysli Escape
// ---------------- zjisteni verze HW ---------------------
main_window->hwversion->SetText("------");
if(!write_comm("C", 1)) // zadost o reset a uvodni retezec
{
. . .
}
// ------------------ WRITE_COMM ---------------------------
// Funkce vysle retezec znaku do zarizeni, cekajic vzdy na echo.
bool write_comm(char* sbuf, int scnt)
{
int t;
char echo[2];
DWORD written;
t = time(0);
do
{ // opakuj po znacich
WriteFile(comm_device,sbuf++,1L,&written,&ovlp); // vysli 1 znak
do
{
ReadFile(comm_device,echo,1L,&written,&ovlp); // cti echo
if(written > 0) // echo nacteno ?
break; // tak dalsi znak
if((time(0) - t) >= 2) // delka cekani ?
return false; // vyprsel time_out
}
while(true);
} while(--scnt > 0); // vsechny znaky
return TRUE; // vysilani OK
}