//类的实现文件
#include "ComRev.h"
ComRev::ComRev()
{
//hCom=0;
Opened=FALSE;
}
ComRev::ComRev(BYTE port)
{
// hCom=HANDLE-1;
Opened=FALSE;
OpenPort(port);
}
ComRev::~ComRev()
{
ClosePort();
}
int ComRev::OpenPort(int port)
{
LPCWSTR PortStr;
HANDLE hPort;
if( (port>9)||(port==0) )
{
return -2;
}
switch(port)
{
case 1:
PortStr=TEXT("COM1");
break;
case 2:
PortStr=TEXT("COM2");
break;
case 3:
PortStr=TEXT("COM3");
break;
case 4:
PortStr=TEXT("COM4");
break;
case 5:
PortStr=TEXT("COM5");
break;
case 6:
PortStr=TEXT("COM6");
break;
case 7:
PortStr=TEXT("COM7");
break;
case 8:
PortStr=TEXT("COM8");
break;
case 9:
PortStr=TEXT("COM9");
break;
default:
return -2;
}
ClosePort();//先关闭以前打开的串口
hPort=CreateFile( PortStr, GENERIC_READ|GENERIC_WRITE, 0,NULL ,OPEN_EXISTING, 0,NULL);
if (hPort==(HANDLE)-1)
{
return -1;
}
else
{
hCom=hPort;
Opened=TRUE;
PortNum=port;
tRev=new RevThread(hCom);
connect(tRev, SIGNAL(ReceiveAByte(char)), this,SIGNAL(ReceiveData(char)) );
tRev->start();
}
return 0;
}
/*
设置串口参数
参数
Parity:
0无校验
NOPARITY 0 No parity.
ODDPARITY 1 Odd parity.
EVENPARITY 2 Even parity.
MARKPARITY 3 Mark parity.
SPACEPARITY 4 Space parity
*/
int ComRev::SetComPort(DWORD BaudRate,BYTE ByteSize,BYTE Parity,BYTE StopBits)
{
if(Opened!=TRUE)
{
return NOT_OPEN;
}
if(hCom==(HANDLE)-1)
{
return OPEN_PORT_FAILED;
}
if( (BaudRate!=110) && (BaudRate!=300) && (BaudRate!=600) && (BaudRate!=1200) &&
(BaudRate!=2400) && (BaudRate!=4800) && (BaudRate!=9600) && (BaudRate!=14400) &&
(BaudRate!=19200) && (BaudRate!=38400) && (BaudRate!=57600) && (BaudRate!=115200) &&
(BaudRate!=128000) && (BaudRate!=256000) )
{
return PARA_ERR;
}
if(Parity>4)
{
return PARA_ERR;
}
if( (StopBits!=0)&&(StopBits!=2) )
{
return PARA_ERR;
}
DCB wdcb;
GetCommState (hCom,&wdcb);
wdcb.DCBlength=sizeof(DCB);
wdcb.BaudRate=BaudRate;
wdcb.ByteSize=ByteSize;
wdcb.Parity=Parity;
wdcb.StopBits=StopBits;
if(Parity!=0)
{
wdcb.fParity=TRUE;
}
else
{
wdcb.fParity=FALSE;
}
if(SetCommState (hCom,&wdcb)!=TRUE)
{
DWORD i=GetLastError();
return ERR;
}
PurgeComm(hCom,PURGE_TXCLEAR);
return 0;
}
bool ComRev::Send(const BYTE *buf,DWORD len)
{
DWORD i;
DWORD wCount; //写入的字节数
i=len;
while(i>0)
{
if(WriteFile(hCom,buf,i,&wCount,NULL)!=TRUE)
{
return FALSE;
}
i-=wCount;
}
return TRUE;
}
void ComRev::ClosePort()
{
if(Opened==TRUE)
{
tRev->terminate();
tRev->wait();
delete tRev;
CloseHandle(hCom);
}
return;
}
bool ComRev::PortState()
{
return Opened;
}
BYTE ComRev::GetPortNum()
{
if(Opened==TRUE)
{
return PortNum;
}
else
{
return 0;
}
}
/////////////////////////////////////////////////////////////
RevThread::RevThread(HANDLE h)
{
hCom=h;
}
void RevThread::run()
{
while(1)
{
char tmpbuf;
DWORD wCount;
ReadFile(hCom, &tmpbuf, 1,&wCount, NULL);
if(wCount==1)
{
emit ReceiveAByte(tmpbuf);
}
usleep(200);
}
}