Код: Выделить всё
#include "stdafx.h"
#include <Windows.h>
#include <iostream>
#include <ctime>
#include <stdio.h>
#include <conio.h>
#include "h.h"
#define _WIN32_WINNT 0x0500
#include <fstream>
using namespace std;
HANDLE hSerial;
int VklRele() //включаю
{
LPCTSTR sPortName = L"COM3";
hSerial = ::CreateFile(sPortName,GENERIC_READ | GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if(hSerial==INVALID_HANDLE_VALUE)
{
if(GetLastError()==ERROR_FILE_NOT_FOUND)
{
cout << "serial port does not exist.\n";
}
cout << "some other error occurred.\n";
}
if(hSerial!= NULL) //здесь как бы пытаюсь очистить буфер, но безуспешно
CloseHandle(hSerial);
DCB dcbSerialParams = {0};
dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
if (!GetCommState(hSerial, &dcbSerialParams))
{
cout << "getting state error\n";
}
dcbSerialParams.BaudRate=CBR_9600;
dcbSerialParams.ByteSize=8;
dcbSerialParams.StopBits=ONESTOPBIT;
dcbSerialParams.Parity=NOPARITY;
if(!SetCommState(hSerial, &dcbSerialParams))
{
cout << "error setting serial port state\n";
}
char data[] = "$KE,REL,1,1\r\n";
DWORD dwSize = sizeof(data);
DWORD dwBytesWritten;
LPOVERLAPPED ov;
BOOL iRet = WriteFile (hSerial,data,dwSize,&dwBytesWritten ,NULL);
cout << dwSize << " Bytes in string. " << dwBytesWritten << " Bytes sended. " << endl;
//PurgeComm(hSerial, PURGE_TXCLEAR);// эту команду пробовала использовать
//PurgeComm(hSerial, PURGE_RXCLEAR);// здесь пробовала параметр сменить
//FlushFileBuffers(hSerial);// и эта тоже не работает...
return 0;
}
int ViklRele()// выключаю
{
LPCTSTR sPortName = L"COM3";
hSerial = ::CreateFile(sPortName,GENERIC_READ | GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if(hSerial==INVALID_HANDLE_VALUE)
{
if(GetLastError()==ERROR_FILE_NOT_FOUND)
{
cout << "serial port does not exist.\n";
}
cout << "some other error occurred.\n";
}
if(hSerial!= NULL)
CloseHandle(hSerial);
DCB dcbSerialParams = {0};
dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
if (!GetCommState(hSerial, &dcbSerialParams))
{
cout << "getting state error\n";
}
dcbSerialParams.BaudRate=CBR_9600;
dcbSerialParams.ByteSize=8;
dcbSerialParams.StopBits=ONESTOPBIT;
dcbSerialParams.Parity=NOPARITY;
if(!SetCommState(hSerial, &dcbSerialParams))
{
cout << "error setting serial port state\n";
}
char data[] = "$KE,REL,1,0\r\n";
DWORD dwSize = sizeof(data);
DWORD dwBytesWritten;
LPOVERLAPPED ov;
BOOL iRet = WriteFile (hSerial,data,dwSize,&dwBytesWritten ,NULL);
cout << dwSize << " Bytes in string. " << dwBytesWritten << " Bytes sended. " << endl;
//PurgeComm(hSerial, PURGE_TXCLEAR);// вообщем те же самые попытки, что и в функции VklRele()
//PurgeComm(hSerial, PURGE_RXCLEAR);//
//FlushFileBuffers(hSerial);//
return 0;
}
//здесь я делаю таймер, чтобы использовать в main
void how2timer(int ms) {
int CLOCKS_PER_MSEC = CLOCKS_PER_SEC / 1000;
clock_t end_time = clock() + ms * CLOCKS_PER_MSEC ;
while (clock() < end_time) {}
cout << "5 seconds passed!!!\n";
}
int _tmain(int argc, _TCHAR* argv[])
{
while(1){
cout<<"Read data from DATA register.\n"<<endl;
int data;
data = Inp32(888); //считываю с lpt порта
cout<<"10: "<<data<<endl;
char number[20];
itoa(data,number,2); //считываю с lpt порта
cout<<" 2: "<<number<<endl;
//здесь сравниваю значения, полученные с lpt порта
if(number[0]=='1' && number[1]=='1' && number[2]=='1' && number[3]=='1' && number[4]=='1' && number[5]=='1' && number[6]=='1' && number[7]=='1')
{
VklRele();// если замкнулся нужный контакт, то включаю реле, т.е.какое-нибудь устройство
how2timer(5000);//жду 5 секунд
ViklRele();//устройство должно выключиться
}
}
return 0;
}