⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 modem.cpp

📁 调制解调器网络编程
💻 CPP
字号:
#include "stdafx.h"
#include "modem.h"



void MTIMER::set(DWORD t)
{
  settime=GetTickCount()+t;
}

BOOL MTIMER::ifzero()
{
  if(GetTickCount()>=settime) return TRUE;
  return FALSE;
}


void MTIMER::delay(DWORD t)
{
  set(t);
  while(!ifzero());
}


//-------------------------------------------------------------------------



MODEM::ANSINFO info[MESSAGE_NUM]=
{
  {"OK",           TRUE,   M_OK},
  {"ERROR",        TRUE,   M_ERROR},
  {"NO DIAL",      TRUE,   M_NOTONE},
  {"BUSY",         TRUE,   M_BUSY},
  {"NO ANSWER",    TRUE,   M_NOANSWER},
  {"RING",         TRUE,   M_RING},
  {"CONNECT",      FALSE,  M_CONNECT},
  {"PROTOCOL:",    FALSE,  M_PROTOCOL},
  {"COMPRESSION:", FALSE,  M_COMPRESS},
  {"CARRIER",      FALSE,  M_CARRIER},
  {"NO CARRIER",   TRUE,   M_NODCD},
  {"RELIABLE",     FALSE,  M_RELIABLE}
};


MODEM::CONFIGBUFF config[3]=
{
  {"&D2","&E4&Q0"},
  {"&D2","&Q5&K1W1S37=0S95=44S46=138S36=5"},
  {"",""}
};


MODEM::MODEM()
{
  nCid=-1;
  IfRx=FALSE;
  IfTx=FALSE;
  err=0;
  IfCom=FALSE;
  IfModem=FALSE;
  IfCommand=FALSE;
  IfTransFile=FALSE;
  ansinfo=info;
  configbuff=config;
}


int MODEM::IniCom(HINSTANCE hInst,HWND hwnd,char *string)
{
  static char com[10];
  int i;
//  FARPROC lpfnTimerProc;
  IfCom=FALSE;
  if(nCid>=0){
  	CloseComm(nCid);
//  	KillTimer(hwindow,MODEM_TIMER);
  }
  if(toupper(string[0])!='C') return -1;
  for(i=0;i<4;i++)com[i]=string[i];
  com[4]=0;
  nCid=OpenComm(com,IN_QUEUE_SIZE,OUT_QUEUE_SIZE);
  if(nCid<0){
	 err=-1;
	 return err;
  }
//  sprintf(p,"%s:  %s,N,8,1",com,rate);
  err=BuildCommDCB(string,&dcb);
  if(err<0) return err;
  dcb.fOutxCtsFlow=1;
  dcb.fOutxDsrFlow=0;
  dcb.fRtsflow=1;
  dcb.fDtrflow=0;
  dcb.fInX=0;
  dcb.fOutX=0;
  err=SetCommState(&dcb);
  if(err<0) return err;
  SetCommEventMask(nCid,EV_CTSS);
//  EnableCommNotification(nCid,hwnd,-1,-1);
  hwindow=hwnd;
//  hInstance=hInst;
//  lpfnTimerProc=MakeProcInstance((FARPROC)ModemTimerProc,hInstance);
//  SetTimer(hwindow,MODEM_TIMER,50,(TIMERPROC)lpfnTimerProc);
  IfCom=TRUE;
  return 0;
//  ConfigModem(0);
}

void MODEM::ChangeBaud(char *p)
{
	UINT baud;
	if(nCid<0) return;
	baud=(UINT)atol(p);
	dcb.BaudRate=baud;
	SetCommState(&dcb);
}

void MODEM::OnTimer()
{
	static int r,i,j;
	static BYTE buf[100];
	static char buf1[100];
	static char *p;
	static int state=LEADING_CR;
	if(!IfCom) return;
	r=ReadComm(nCid,buf,100);
	r=abs(r);
	id=M_UNKNOW;
	if(r){
		IfRx=TRUE;
		SendMessage(hwindow,WM_CHARSARRIVE,r,(DWORD)buf);
		for(i=0;i<r;i++){
	 		switch(state){
				case LEADING_CR:
			  		if(buf[i]==CR) state=LEADING_LF;
			  		break;
				case LEADING_LF:
			  		if(buf[i]==LF) state=IN_MSG;
			  		p=buf1;
			  		break;
				case IN_MSG:
			  		if(buf[i]==CR) state=TRAILING_LF;
			  		else *p++=toupper(buf[i]);           //toupper 不一定需要
			  		break;
				case TRAILING_LF:
			  		if(buf[i]==LF) state=EXIT;
			  		break;
	 		}
	 		if(state==EXIT){
	 			state=LEADING_CR;
	 			*p=0;
	 			p=buf1;
	 			for(j=0;j<MESSAGE_NUM;j++)
					if(strstr(p,ansinfo[j].message)){
		  				id=ansinfo[j].id;
		  				if(id==M_CONNECT) dtebaud=(UINT)atol(p+7);
		  				p+=strlen(p);
		  				*p++=' ';
		  				break;
					}
				if(id==M_RING) Answer();
			}
		}
	}
/* 	if(IfCom && !IfCommand && !IfTransFile){
 		ReceAns(30000);
  		if(id==M_RING) Answer();
  	}*/
	
	//return 0;	
}   

int MODEM::ConfigModem(char * string)
{
  IfModem=FALSE;
  if(!IfCom) return 0;
  SEND("Initializing modem ...");
//  Command("Q0E1V1&FM1X4&C1&D2S0=0S6=2S7=50");
  Command(string,3000);
  if(!err && id==M_OK){
//		Command("&FX4&E1&E4&E13S7=50S0=0$BA0");
//		Command(configbuff[type].protocol);
		CLEAR();
		IfModem=TRUE;
		return 1;
  }
  SEND("Modem config fail!");
  return 0;
}


MODEM::~MODEM()
{
//  KillTimer(hwindow,MODEM_TIMER);
  EscapeCommFunction(nCid,CLRDTR);        //Close DTR
  CloseComm(nCid);
}


void MODEM::IdleAction()
{
}


BOOL MODEM::DetectDcd()
{
  if(nCid<0) return FALSE;
  return *(((LPBYTE)SetCommEventMask(nCid,EV_RLSD))+35)&0x80;
}

BOOL MODEM::DetectCts()
{
  	return GetCommEventMask(nCid,EV_CTSS)&EV_CTSS;
}


BOOL MODEM::DetectRx()
{
	static BOOL Temp;
	Temp=IfRx;
	IfRx=FALSE;
    GetCommError(nCid,&comstat);
	return (Temp ||	comstat.cbInQue);
}


BOOL MODEM::DetectTx()
{
	static BOOL Temp;
	Temp=IfTx;
	IfTx=FALSE;
    GetCommError(nCid,&comstat);
	return (Temp ||	comstat.cbOutQue);
}



//time 是首字出现的最大时廷

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -