API函数串口通信数据有时读取不到,但是其他串口工具能读出输入数据
赵柒 2014-08-24 04:45:40 能够正常打开串口,也能够写入。当用其他串口工具打开一次串口然后关闭,自己写的程序能够正常读写,同步异步出现的问题都是同样。
有时候对设备输入关机指令,然后进行通信,读取数据的时候不能读取,ClearCommError函数显示输入数据永远为0;
我观察了一下了句柄值一直不变
#include "StdAfx.h"
#include "CreatePort.h"
CreatePort ::CreatePort( void):m_comName (_T( "" )),hFileHandle ( NULL),cbInQue (0),cbOutQue(0)
, dwFlagsAndAttributes (FILE_ATTRIBUTE_NORMAL),dwError (0)
{
}
CreatePort ::~CreatePort( void)
{
}
BOOL CreatePort:: Create()
{
BOOL dwResult =FALSE;
cclose();
__try{
if (m_comName ==_T( "")|| m_comName .GetLength ()<1)
__leave;
m_comName.Insert (0,_T( "\\\\.\\" ));
m_comName.MakeUpper ();
hFileHandle =CreateFile ( m_comName ,GENERIC_WRITE | GENERIC_READ,0,0, OPEN_EXISTING ,dwFlagsAndAttributes/* |FILE_FLAG_OVERLAPPED*/,0);
getErrors();
/* EscapeCommFunction(hFileHandle, SETDTR);*/
if (hFileHandle == INVALID_HANDLE_VALUE )
__leave;
dwResult=TRUE ;
}
__finally
{
if (!dwResult ||hFileHandle== INVALID_HANDLE_VALUE )
{
Message(_T ("打开端口失败 "));
}
}
return dwResult ;
}
HANDLE CreatePort:: getHandle()
{
return hFileHandle ;
}
*/
/************************************************************************/
BOOL CreatePort:: setControlCommState (LPDCB lpDCB)
{
if (lpDCB ==NULL)
{
DCB dcb ;
if (GetCommState (hFileHandle,& dcb))
{
dcb.DCBlength =sizeof( DCB);
dcb.BaudRate =CBR_9600;
dcb.ByteSize =8;
dcb.StopBits =TWOSTOPBITS;
dcb.fParity =FALSE;
dcb.Parity =NOPARITY;
/* dcb.fDsrSensitivity*/
dcb.fDtrControl =DTR_CONTROL_ENABLE;
return SetCommState ( hFileHandle,& dcb );
}
getErrors();
}
else
{
return SetCommState ( hFileHandle, lpDCB );
}
return FALSE ;
}
BOOL CreatePort:: writer( const char * cs, LPOVERLAPPED lpOverlapped )
{
BOOL dwResult =FALSE;
dwError=0;
DWORD dwSize =0;
DWORD csLength =strlen( cs);
__try
{
dwResult=WriteFile (hFileHandle, cs ,csLength ,&dwSize , lpOverlapped);
getErrors();
//FlushFileBuffers(hFileHandle);
if(!dwResult )
__leave;
if (dwError >0)
__leave;
if (csLength !=dwSize)
__leave;
}
__finally{
if (!dwResult )
{
getErrors();
}
}
clearError();
PurgeComm(hFileHandle ,PURGE_TXCLEAR);
getErrors();
return FALSE ;
}
void CreatePort:: cclose()
{
BOOL dwbstr =FALSE;
if (hFileHandle)
{
CloseHandle(hFileHandle);
hFileHandle=NULL;
}
// __try
// {
// if (hFileHandle !=INVALID_HANDLE_VALUE)
// {
//
// if (EscapeCommFunction (hFileHandle, CLRDTR))
// {
// setComTimeout();
// dwbstr= clearBuffer ();
// dwbstr=CloseHandle (hFileHandle );
// hFileHandle=INVALID_HANDLE_VALUE ;
//
// }
// }
// }
// __except(EXCEPTION_EXECUTE_HANDLER ) {
// getErrors();
// MessageBeep(MB_OK );
// }
}
CString CreatePort:: getComName() const
{
return m_comName ;
}
void CreatePort:: setComName(CString val)
{
m_comName=val ;
}
BOOL CreatePort:: reader(LPVOID lpbuffer ,LPOVERLAPPED lpOverlapped)
{
BOOL dwbool =FALSE ;
dwError=0;
DWORD i =0;
DWORD nNumberOfBytesToRead =MAX_PATH;
DWORD NumberOfBytesRead =0;
DWORD EvtMask =0;
// DWORD EvtMask =0;
clearError();
i=GetTickCount ();
while(!dwbool )
{
//clearError();
if (i +200<GetTickCount())
{
dwbool=TRUE;
}
}
waitCommMask(&EvtMask,lpOverlapped);
WaitForSingleObject(lpOverlapped->hEvent,100);
if (cbInQue>0)
{
dwbool =ReadFile ( hFileHandle, lpbuffer ,MAX_PATH ,&NumberOfBytesRead ,lpOverlapped );
}
getErrors();
return dwbool ;
}
BOOL CreatePort:: clearError()
{
//(CE_BREAK|CE_MODE |CE_TXFULL| CE_IOE|CE_OVERRUN |CE_RXOVER)
COMSTAT comstat ;
dwError=0;
ZeroMemory(&comstat ,sizeof( COMSTAT));
if (ClearCommError (hFileHandle,& dwError, &comstat ))
{
cbInQue=comstat .cbInQue;
cbOutQue=comstat .cbOutQue ;
if (dwError ==COM_ERROR)
{
cclose();
Message(_T ("端口断开 "));
}
getErrors();
}
return FALSE ;
}
DWORD CreatePort:: getcbOutQue()
{
return cbOutQue ;
}
DWORD CreatePort:: getcbInQue()
{
return cbInQue ;
}
BOOL CreatePort:: clearBuffer()
{
return PurgeComm (hFileHandle, PURGE_RXCLEAR |PURGE_TXCLEAR |PURGE_RXABORT |PURGE_TXABORT);
}
BOOL CreatePort:: setCommEvent(DWORD dwEvtMask )
{
return SetCommMask ( hFileHandle, dwEvtMask );// 函数设置 COM口的设备控制块
}
BOOL CreatePort:: waitCommMask(LPDWORD lpEvtMask , LPOVERLAPPED lpOverlapped )
{
return WaitCommEvent (hFileHandle, lpEvtMask ,lpOverlapped );
}
BOOL CreatePort:: setComTimeout()
{
COMMTIMEOUTS TimeOuts ={0};
if (GetCommTimeouts (hFileHandle,& TimeOuts))
{
TimeOuts.ReadIntervalTimeout =500;//500//注释的时间比较稳定
TimeOuts.ReadTotalTimeoutMultiplier =10;//100
TimeOuts.ReadTotalTimeoutConstant =50;//500
//设定写超时
TimeOuts.WriteTotalTimeoutMultiplier =100;
TimeOuts.WriteTotalTimeoutConstant =500;
if (SetCommTimeouts (hFileHandle,& TimeOuts))
{
return TRUE ;
}
}
return FALSE ;
}
void CreatePort:: setAsynchronous()
{
dwFlagsAndAttributes =FILE_FLAG_OVERLAPPED;
}
void CreatePort:: getErrors()
{
dwError=0;
dwError=GetLastError();
if (dwError>0&& dwError!=997&&dwError ==1453)
{
m_ErrorName.Empty ();
m_ErrorName.Format (_T( "错误%d"), dwError);
Message(m_ErrorName );
}
}
主体代码如上