Files
Tools_CPP/devices/ComPort.~cpp
2024-11-01 12:23:13 +05:00

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;
}
//------------------------------------------------------------------------------