Листинг программы (1061443), страница 4
Текст из файла (страница 4)
#define MaxBlockSize 2048
#define TimeOut 100
//---------------------------------------------------------
class ComPort {
public:
int iErrNum;
AnsiString asError;
ComPort ();
HANDLE GetComHandle () {return hComPortHandler;};
int GetBlockSize () {return iBlockSize;};
bool IsOpened () {return bPortOpened;};
AnsiString GetPortName ();
bool SetParams (AnsiString PortName, int iBSize, int iBRate);
bool OpenComPort ();
bool CloseComPort ();
bool OpenCom();
private:
bool bPortOpened;
HANDLE hComPortHandler; // Указатель на открытый порт
char* cPortName;
char* cPrevPortName;
int iBlockSize;
int iBitRate;
DCB dcbCom;
COMMTIMEOUTS CommTimeOuts;
};
ComPort::ComPort ()
{
iErrNum=0;
bPortOpened=false;
cPrevPortName="0";
}
AnsiString ComPort::GetPortName ()
{
AnsiString asPortName(cPortName);
return asPortName;
}
bool ComPort::SetParams (AnsiString PortName, int iBSize, int iBRate)
{
// Проверка и установка имени порта
if (!PortName.AnsiCompare("COM1")) cPortName="COM1";
else
if (!PortName.AnsiCompare("COM2")) cPortName="COM2";
else
{
iErrNum=1;
asError=_ERRT01; // Неверное имя порта
return false;
}
// Проверка и установка размера блока данных
if ((iBSize > MaxBlockSize)||(iBSize < 2))
{
iErrNum=2; // Размер блока данных превышает максимальный
asError=_ERRT02;
return false;
}
if (iBSize%2) iBlockSize=iBSize-1;
else iBlockSize=iBSize;
// установка скорости передачи
if ((iBRate!=300)&&(iBRate!=600)&&(iBRate!=1200)&&(iBRate!=2400)&&
(iBRate!=4800)&&(iBRate!=9600)&&(iBRate!=14400)&&(iBRate!=19200)&&
(iBRate!=38400)&&(iBRate!=56000)&&(iBRate!=57600)&&
(iBRate!=115200)&&(iBRate!=128000))
{
iErrNum=3; // Скорость передачи задана неверно
asError=_ERRT03;
return false;
}
else iBitRate=iBRate;
return true;
}
bool ComPort::OpenCom()
{
if(strcmp(this->cPrevPortName,this->cPortName))
{
if(!strcmp(this->cPrevPortName,"0"))
{
strcpy(this->cPrevPortName,this->cPortName);
return this->OpenComPort();
}
else
{
if(this->bPortOpened) this->CloseComPort();
strcpy(this->cPrevPortName,this->cPortName);
return this->OpenComPort();
}
}
}
bool ComPort::OpenComPort ()
{
if (bPortOpened) return false;
// Открытие порта
hComPortHandler=CreateFile(cPortName, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
if (hComPortHandler==INVALID_HANDLE_VALUE)
{
iErrNum=4; // Невозможно открыть порт
asError=_ERRT04;
return false;
}
// Очистка буферов
PurgeComm(hComPortHandler, PURGE_RXCLEAR);
PurgeComm(hComPortHandler, PURGE_TXCLEAR);
// Настройка порта
if (!GetCommState(hComPortHandler, &dcbCom))
{
CloseHandle(hComPortHandler);
iErrNum=5; // Ошибка при получении параметров порта
asError=_ERRT05;
return false;
}
dcbCom.fParity=NOPARITY;
dcbCom.ByteSize=8;
dcbCom.StopBits=ONESTOPBIT;
dcbCom.BaudRate=CBR_9600;
if (!SetCommState(hComPortHandler, &dcbCom))
{
CloseHandle(hComPortHandler);
iErrNum=6; // Ошибка при установке параметров порта
asError=_ERRT06;
return false;
}
// Настройка тайм-аутов
if (!GetCommTimeouts(hComPortHandler, &CommTimeOuts))
{
CloseHandle(hComPortHandler);
iErrNum=7; // Ошибка при получении тайм-аутов порта
asError=_ERRT07;
return false;
}
CommTimeOuts.ReadIntervalTimeout = 50;
CommTimeOuts.ReadTotalTimeoutMultiplier = 10;
CommTimeOuts.ReadTotalTimeoutConstant = 50;
CommTimeOuts.WriteTotalTimeoutMultiplier = 10;
CommTimeOuts.WriteTotalTimeoutConstant = 50;
if (!SetCommTimeouts(hComPortHandler, &CommTimeOuts))
{
CloseHandle(hComPortHandler);
iErrNum=8; // Ошибка при установке тайм-аутов порта
asError=_ERRT08;
return false;
}
bPortOpened=true;
return true;
}
bool ComPort::CloseComPort ()
{
if (!bPortOpened) return false;
PurgeComm(hComPortHandler, PURGE_RXCLEAR);
PurgeComm(hComPortHandler, PURGE_TXCLEAR);
if (!CloseHandle(hComPortHandler))
{
iErrNum=9;
asError=_ERRT09;
return false;
}
bPortOpened=false;
strcpy(this->cPrevPortName,"0");
return true;
}
// **************************************************** //
class SendFile {
public:
SendFile (HANDLE hCHandler) {hComHandler=hCHandler;};
void SetParam (HANDLE hCHandler) {hComHandler=hCHandler;};
bool Send (void* sbuf, int iSize);
AnsiString asError;
private:
HANDLE hComHandler;
};
bool SendFile::Send (void* sbuf, int iSize)
{
unsigned long* pcount=new(unsigned long);
WriteFile(hComHandler, sbuf, iSize, pcount, NULL);
return true;
}
// **************************************************** //
class ReceiveFile {
public:
ReceiveFile (HANDLE hCHandler);
~ReceiveFile () {if (rbuf!=NULL) delete (rbuf);};
void SetParam (HANDLE hCHandler) {hComHandler=hCHandler;};
bool Receive (int iSize, int Attempts);
bool ReceiveBytes (int iSize, int Attempts);
bool ReceiveInt (int Attempts);
char* rbuf;
short int * sibuf;
int ibuf;
AnsiString asError;
private:
HANDLE hComHandler;
COMSTAT csStat;
};
ReceiveFile::ReceiveFile (HANDLE hCHandler)
{
hComHandler=hCHandler;
rbuf=NULL;
sibuf=NULL;
ibuf=0;
}
bool ReceiveFile::Receive (int iSize, int Attempts)
{
unsigned long* pcount=new(unsigned long);
if (rbuf!=NULL) delete (rbuf); // Очистка буфера
rbuf=new char[iSize];
DWORD dwError;
for (int i=0; i<Attempts; i++)
{
ClearCommError(hComHandler, &dwError, &csStat);
if (csStat.cbInQue>0) // Анализ входного буфера порта
{
// Считывание из буфера
bool flag=ReadFile(hComHandler, rbuf, iSize, pcount, NULL);
if (!flag)
{
asError=_ERRT12; // Ошибка при чтении из порта
return false;
}
return true;
}
if (i<Attempts-1) Sleep(TimeOut);
}
asError=_ERRT16; // Истек тайм-аут ожидания
return false;
}
bool ReceiveFile::ReceiveBytes (int iSize, int Attempts)
{
unsigned long* pcount=new(unsigned long);
if (sibuf!=NULL) delete (sibuf); // Очистка буфера
sibuf=new short[iSize];
DWORD dwError;
for (int i=0; i<Attempts; i++)
{
ClearCommError(hComHandler, &dwError, &csStat);
if (csStat.cbInQue>0) // Анализ входного буфера порта
{
// Считывание из буфера
bool flag=ReadFile(hComHandler, sibuf, iSize*2, pcount, NULL);
if (!flag)
{
asError=_ERRT12; // Ошибка при чтении из порта
return false;
}
return true;
}
if (i<Attempts-1) Sleep(TimeOut);
}
asError=_ERRT16; // Истек тайм-аут ожидания
return false;
}
bool ReceiveFile::ReceiveInt (int Attempts)
{
unsigned long* pcount=new(unsigned long);
DWORD dwError;
for (int i=0; i<Attempts; i++)
{
ClearCommError(hComHandler, &dwError, &csStat);
if (csStat.cbInQue>0) // Анализ входного буфера порта
{
// Считывание из буфера
bool flag=ReadFile(hComHandler, &ibuf, 4, pcount, NULL);
if (!flag)
{
asError=_ERRT12; // Ошибка при чтении из порта
return false;
}
return true;
}
if (i<Attempts-1) Sleep(TimeOut);
}
asError=_ERRT16; // Истек тайм-аут ожидания
return false;
}
// **************************************************** //
class ACK_NAK
{
public:
ACK_NAK (HANDLE hCHandler);
void SetParam (HANDLE hCHandler) {hComHandler=hCHandler;};
void SendACK ();
void SendNAK ();
void SendMaster ();
void SendGive ();
void SendTake ();
void SendDisconnect ();
char ReceiveACK (int Attempts);
private:
HANDLE hComHandler;
COMSTAT csStat;
};
ACK_NAK::ACK_NAK (HANDLE hCHandler)
{
hComHandler=hCHandler;
}
void ACK_NAK::SendACK ()
{
unsigned long* pcount=new(unsigned long);
char ACK='T';
WriteFile(hComHandler, &ACK, 1, pcount, NULL);
}
void ACK_NAK::SendNAK ()
{
unsigned long* pcount=new(unsigned long);
char NAK='F';
WriteFile(hComHandler, &NAK, 1, pcount, NULL);
}
void ACK_NAK::SendDisconnect ()
{
unsigned long* pcount=new(unsigned long);
char Discon='D';
WriteFile(hComHandler, &Discon, 1, pcount, NULL);
}
void ACK_NAK::SendMaster ()
{
unsigned long* pcount=new(unsigned long);
char Master='M';
WriteFile(hComHandler, &Master, 1, pcount, NULL);
}
void ACK_NAK::SendGive ()
{
unsigned long* pcount=new(unsigned long);
char Send='G';
WriteFile(hComHandler, &Send, 1, pcount, NULL);
}
void ACK_NAK::SendTake ()
{
unsigned long* pcount=new(unsigned long);
char Take='A';
WriteFile(hComHandler, &Take, 1, pcount, NULL);
}
char ACK_NAK::ReceiveACK (int Attempts)
{
unsigned long* pcount=new(unsigned long);
char rec='F';
DWORD dwError;
for (int i=0; i<Attempts; i++)
{
ClearCommError(hComHandler, &dwError, &csStat);
if (csStat.cbInQue>0) // Анализ входного буфера порта
{
// Считывание из буфера
bool flag=ReadFile(hComHandler, &rec, 1, pcount, NULL);
if (!flag) return 'F'; // Ошибка при чтении из порта
return rec;
}
if (i<Attempts-1) Sleep(TimeOut);
}
return 'D'; // Разрыв соединения
}
//---------------------------------------------------------
#endif
Channel.h
#ifndef channelH
#define channelH
// Кодирование байта
short EncodeByte(char Uncoded)
{
short Code=0;
__asm{
push esp
push eax
push ebx
push ecx
push edx
xor eax,eax
mov al,Uncoded
mov ah,al
xor ebx,ebx
shr ah,4
shl al,4
shr al,1
shl ah,3
mov dl,10000000b
mov dh,10110000b
mov bl,al
xor ecx,ecx
mov cl,5
coding:
test al,dl
jz zero
xor al,dh
zero:
shl al,1
loop coding
shr al,5
add al,bl
mov dl,10000000b
mov dh,10110000b
mov bh,ah
xor ecx,ecx
mov cl,5
coding1:
test ah,dl
jz zero1
xor ah,dh
zero1:
shl ah,1
loop coding1
shr ah,5
add ah,bh
mov Code,ax
pop edx
pop ecx
pop ebx
pop eax
pop esp
}
return Code;
}
// Декодирование байта
void DecodeByte(short Coded,char& I,char& E)
{
char Info,Error=0;
__asm{
push esp
push eax
push ebx
push ecx
push edx
mov ax,Coded
xor ebx,ebx
xor ecx,ecx
mov bl,al
shr bl,3
mov dl,10000000b
mov dh,10110000b
mov cl,5
uncode:
test al,dl
jz z1
xor al,dh
z1:
shl al,1
loop uncode
cmp al,0
je allRight
mov Error,1
allRight:
mov bh,ah
shr bh,3
shl bh,4
mov dl,10000000b
mov dh,10110000b
mov cl,5
uncode1:
test ah,dl
jz z2
xor ah,dh
z2:
shl ah,1
loop uncode1
cmp ah,0
je allRight1
mov Error,1
allRight1:
add Info,bh
add Info,bl
pop edx
pop ecx
pop ebx
pop eax
pop esp
}
E = Error;
I = Info;
return;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
#endif
31