298 lines
10 KiB
Plaintext
298 lines
10 KiB
Plaintext
//---------------------------------------------------------------------------
|
|
#pragma hdrstop
|
|
#include "stdafx.h"
|
|
//---------------------------------------------------------------------------
|
|
#include "ComPort.h"
|
|
#include "Windows.h"
|
|
|
|
#include <stdTools.h>
|
|
|
|
//#include <vcl.h>
|
|
#include <sstream>
|
|
//---------------------------------------------------------------------------
|
|
#if defined( _BORLAND )
|
|
#pragma package(smart_init)
|
|
#endif
|
|
//---------------------------------------------------------------------------
|
|
/*template <typename T>
|
|
std::string toString2(T val)
|
|
{
|
|
std::ostringstream oss;
|
|
oss << val;
|
|
return oss.str();
|
|
|
|
}*/
|
|
//---------------------------------------------------------------------------
|
|
/*std::string getComName(int num)
|
|
{
|
|
// if(num<10) return "COM"+IntToStr(num);
|
|
// else
|
|
return "\\\\.\\COM"+toString2(num);
|
|
}*/
|
|
//------------------------------------------------------------------------------
|
|
ComPort::ComPort()
|
|
{
|
|
m_time=500; //Âðåìÿ ïî óìîë÷àíèþ
|
|
hCom=0;
|
|
ComNumber=1;
|
|
BaudRate=115200;
|
|
bOpen=false;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
ComPort::~ComPort()
|
|
{
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void ComPort::CheckBaudRate()
|
|
{
|
|
if(BaudRate==0) BaudRate=1200;
|
|
if(BaudRate==1) BaudRate=2400;
|
|
if(BaudRate==2) BaudRate=4800;
|
|
if(BaudRate==3) BaudRate=9600;
|
|
if(BaudRate==4) BaudRate=19200;
|
|
if(BaudRate==5) BaudRate=38400;
|
|
if(BaudRate==6) BaudRate=57600;
|
|
if(BaudRate==7) BaudRate=115200;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
bool ComPort::Open(int ComNumber)
|
|
{
|
|
if(hCom!=0) Close(); //Åñëè îòêðûò êîì ïîðò çàêðîåì
|
|
this->ComNumber=ComNumber;
|
|
std::string port="\\\\.\\COM";
|
|
port+=IntToStdStr(ComNumber);
|
|
|
|
hCom = CreateFileA(port.c_str(), GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
|
|
if(hCom == INVALID_HANDLE_VALUE) bOpen=false; else bOpen=true;
|
|
return bOpen;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
bool ComPort::Close()
|
|
{
|
|
CloseHandle(hCom);
|
|
if(hCom == INVALID_HANDLE_VALUE){ hCom=0; return false; } else { hCom=0; bOpen=false; return true; }
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
//num - íîìåð íàñòðîåê ïîä ðàçíîå îáîðóäîâàíèå (num=1 òî àòîëîâñêèå íàñòðîéêè äëÿ êîì ïîðòà)
|
|
bool ComPort::Setup(int num)
|
|
{
|
|
CheckBaudRate(); //èç 1,2,3... â 1200,2400,4800...
|
|
|
|
int RxBufferSize = 2048;
|
|
int TxBufferSize = 2048;
|
|
if(!SetupComm(hCom, RxBufferSize, TxBufferSize)) return false;
|
|
|
|
DCB dcb;
|
|
if(num==0) //Íàñòðîéêè äëÿ ÏÎÐÒ 300 100
|
|
{
|
|
//if(!GetCommState(hCom, &dcb)) return false;
|
|
memset(&dcb,0,sizeof(dcb));
|
|
dcb.DCBlength = sizeof (DCB);
|
|
dcb.BaudRate=BaudRate;
|
|
dcb.fBinary=1;
|
|
//dcb.fDtrControl=DTR_CONTROL_ENABLE; //Áåç ýòîãî 0x03 íå ïðèíèìàëîñü ñ ïðèíòåðà à ïîòîì íà÷àëà ïðèíèìàòü è áåç...
|
|
dcb.fRtsControl=RTS_CONTROL_ENABLE;
|
|
dcb.XonLim=2048;
|
|
dcb.XoffLim=512;
|
|
dcb.ByteSize=8;
|
|
dcb.XonChar=17;
|
|
dcb.XoffChar=19;
|
|
}else
|
|
if(num==1) //Íàñòðîéêè äëÿ Àóðà-01ÔÐ-KZ
|
|
{
|
|
memset(&dcb,0,sizeof(dcb));
|
|
dcb.DCBlength = sizeof (DCB);
|
|
dcb.BaudRate=BaudRate;
|
|
dcb.fBinary=1;
|
|
dcb.XonLim=2048;
|
|
dcb.XoffLim=512;
|
|
dcb.ByteSize=8;
|
|
dcb.XonChar=17;
|
|
dcb.XoffChar=19;
|
|
}else
|
|
if(num==2) //Íàñòðîéêè äëÿ CashCode
|
|
{
|
|
if(!GetCommState(hCom, &dcb)) return false;
|
|
dcb.BaudRate=BaudRate;
|
|
dcb.ByteSize=8;
|
|
dcb.Parity=NOPARITY;
|
|
dcb.StopBits=ONESTOPBIT;
|
|
dcb.fDtrControl=DTR_CONTROL_ENABLE;
|
|
}else //Ñâîè íàñòðîéêè
|
|
{
|
|
memset(&dcb,0,sizeof(dcb));
|
|
if(!GetCommState(hCom, &dcb)) return false; //Áåð¸ì òåêóùèå íàñòðîéêè
|
|
|
|
dcb.BaudRate = BaudRate; // Current baud rate (115200)
|
|
dcb.fBinary = TRUE; //  âèíäå òîëüêî äâîè÷íûé ðåæèì âñåãäà 1
|
|
dcb.fParity = TRUE; // Åñëè ýòîò ÷ëåí ñòðóêòóðû - ÈÑÒÈÍÀ (TRUE), âûïîëíÿåòñÿ ïðîâåðêà ÷åòíîñòè è ñîîáùàåòñÿ îá îøèáêàõ...
|
|
dcb.ByteSize = 8; // Number of bits/byte, 4-8
|
|
|
|
dcb.Parity = NOPARITY; // Èñïîëüçóåìàÿ ñõåìà ÷åòíîñòè. (EVENPARITY Ïðîâåðêà ïî ÷åòíîñòè MARKPARITY Ïðîâåðêà ÷åòíîñòè ïî ìåòêå NOPARITY Áåç ïðîâåðêè ÷åòíîñòè ODDPARITY Ïðîâåðêà ïî íå÷åòíîñòè SPACEPARITY Ïðîâåðêà ÷åòíîñòè ïî ïàóçå)
|
|
dcb.fTXContinueOnXoff = FALSE; // Åñëè FALSE òî áóäåò ñëåäèòü çà ïåðåïîëíåíèåì ïðèíèìàþùåãî áóôåðà.
|
|
dcb.fNull = TRUE;
|
|
dcb.StopBits = ONESTOPBIT;
|
|
|
|
/*EFlowControl fc;
|
|
switch (fc)
|
|
{
|
|
case ENoFlowControl: // No HandShaking
|
|
{
|
|
dcb.fOutxCtsFlow = FALSE; // Disable CTS(Clear To Send) monitoring
|
|
dcb.fOutxDsrFlow = FALSE; // Disable DSR(Data Set Ready) monitoring
|
|
dcb.fDtrControl = DTR_CONTROL_DISABLE; //Ñèãíàë DTR (ãîòîâíîñòè òåðìèíàëà ê ïåðåäà÷å äàííûõ) óïðàâëåíèÿ ïîòîêîì äàííûõ. Ýòîò ÷ëåí ñòðóêòóðû ìîæåò áûòü îäíèì èç ñëåäóþùèõ çíà÷åíèé.
|
|
//DTR_CONTROL_ENABLE Âêëþ÷àåò ëèíèþ DTR, êîãäà óñòðîéñòâî îòêðûâàåòñÿ è îñòàâëÿåò åå âêëþ÷åííîé.
|
|
//DTR_CONTROL_HANDSHAKE Îòêëþ÷àåò ëèíèþ DTR, êîãäà óñòðîéñòâî îòêðûâàåòñÿ è îñòàâëÿåò åå çàáëîêèðîâàííîé.
|
|
//DTR_CONTROL_DISABLE Âêëþ÷àåò ïðîöåäóðó óñòàíîâëåíèÿ ñâÿçè DTR. Åñëè ïðîöåäóðà óñòàíîâëåíèÿ ñâÿçè âêëþ÷åíà, îíà ÿâëÿåòñÿ îøèáêîé äëÿ ïðèëîæåíèÿ, êîòîðîå êîððåêòèðîâàòü ëèíèþ, èñïîëüçóÿ ôóíêöèþ EscapeCommFunction.
|
|
|
|
dcb.fRtsControl = RTS_CONTROL_DISABLE; // Disable RTS (Ready To Send) monitoring
|
|
dcb.fOutX = FALSE; // Disable XON/XOFF for transmission (Óïðàâëåíèå ïîòîêîì (ýòî ñâîîéñòâî åñòü â ãèïåðòåðìèíàëå))
|
|
dcb.fInX = FALSE; // Disable XON/XOFF for receiving
|
|
break;
|
|
}
|
|
case EXonXoffFlowControl: // Software Handshaking
|
|
{
|
|
dcb.fOutxCtsFlow = FALSE;
|
|
dcb.fOutxDsrFlow = FALSE;
|
|
dcb.fDtrControl = DTR_CONTROL_DISABLE;
|
|
dcb.fRtsControl = RTS_CONTROL_DISABLE;
|
|
dcb.fOutX = TRUE;
|
|
dcb.fInX = TRUE;
|
|
dcb.XonChar = 0x11;
|
|
dcb.XoffChar = 0x13;
|
|
dcb.XoffLim = 100;
|
|
dcb.XonLim = 100;
|
|
break;
|
|
}
|
|
case EFullHardwareFlowControl: // Hardware Handshaking
|
|
{*/
|
|
dcb.fOutxCtsFlow = TRUE;
|
|
dcb.fOutxDsrFlow = TRUE;
|
|
dcb.fDtrControl = DTR_CONTROL_HANDSHAKE;
|
|
dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
|
|
dcb.fOutX = FALSE;
|
|
dcb.fInX = FALSE;
|
|
/*}
|
|
case ECtsRtsFlowControl:
|
|
{
|
|
dcb.fOutxCtsFlow = TRUE;
|
|
dcb.fOutxDsrFlow = FALSE;
|
|
dcb.fDtrControl = DTR_CONTROL_DISABLE;
|
|
dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
|
|
dcb.fOutX = FALSE;
|
|
dcb.fInX = FALSE;
|
|
break;
|
|
}
|
|
case ECtsDtrFlowControl:
|
|
{
|
|
dcb.fOutxCtsFlow = TRUE;
|
|
dcb.fOutxDsrFlow = FALSE;
|
|
dcb.fDtrControl = DTR_CONTROL_HANDSHAKE;
|
|
dcb.fRtsControl = RTS_CONTROL_DISABLE;
|
|
dcb.fOutX = FALSE;
|
|
dcb.fInX = FALSE;
|
|
break;
|
|
}
|
|
case EDsrRtsFlowControl:
|
|
{
|
|
dcb.fOutxCtsFlow = FALSE;
|
|
dcb.fOutxDsrFlow = TRUE;
|
|
dcb.fDtrControl = DTR_CONTROL_DISABLE;
|
|
dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
|
|
dcb.fOutX = FALSE;
|
|
dcb.fInX = FALSE;
|
|
break;
|
|
}
|
|
case EDsrDtrFlowControl:
|
|
{
|
|
dcb.fOutxCtsFlow = FALSE;
|
|
dcb.fOutxDsrFlow = TRUE;
|
|
dcb.fDtrControl = DTR_CONTROL_HANDSHAKE;
|
|
dcb.fRtsControl = RTS_CONTROL_DISABLE;
|
|
dcb.fOutX = FALSE;
|
|
dcb.fInX = FALSE;
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
RETAILMSG(1,(_T("CSerial::Setup - %s flow control assigned
|
|
Failed!!"), sPort));
|
|
return;
|
|
}
|
|
}*/
|
|
}
|
|
if(!SetCommState(hCom, &dcb)) return false;
|
|
|
|
//Çàåáàëñÿ è ïî óìîë÷àíèþ ñäåëàë àñèíõðîííî (îïåðàöèÿ ÷òåíè Read íå æä¸ò äàííûå è çà âðåìåíåì íóæíî ñëåäèòü ñàìîìó).
|
|
if(!SetTimeout(m_time)) return false;
|
|
|
|
return true;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
//Ñêîëüêî æäàòü äàííûõ â ìèëëèñåêóíäàõ (Äëÿ ÷òåíèÿ è çàïèèñè)
|
|
//Îïåðàöèÿ ÷òåíèÿ ðàáîòàåò àñèíõðîííî òå. íå æä¸ò äàííûå çà âðåìåíåì íóæíî ñëåäèòü ñàìîìó ! (÷èòàòü áàéòû â öèêëå ñ çàäåðæêîé)
|
|
bool ComPort::SetTimeout(unsigned long time)
|
|
{
|
|
m_time=time;
|
|
COMMTIMEOUTS CommTimeouts;
|
|
/* CommTimeouts.ReadIntervalTimeout = MAXDWORD; //Ìàêñèìàëüíîå âðåìÿ, êîòîðîå äîïóñêàåòñÿ äëÿ èíòåðâàëà ìåæäó ïîñòóïëåíèåì äâóõ ñèìâîëîâ
|
|
CommTimeouts.ReadTotalTimeoutMultiplier = 0; //Ìíîæèòåëü óìíîæàåòñÿ íà ÷èñëî ïðî÷. áàéòîâ ïîëó÷àþòñÿ ìèëèñåêóíäû êîòîðûå ïðèáîâëÿþòñÿ ê íèæíåìó
|
|
CommTimeouts.ReadTotalTimeoutConstant = time; //Ýòî âðåìÿ ïðîñòîÿ ïðèáàâëÿåòñÿ ê (ReadTotalTimeoutMultiplier * êîë-âî ïðî÷èòàííûõ áàéò)
|
|
CommTimeouts.WriteTotalTimeoutMultiplier = 0; //Ìíîæèòåëü óìíîæàåòñÿ íà ÷èñëî çàï. áàéòîâ ïîëó÷àþòñÿ ìèëèñåêóíäû êîòîðûå ïðèáîâëÿþòñÿ ê íèæíåìó
|
|
CommTimeouts.WriteTotalTimeoutConstant = time; //Ýòî âðåìÿ ïðîñòîÿ äëÿ çàïèñè ïðèáàâëÿåòñÿ ê (WriteTotalTimeoutMultiplier * êîë-âî çàïèñàííûõ áàéò)
|
|
*/
|
|
CommTimeouts.ReadIntervalTimeout = 400;
|
|
CommTimeouts.ReadTotalTimeoutMultiplier = 0;
|
|
CommTimeouts.ReadTotalTimeoutConstant = 400;
|
|
CommTimeouts.WriteTotalTimeoutMultiplier = 0;
|
|
CommTimeouts.WriteTotalTimeoutConstant = 400;
|
|
|
|
return SetCommTimeouts(hCom, &CommTimeouts)!=0; //Â MSDN òàê íàïèñàííî
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
/*bool ComPort::setBaudRate()
|
|
{ CheckBaudRate(); //×òîá ñêîðîñòü áûëà â
|
|
|
|
//TDCB dcb;
|
|
DCB dcb;
|
|
if(!GetCommState(hCom, &dcb)) return false;
|
|
dcb.BaudRate=BaudRate;
|
|
dcb.ByteSize=8;
|
|
dcb.Parity=NOPARITY;
|
|
dcb.StopBits=ONESTOPBIT;
|
|
// dcb.Flags=DTR_CONTROL_ENABLE;
|
|
dcb.fDtrControl=DTR_CONTROL_ENABLE;
|
|
if(!SetCommState(hCom, &dcb)) return false;
|
|
return true;
|
|
}*/
|
|
//------------------------------------------------------------------------------
|
|
//Çàïèñàòü áóôåð â COM ïîðò
|
|
unsigned long ComPort::Write(const void* lpBuffer,unsigned long nNumberOfBytesToWrite)
|
|
{
|
|
unsigned long lpNumberOfBytesWritten;
|
|
WriteFile(hCom, lpBuffer, nNumberOfBytesToWrite, &lpNumberOfBytesWritten, NULL);
|
|
return lpNumberOfBytesWritten;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
//Çàïèñàòü ñòðîêó â COM ïîðò
|
|
unsigned long ComPort::WriteString(std::string str)
|
|
{
|
|
return Write(str.c_str(),str.length());
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
//Çàïèñàòü 1 áàéò â COM ïîðò
|
|
char ComPort::WriteChar(char ch)
|
|
{
|
|
return (char)Write(&ch,1);
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
//Ïðî÷èòàòü áàéòû èç COM ïîðòà â áóôåð
|
|
unsigned long ComPort::Read(void* lpBuffer,unsigned long nNumberOfBytesToRead)
|
|
{
|
|
unsigned long lpNumberOfBytesRead;
|
|
ReadFile(hCom, lpBuffer, nNumberOfBytesToRead, &lpNumberOfBytesRead, NULL);
|
|
if(nNumberOfBytesToRead>255) throw "(ComPort::Read) Ïåðåïîëíåíèå áóôåðà!";
|
|
return lpNumberOfBytesRead;
|
|
}
|
|
//------------------------------------------------------------------------------
|