Скачиваний:
34
Добавлен:
15.09.2014
Размер:
3.01 Кб
Скачать
# include <String.cpp>
String name;
int index, Y=0;
HANDLE hCOM, reader;
HANDLE semaphore, semaphore2;

// Прорисовка меню!!!
void menu (){
set_color(BLUE,WHITE);
goto_xy(0,23); for (int i=0; i<80; i++) {wcout << L"_";}
cout << "Message from " << name << ": ";}

// Открытие COM порта!!!
bool Open() {
wchar_t* NAME; NAME=new wchar_t [name.length()+1];
name.copy_to_wchar(NAME);
hCOM = CreateFile(NAME,GENERIC_READ | GENERIC_WRITE,0,0,OPEN_EXISTING,0,NULL);
delete [] NAME;

if (hCOM==INVALID_HANDLE_VALUE){return false;}
COMMTIMEOUTS timeouts = {0};
timeouts.ReadIntervalTimeout = 1;
timeouts.ReadTotalTimeoutMultiplier = 1;
timeouts.ReadTotalTimeoutConstant = 1;
timeouts.WriteTotalTimeoutMultiplier = 1;
timeouts.WriteTotalTimeoutConstant = 1;

DCB dcb = {0};
dcb.BaudRate = CBR_57600;
SetCommState(hCOM, &dcb);
return true;}

// Закрытие системных указателей!!!
void Close() {
CloseHandle(reader);
CloseHandle(hCOM);
CloseHandle(semaphore);
CloseHandle(semaphore2);}

// Запись!!!
void Write (String line){
DWORD writed;
int number=line.length();
char* buffer; buffer=new char[line.length()];
line.copy_to_char(buffer);
WriteFile(hCOM,&index,sizeof(int),&writed,NULL);
WriteFile(hCOM,&number,sizeof(int),&writed,NULL);
WriteFile(hCOM,buffer,line.length(),&writed,NULL);
goto_xy (0,Y);
set_color(RED,WHITE);
cout << name << ": " << line; Y++; if (Y==23) {clrscr(); set_color(BLACK,YELLOW); menu(); Y=0;}
set_color(BLACK,YELLOW);
SuspendThread(reader);
ReleaseSemaphore(semaphore2,1,NULL);
WaitForSingleObject(semaphore,1000);
ResumeThread(reader);}

// Чтение!!!
String Read (){
DWORD readed;
int number=0;
String line="COM";
ReadFile(hCOM,&number,sizeof(number),&readed,NULL);
line+=number; line+=": ";
ReadFile(hCOM,&number,sizeof(number),&readed,NULL);
if (!number) {cout << "Error!!!"; getch(); exit(1);}
char* buffer; buffer=new char[number];
ReadFile(hCOM,buffer,number,&readed,NULL);
line+=buffer; delete [] buffer;
line[6+number]='\0';
return line;}

// Поток для чтения!!!
DWORD WINAPI read_express (LPVOID y){
String buffer;
for(; ;){
WaitForSingleObject(semaphore2,INFINITE);
goto_xy(0,Y);
buffer=Read();
set_color(GREEN,WHITE);
cout << buffer;
Y++; if (Y==23) {clrscr(); set_color(BLACK,YELLOW); menu(); Y=0;}
set_color(BLACK,YELLOW);
goto_xy(19,24);
ReleaseSemaphore(semaphore,1,NULL);}}

// MAIN!!!
int main(){
set_console_size(80,25);
set_color(BLUE,WHITE);
clrscr();
String line;
cout << "Enter the number of COM port: "; getl(name,30,0,2); index=name.String_to_int(); name.insert("COM",0); clrline(0);
if (!Open()) {set_color(RED,WHITE); clrline(0);
cout << "Error! " << name << " can't be opened!!!"; getch(); Close(); exit(1);}
reader=CreateThread(0,0,read_express,0,0,0);
semaphore=CreateSemaphore(NULL,0,1,L"Semaphore");
semaphore2=CreateSemaphore(NULL,0,1,L"Semaphore2");

for (;;){
menu(); line.del(); getl(line,19,24,50);
if (line=="exit") {break;}
Write(line);}
Close();
return 0;}