资源地址:http://download.youkuaiyun.com/detail/spygg/5318388
非常好用,鉴于我研究了很久而且到处下载别人的代码来研究都不好用,自己弄了一个非得好用,是一个类直接可以用到别的程序。里面,关键的底层读写函数没有给出,可以到我的资源里面去找,没有积分了所以想赚点积分,想下载的到我的空间里面去下载(10个积分,我太黑了,嘿嘿)。。
BOOL CSerialCom::InitSerial( UINT uCom , UINT uBaudRate )
{
m_hCom=CreateFile("COM2",//COM1口
GENERIC_READ|GENERIC_WRITE, //允许读和写
0, //独占方式
NULL,
OPEN_EXISTING, //打开而不是创建
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, //重叠方式
NULL);
if(m_hCom==(HANDLE)-1)
{
AfxMessageBox("打开COM失败!");
return FALSE;
}
SetupComm(m_hCom,100,100); //输入缓冲区和输出缓冲区的大小都是100
COMMTIMEOUTS TimeOuts;
//设定读超时
TimeOuts.ReadIntervalTimeout=MAXDWORD;
TimeOuts.ReadTotalTimeoutMultiplier=0;
TimeOuts.ReadTotalTimeoutConstant=0;
//在读一次输入缓冲区的内容后读操作就立即返回,
//而不管是否读入了要求的字符。
//设定写超时
TimeOuts.WriteTotalTimeoutMultiplier=100;
TimeOuts.WriteTotalTimeoutConstant=500;
SetCommTimeouts(m_hCom,&TimeOuts); //设置超时
DCB dcb;
GetCommState(m_hCom,&dcb);
dcb.BaudRate=9600; //波特率为9600
dcb.ByteSize=8; //每个字节有8位
dcb.Parity=NOPARITY; //无奇偶校验位
dcb.StopBits=TWOSTOPBITS; //两个停止位
SetCommState(m_hCom,&dcb);
//清除缓冲区
PurgeComm(m_hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);
return TRUE;
}
void CSerialCom::SendData( char * cSendBuffer )
{
OVERLAPPED osWrite;
memset(&osWrite,0,sizeof(OVERLAPPED));
osWrite.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
DWORD dwBytesWrite=9;
COMSTAT ComStat;
DWORD dwErrorFlags;
BOOL bWriteStat;
ClearCommError(m_hCom,&dwErrorFlags,&ComStat);
bWriteStat = SerialWrite(m_hCom, (char*)cSendBuffer , dwBytesWrite, &dwBytesWrite, &osWrite);
if ( bWriteStat != STATE_SUCCESS )
{
//Sending package ok
OutputDebugString("发送错误!\n");
}
// 清理发送缓冲区
PurgeComm(m_hCom, PURGE_TXCLEAR);
}
void CSerialCom::RecvData( char *cRecvBuff )
{
OVERLAPPED ovRead;
memset(&ovRead, 0, sizeof(OVERLAPPED));
ovRead.hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);
int nReadCount = 9;
DWORD ulErrorCode = 0;
DWORD ulNumberofRead;
if (!SetCommMask(m_hCom, EV_RXCHAR | EV_TXEMPTY))
return;
while(1)
{
memset(m_cFrameBuf, 0, sizeof(m_cFrameBuf));
int nRet = SerialWaitEvent( m_hCom, (char*)m_cFrameBuf, nReadCount, &ulNumberofRead, &ulErrorCode, &ovRead);
CString szstr,strtmp;
if(nRet == STATE_SUCCESS)
{
//处理...
}
}
CloseHandle(ovRead.hEvent);
}
int CSerialCom::SerialWaitEvent(HANDLE hDevice, char *pbyData, ULONG ulReadCount, ULONG *pulNumberofRead, ULONG *ErrorCode, OVERLAPPED *ov)
{
ULONG Code = 0;
int nRet = OPERATION_ERROR;
if (WaitCommEvent(hDevice, &Code, ov) == TRUE)
{
if ((Code & EV_RXCHAR) != 0)
{
nRet = SerialRead(hDevice, pbyData, ulReadCount, pulNumberofRead, ov);
}
if ((Code & EV_ERR) != 0)
{
nRet = OPERATION_ERROR;
SerialClearCommError(hDevice, ErrorCode);
}
}
else
{
ULONG ulErr = GetLastError();
if (ERROR_IO_PENDING == ulErr)
{
if (GetOverlappedResult(hDevice, ov, pulNumberofRead, TRUE))
{
if ((Code & EV_RXCHAR) != 0)
{
nRet = SerialRead(hDevice, pbyData, ulReadCount, pulNumberofRead, ov);
}
if ((Code & EV_ERR) != 0)
{
nRet = OPERATION_ERROR;
SerialClearCommError(hDevice, ErrorCode);
}
}
}
}
return nRet;
}