#include <stdafx.h>
#include "Sero.h"
#include <stdio.h>
CSero::CSero()
{
dwError=0;
fOpen=FALSE;
}
CSero::CSero(LPCTSTR com)
{
dwError = 0;
DWORD baudrate=CBR_9600;
BYTE parity=NOPARITY;
BYTE stopbits=ONESTOPBIT;
BYTE bytesize=8;
OpenComm(com,
baudrate,
parity,
stopbits,
bytesize
);
}
CSero::CSero(LPCTSTR com,DWORD baudrate)
{
dwError = 0;
BYTE parity=NOPARITY;
BYTE stopbits=ONESTOPBIT;
BYTE bytesize=8;
OpenComm(com,//端口号
baudrate,//波特率
parity,//奇偶校验
stopbits,//停止位个数
bytesize//数据位数
);
}
CSero::CSero(LPCTSTR com,DWORD baudrate,BYTE parity)
{
dwError = 0;
BYTE stopbits=ONESTOPBIT;
BYTE bytesize=8;
OpenComm(com,//端口号
baudrate,//波特率
parity,//奇偶校验
stopbits,//停止位个数
bytesize//数据位数
);
}
CSero::CSero(LPCTSTR com,DWORD baudrate,BYTE parity,BYTE bytesize,BYTE stopbits)
{
dwError = 0;
OpenComm(com,//端口号
baudrate,//波特率
parity,//奇偶校验
stopbits,//停止位个数
bytesize//数据位数
);
}
CSero::~CSero()
{
if(!fOpen)return;
else CloseComm();
}
bool CSero::OpenComm(LPCTSTR com,//端口号
DWORD baudrate,//波特率
BYTE parity,//奇偶校验
BYTE stopbits,//停止位个数
BYTE bytesize//数据位数
)
{
if (fOpen)
{
MessageBox(NULL,"端口已打开","警告",MB_OK);
return false;
}
if (!CreateComm(com,
baudrate,
parity,
stopbits,
bytesize)
)
{
fOpen=FALSE;
return FALSE;
}
else
{
fOpen=TRUE;
SetupComm(hComm,1100,1100);
GetCommState(hComm,&dcb);
dcb.BaudRate=baudrate;//
dcb.fParity=TRUE;
dcb.fBinary=TRUE;
dcb.Parity=parity;//
dcb.ByteSize=bytesize;//
dcb.StopBits=stopbits;//
TimeOuts.ReadIntervalTimeout=MAXDWORD;
TimeOuts.ReadTotalTimeoutMultiplier=0;
TimeOuts.ReadTotalTimeoutConstant=0;
TimeOuts.WriteTotalTimeoutMultiplier=100;
TimeOuts.WriteTotalTimeoutConstant=500;
SetCommTimeouts(hComm, &TimeOuts); //设置超时
SetCommState(hComm,&dcb);
PurgeComm(hComm, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
}
return TRUE;
}
bool CSero::CreateComm(LPCTSTR com, DWORD baudrate, BYTE parity, BYTE stopbits, BYTE bytesize )
{
hComm=::CreateFile(com,
GENERIC_READ | GENERIC_WRITE,
0,//不允许共享
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED | FILE_ATTRIBUTE_NORMAL,
NULL
);
if (hComm==INVALID_HANDLE_VALUE)
{
dwError=::GetLastError();
CloseHandle(hComm);
return FALSE;
}
return TRUE;
}
bool CSero::CloseComm()
{
if (!fOpen)
{
MessageBox(NULL,"串口未打开","警告",MB_OK);
return false;
}
else CloseHandle(hComm);
return TRUE;
}
void CSero::GetError(char* errmsg)
{
sprintf(errmsg, "ErrorID = %d", dwError);
}
void CSero::RecvMsg(unsigned char* recvBuff, UINT recvBuffsize, UINT *recv_sum )
{
if(!fOpen)
{
//AfxMessageBox("串口未打开!");
MessageBox(NULL,"串口未初始化!","警告",MB_OK);
return;
}
memset(recvBuff,0,recvBuffsize);//初始化buff
COMSTAT ComStat;
memset(&overlapped,0,sizeof(OVERLAPPED));
overlapped.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
ClearCommError(hComm,&dwError,&ComStat);
BOOL bReadStatus;
bReadStatus=ReadFile(hComm,recvBuff,recvBuffsize,(DWORD*)&recv_sum,&overlapped);
if (!bReadStatus)
{
if(GetLastError()==ERROR_IO_PENDING)
//GetLastError()函数返回ERROR_IO_PENDING,表明串口正在进行读操作
{
WaitForSingleObject(overlapped.hEvent,2000);
//使用WaitForSingleObject函数等待,直到读操作完成或延时已达到2秒钟
//当串口读操作进行完毕后,overlapped的hEvent事件会变为有信号
}
return;
}
}
void CSero::SendMsg(unsigned char* sendBuff, UINT sendBuffsize, UINT *send_sum )
{
if(!fOpen)
{
//AfxMessageBox("串口未打开!");
MessageBox(NULL,"串口未初始化!","警告",MB_OK);
return;
}
BOOL bWriteStat;
COMSTAT ComStat;
memset(&overlapped,0,sizeof(OVERLAPPED));
overlapped.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
ClearCommError(hComm,&dwError,&ComStat);
bWriteStat=WriteFile(hComm, sendBuff, sendBuffsize,(DWORD*)&send_sum, &overlapped);
if(!bWriteStat)
{
if(GetLastError()==ERROR_IO_PENDING)
{
WaitForSingleObject(overlapped.hEvent,1000);
}
return;
}
dwError = GetLastError();
}