📄 modem.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 + -