【VC开源代码栏目提醒】:网学会员在VC开源代码频道为大家收集整理了YsATModem.cpp提供大家参考,希望对大家有所帮助!
// ATModem.cpp: implementation of the CYsATModem class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "YsATModem.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
UINT CYsATModem::WaitThread(LPVOID lpvoid)
{
CYsATModem* pThis=(CYsATModem*)lpvoid;
pThis->DetectConnect();
return 1;
}
//检测modem是否就续
UINT CYsATModem::DetectModemThread(LPVOID pParam)
{
TRACE(_T("in Detect Thread"));
CYsATModem* pThis=(CYsATModem*)pParam;
DWORD dwEvent;
DWORD dwTime;
int iRing=0;
pThis->m_bCD=0;
while(1==pThis->WaitEvent(&dwEvent,INFINITE))
{
if(dwEvent&EV_DSR)
{
pThis->SetEvent(0);
//糟啦,modem坏啦!!!
TRACE(_T("My God!!! the modem broken!!!\n"));
pThis->Purge(PURGE_ALL);
pThis->ChangeMode(MODE_UNMODEM);
TRACE(_T("Quit Detect Thread"));
return 1;
}
else if(dwEvent&EV_RING)//win95不支持这种通知
{
//这里有个问题,如果对方拨号一声后,挂断,计数器没清零,第二次就会出
问题 if(iRing>0)
{
if(GetTickCount()-dwTime>10000)
iRing=0;//如果两次响铃大于10秒钟,重设为0
}
dwTime=GetTickCount();
iRing++;
CString s;
s.Format("ring count=%d %d Mode=%d\n",iRing,pThis->m_nRingCount,pThis->m_nMode);
TRACE(s);
if(pThis->m_nMode==MODE_COMMAND)
{
if(iRing>=pThis->m_nRingCount)
{
iRing=0;
#ifdef USER_ANSWER
Sleep(500);
pThis->SendAT(CMD_ATA);
#endif
AfxBeginThread(WaitThread,pThis);
}
}
}
else if(dwEvent&EV_RLSD)
{
CString s;
s.Format("\nCD灯改变 @@@ %d -%d\n",pThis->m_nMode,pThis->m_bCD);
TRACE(s);
if(pThis->m_nMode==MODE_DATA)
{
pThis->m_bCD=FALSE;
TRACE("Modem Disconnect!!!!\n");
ResetEvent(pThis->m_hConnected);
pThis->ChangeMode(MODE_COMMAND);
pThis->HangUp();
if(pThis->m_Thread)
{
if(WAIT_OBJECT_0!=WaitForSingleObject(pThis->m_Thread->m_hThread,10000))
{
TerminateThread(pThis->m_Thread->m_hThread,-11);
}
delete pThis->m_Thread;
pThis->m_Thread=NULL;
}
}
else if(pThis->m_nMode==MODE_CONNECTING)
{
pThis->m_bCD=TRUE;
pThis->StopRead();
pThis->Purge(PURGE_ALL);
pThis->m_Thread = AfxBeginThread(CYsATModem::ReadCommThread,(LPVOID)pThis);
if(!pThis->m_Thread)
{
pThis->ChangeMode(MODE_COMMAND);
pThis->SetLastError(_TEXT("Start read comm thread error"));
return FALSE;
}
pThis->m_Thread->m_bAutoDelete=FALSE;
::SetEvent(pThis->m_hConnected);
pThis->ChangeMode(MODE_DATA);
TRACE("Modem connect!!!!\n");
//无处理
}
else pThis->m_bCD=FALSE;//如果正在拨号的时候断线,可能会出现CD变化?
}
}
TRACE(_T("Quit Detect Thread"));
return 1;
}
/*************************2001.10.30 ycat *********************************************
FUNCTION: UINT CYsATModem::ReadCommThread(LPVOID pParam)
PURPOSE: 线程函数,把串口读入缓冲区的字符,写到自己维护的缓冲区中,并判断断线
PARAMETERS:
pParam:指向CYsATModem类
RETURN VALUE:
COMMENTS: 断线的处理,也许还要改进
**********************************************************************/
UINT CYsATModem::ReadCommThread(LPVOID pParam)
{
//judge if no carrier
char strJudge[]=ECHO_NOCARRIER;
//current judge string position
int iJudge=0;
int iJudgeSize=strlen(strJudge);
TRACE("Start Thread\n");
CYsATModem* pThis=(CYsATModem*)pParam;
DWORD dwInterTimeOut=INFINITE;//读每个字符之间的等待时间
int i;
BYTE chRead;
DWORD dwHaveRead;
while(1)
{
do
{
//read one char
i=pThis->ReadComm(&chRead,1,&dwHaveRead,dwInterTimeOut);
if (1==i)
{
TRACE(_TEXT("##:%02x\n"),chRead,chRead);
pThis->m_pQueue->Put(&chRead);
}
else if(i==-3)
{
TRACE(_TEXT("stop event set!~\n"));
//user hangup
i=TRUE;
goto Exit;
}
else if(i==-1) //非超时
{
TRACE(_TEXT("in Function Read Error code%d\n"),i);
i=FALSE;
goto Exit;
}
}
while(dwHaveRead);
}//while
Exit:
TRACE(_TEXT("End Read comm Thread\n"));
if(!i) TRACE(_TEXT("there are some error occur in thread\n"));
return i;
}
/////////////////////////////////////////////////////////////////