# include <stdio.h>
# include <windows.h>
# include <conio.h>
void wiev_dcb(HANDLE hCom,HANDLE hConsole,DCB & PortDCB);
void set_dcb(HANDLE hCom,HANDLE hConsole,DCB & PortDCB,int baudrate,int parity, int bytesize,int stopbits);
void time(HANDLE hCom,HANDLE hConsole);
void load(HANDLE hConsole);
HANDLE open_port(HANDLE hCom,HANDLE hConsole);
void send_znak(HANDLE hCom,HANDLE hConsole);
bool IsKeyPressed(int virtualKey);
int vysielanie(HANDLE hCom, HANDLE hConsole);
void prijimanie(HANDLE hCom, HANDLE hConsole);
int chat(HANDLE hCom, HANDLE hConsole);
// *********************************************************************************
// *********************************************************************************
// *********************************************************************************
int main()
{
HANDLE hConsole;
hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole,15);
system ("cls");
// *********************************************************************************
// otvorenie portu
HANDLE hCom; // Handle na objekt typu súbor
SetConsoleTextAttribute(hConsole,15);
printf("Vyber port:\n"
"(1) Com1\n"
"(2) Com2\n"
"(3) Com3\n"
"(4) Com4\n");
switch(getch())
{
case '1':
load(hConsole);
hCom = CreateFile(
"COM1:",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL);
break;
case '2':
load(hConsole);
hCom = CreateFile(
"COM2:",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL);
break;
case '3':
load(hConsole);
hCom = CreateFile(
"COM3:",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL);
break;
case '4':
load(hConsole);
hCom = CreateFile(
"COM4:",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL);
break;
default:
SetConsoleTextAttribute(hConsole,12);
printf("\nZla volba!!\n\n\n");
SetConsoleTextAttribute(hConsole,15);
return 1;
break;
}
DCB PortDCB; // Štruktúra, v ktorej sú uložené parametre
PortDCB.DCBlength = sizeof(DCB); // Inicializuj položku DCBlength
GetCommState(hCom,&PortDCB); // Načítaj aktuálne nastavenia
// koniec - otvorenie portu
// *********************************************************************************
time(hCom,hConsole); //nastavenie timeoutov
load(hConsole);
wiev_dcb(hCom,hConsole,PortDCB); //zobrazenie konfiguracie portu
load(hConsole);
set_dcb(hCom,hConsole,PortDCB,9600,0,8,1); //nastavenie konfiguracie portu
load(hConsole);
wiev_dcb(hCom,hConsole,PortDCB); //zobrazenie konfiguracie portu
load(hConsole);
Sleep(1000);
while (1)
{
system ("cls");
COORD point = {30,0};
SetConsoleCursorPosition(hConsole, point);
SetConsoleTextAttribute(hConsole,14);
printf("RS-232 komunikator v1.20\n\n");
SetConsoleTextAttribute(hConsole,15);
printf("Menu:\n");
printf("(1) Chat \n");
printf("(2) - - - - - \n");
printf("(3) Opakovane odosielanie znaku \n");
printf("(4) - - - - - \n");
printf("(5) Ukazat nastavenia portu \n");
printf("(6) Nastavenit port \n");
printf("(7) Nastavenit timeouty \n");
printf("(8) Vyber portu \n");
printf("(9) - - - - - \n");
printf("(0) Koniec \n\n");
Sleep(100);
switch(getch())
{
case '1':
load(hConsole);
chat(hCom,hConsole);
SetConsoleTextAttribute(hConsole,12);
printf(" Koniec\n");
// getch();
Sleep(1000);
SetConsoleTextAttribute(hConsole,15);
Sleep(500);
break;
case '2':
load(hConsole);
getch();
break;
case '3':
load(hConsole);
send_znak(hCom,hConsole);
getch();
break;
case '4':
load(hConsole);
getch();
break;
case '5':
load(hConsole);
wiev_dcb(hCom,hConsole,PortDCB);
getch();
break;
case '6':
int baudrate, parity, bytesize, stopbits;
SetConsoleTextAttribute(hConsole,15);
printf("\nZadaj parametre:");
printf("\n\nBaudRate(9600):\t");
scanf("%d", &baudrate);
printf("Parity(0): \t");
scanf("%d", &parity);
printf("ByteSize(8): \t");
scanf("%d", &bytesize);
printf("StopBits(1): \t");
scanf("%d", &stopbits);
load(hConsole);
set_dcb(hCom,hConsole,PortDCB,baudrate,parity,bytesize,stopbits);
wiev_dcb(hCom,hConsole,PortDCB);
getch();
break;
case '7':
load(hConsole);
time(hCom,hConsole);
Sleep(500);
break;
case '8':
open_port(hCom,hConsole);
Sleep(500);
break;
case '0':
SetConsoleTextAttribute(hConsole,14);
printf("Dakujem za pouzivanie tohto programu :D\n\n");
SetConsoleTextAttribute(hConsole,15);
CloseHandle(hCom);
getch();
exit (0);
break;
case VK_ESCAPE:
Sleep(500);
break;
default:
SetConsoleTextAttribute(hConsole,12);
printf("Zla volba!!\n\n");
Sleep(500);
break;
}
}
CloseHandle(hCom); // zatvorime port
return 1;
}
// *********************************************************************************
// *********************************************************************************
// *********************************************************************************
// *********************************************************************************
// funkcia na zobrazenie komunikacnych nastaveni portu
void wiev_dcb(HANDLE hCom,HANDLE hConsole,DCB & PortDCB)
{
SetConsoleTextAttribute(hConsole,15);
printf("\nAktualne nastavenia portu:\n");
printf("Baud Rate: %d\n",PortDCB.BaudRate);
printf("Parity: %d\n",PortDCB.Parity);
printf("Byte Size: %d\n",PortDCB.ByteSize);
printf("Stop Bits: %d\n",PortDCB.StopBits);
printf("\n");
}
// *********************************************************************************
// funkcia na nastavenie komunikacnych nastaveni portu
void set_dcb(HANDLE hCom,HANDLE hConsole,DCB & PortDCB,int baudrate,int parity, int bytesize,int stopbits)
{
PortDCB.BaudRate = baudrate; // Zmeníme parametere v DCB
PortDCB.Parity = parity;
PortDCB.ByteSize = bytesize;
PortDCB.StopBits = stopbits;
int err;
err = SetCommState(hCom,&PortDCB); // Nastav aktuálne nastavenia na port
if(err)
{
SetConsoleTextAttribute(hConsole,12);
printf("Chyba: Port sa neda nakonfigurovat.\n");
return ;
}
else
{
SetConsoleTextAttribute(hConsole,10);
printf("Port je uspesne nakonfigurovany.\n");
}
}
// *********************************************************************************
// funkcia na nastavenie timeoutov
void time(HANDLE hCom,HANDLE hConsole)
{
COMMTIMEOUTS timeouts;
timeouts.ReadIntervalTimeout = 20; //20
timeouts.ReadTotalTimeoutMultiplier = 10; //10
timeouts.ReadTotalTimeoutConstant = 10; //100
timeouts.WriteTotalTimeoutMultiplier = 10; //10
timeouts.ReadTotalTimeoutConstant = 10; //100
if (!SetCommTimeouts(hCom,&timeouts))
{
SetConsoleTextAttribute(hConsole,12);
printf("Chyba: Timeouty nenastavene.\n");
return ;
}
else
{
SetConsoleTextAttribute(hConsole,10);
printf("Timeouty nastavene \n");
}
}
// *********************************************************************************
// funkcia na vyber portu
HANDLE open_port(HANDLE hCom,HANDLE hConsole)
{
SetConsoleTextAttribute(hConsole,15);
printf("\nVyber port:\n"
"(1) Com1\n"
"(2) Com2\n"
"(3) Com3\n"
"(4) Com4\n");
switch(getch())
{
case '1':
// CloseHandle(hCom);
load(hConsole);
hCom = CreateFile(
"COM1:",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL);
break;
case '2':
// CloseHandle(hCom);
load(hConsole);
hCom = CreateFile(
"COM2:",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL);
break;
case '3':
// CloseHandle(hCom);
load(hConsole);
hCom = CreateFile(
"COM3:",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL);
break;
case '4':
// CloseHandle(hCom);
load(hConsole);
hCom = CreateFile(
"COM4:",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL);
break;
default:
SetConsoleTextAttribute(hConsole,12);
printf("\nZla volba!!\n\n");
return 0;
break;
}
if ( hCom == INVALID_HANDLE_VALUE )
{
SetConsoleTextAttribute(hConsole,12);
printf("\nChyba: Port sa neda otvorit.\n\n");
return 0;
}
else
{
SetConsoleTextAttribute(hConsole,10);
printf("\nPort je uspesne otvoreny.\n");
}
return hCom;
}
// *********************************************************************************
// funkcia load
void load(HANDLE hConsole)
{
SetConsoleTextAttribute(hConsole,15);
int n;
for (n=1;n<11;n++)
{
printf(".");
Sleep(100);
}
printf("\n");
}
// *********************************************************************************
// funkcia opakovane vysielanie znaku na port
void send_znak(HANDLE hCom,HANDLE hConsole)
{
DWORD PocetOdo=0;
SetConsoleTextAttribute(hConsole,14);
printf("\nZvol odosielany znak");
char DataOdo=getch();
while (1)
{
WriteFile(
hCom, // Handle portu, ktory ste otvorili CreateFile
&DataOdo, // Smernik (pointer) na data, ktore chcem vysielat
1, // Pocet bytov, ktore chcem vyslat
&PocetOdo, // Smernik (pointer) na pocet vyslanych dat
NULL); // Musi byt NULL
if( PocetOdo != 1 ) // Ak pocet prenesenych dat nesuhlasi
{
SetConsoleTextAttribute(hConsole,12);
printf("\nChyba: Zapis na port sa nepodaril.\n\n");
CloseHandle(hCom);
Sleep(1000);
return;
}
else
{
SetConsoleTextAttribute(hConsole,10);
printf("\nOdoslany znak ");
SetConsoleTextAttribute(hConsole,15);
printf("%c", DataOdo);
}
if (IsKeyPressed(VK_ESCAPE))
{
SetConsoleTextAttribute(hConsole,12);
printf("\nKoniec prenosu");
Sleep(500);
SetConsoleTextAttribute(hConsole,15);
return;
}
Sleep(100);
}
}
// *********************************************************************************
// funkcia detekujuca stacenie klavesy
bool IsKeyPressed(int virtualKey)
{
return ((GetAsyncKeyState(virtualKey)&0x8000)!=0?true:false);
}
// *********************************************************************************
// funkcia na chat
int chat(HANDLE hCom, HANDLE hConsole)
{
SetConsoleTextAttribute(hConsole,9);
printf("\nChat\n\n");
SetConsoleTextAttribute(hConsole,15);
// unsigned int Data; // povodne char
DWORD Pocet_pri = 0;
char Data_pri[200]={0}; // Sem ulož prijatý znak
DWORD Pocet_odo = 0;
char Data_vys[150]={0};
unsigned int dlzka;
PurgeComm(hCom,PURGE_TXCLEAR | PURGE_RXCLEAR);
while(1)
{
while (1)
{
Pocet_pri=0;
ReadFile(
hCom,
Data_pri,
100,
&Pocet_pri,
NULL);
if(Pocet_pri != 0)
{
SetConsoleTextAttribute(hConsole, 14);
printf("ON:%s\n", Data_pri);
if (strcmp(Data_pri, "KONIEC") == 0)
return 1;
}
if (IsKeyPressed(VK_SHIFT))
break;
if (IsKeyPressed(VK_ESCAPE))
return 1;
}
SetConsoleTextAttribute(hConsole, 10);
printf("JA:");
Sleep(100);
gets(Data_vys);
dlzka = strlen(Data_vys);
WriteFile (
hCom, // Handle portu, z ktorého cítame
&Data_vys, // Pointer na buffer, kam ukladáme prijaté dáta
dlzka, // Pocet bytov, na ktoré cakáme
&Pocet_pri, // Pointer na skutocný pocet prijatých dát
NULL); // Musí byt NULL
if( Pocet_pri != dlzka )
{
printf("\n Chyba pri posielani spravy.\n");
CloseHandle(hCom);
return 0;
}
if(strcmp(Data_vys, "KONIEC") == 0)
return 1;
if (IsKeyPressed(VK_ESCAPE))
return 1;
}
return 1;
}