做过Modem、串口通讯的进来,一定要高手哦
gpmn 2001-07-25 10:27:00 我做的软件现在可以直接通过串口接受任何收到的数据,
但是,和Modem连接情况是,开头的connect xxxx,busy,no caarier....一类的Modem发过来的字符可以收到,但是随后的数据都收不到,根本就没有送到我的缓冲区,
ComStat.cbInQue==0!!!!!怎么回事,各位不妨直言,说不定可以旁敲侧击;
另外,超级终端可以完全正确的显示;
我的其他部分和VC自带的例子SERIAL一样;
DWORD PASCAL ReadCommBlock()//读数据的函数;
{
BOOL fReadStat ;
COMSTAT ComStat ;
DWORD dwErrorFlags;
DWORD dwLength=0;
DWORD dwError;
OVERLAPPED os ;
memset(InBuf,0,500);
if(!goon)return 0;//try to make sure that hComm is valide;
ClearCommError(hComm, &dwErrorFlags, &ComStat ) ;
if(ComStat.cbInQue<=0)return 0;
memset( &os, 0, sizeof( OVERLAPPED ) ) ;
os.hEvent=CreateEvent( NULL, // no security
TRUE, // explicit reset req
FALSE, // initial event reset
NULL ) ; // no name
if (os.hEvent == NULL)
return 0;
fReadStat = ReadFile(hComm ,InBuf,ComStat.cbInQue, &dwLength,&os);
if (!fReadStat)
{
if (GetLastError() == ERROR_IO_PENDING)
{
while(!GetOverlappedResult(hComm,&os, &dwLength, TRUE ))
{
dwError = GetLastError();
if(dwError == ERROR_IO_INCOMPLETE)
// normal result if not finished
continue;
else
{
// an error occurred, try to recover
ClearCommError(hComm, &dwErrorFlags, &ComStat ) ;
break;
}
}
}
else
{
// some other error occurred
dwLength = -1 ;
ClearCommError(hComm, &dwErrorFlags, &ComStat ) ;
}
}
CloseHandle(os.hEvent);
return dwLength;
}
UINT CommWatchProc(LPVOID pParam)//监视com事件的线程;
{
DWORD dwEvtMask ;
HWND hWnd=(HWND)pParam;
COMSTAT ComStat ;
DWORD dwErrorFlags;
while(goon)
{
ClearCommError(hComm, &dwErrorFlags, &ComStat ) ;//1
CString ss;//2
ss.Format("%d",dwErrorFlags);//3
if(dwErrorFlags!=0)AfxMessageBox(ss);//4加了这句话后可以收到Modem发过来的Connect xxx等字符;
dwEvtMask = 0 ;
SetCommMask(hComm, EV_RXCHAR );//本来是用EV_RXFLAG接受的,现在就是用EV_RXCHAR也什么都收不到
WaitCommEvent( hComm, &dwEvtMask, NULL );//停在这里;
// if((dwEvtMask & EV_RXFLAG)!=EV_RXFLAG)
// continue;
if(ReadCommBlock()>=0)//对方发送数据后,这里什么也读不到;
::SendMessage(hWnd,WM_HANDLEBUFFER,0,0);
else
::SendMessage(hWnd,WM_WATCHPROCERROR,0,0);
}
return true;
}