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

📄 modeocom.cpp

📁 modem串口接口,通过它可与方便与modem通信。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	//if(R_Waite_Event==NULL || R_Message_Event==NULL) return;
	::SetEvent(R_Message_Event);
	Sleep(0);
	return;
	WaitForSingleObject(R_Waite_Event,2000+DEBUG_TIME);
	::ResetEvent(R_Waite_Event);
}
long ModeoCom::GetLength(){return R_ln;}
long ModeoCom::Read(void * lpData, WORD ln)
{
	int k;
	k=ln;
	if(ln>m_ln) k=m_ln;
	memcpy(lpData,m_buf,k);
	m_ln-=k;
	if(m_ln<0) m_ln=0;
	//::SetEvent(R_Waite_Event);//通知等待线程,数据已OK
	return k;
}
void ModeoCom::Cls()
{
	R_ln=0;
	m_Code=0;
	if(Read_Event!=NULL) ::ResetEvent(Read_Event);
}

long ModeoCom::Send(void * lpData, WORD ln)
{
	int f,k,lw,s,n;
	static BYTE ch[64];
	BYTE *ip=(BYTE*)lpData;
	if(hCom==NULL||hCom==(void*)0xffffffff)  return 0;
	lw=0;
	while(lw<ln)
	{
		k=ln-lw;
		if(k==0) return ln;
		if(k>1750) k=1750;
		*(DWORD*)&S_buf[0]=0xBABABABA;
		*(WORD*) &S_buf[6]=ln;
		*(DWORD*)&S_buf[8]=GetCRC32(&ip[lw],k);
		*(DWORD*)&S_buf[12]=GetTickCount();//本次数据ID
		*(WORD*) &S_buf[4]=k;//本次数据长
		memcpy(&S_buf[16],&ip[lw],k);
		lw+=k;
		k+=16;
		f=0;
		while(f<8)
		{
			Cls();//清队收发标致
			n=0;
			while(n<4)
			{
				if(TxData(S_buf,k)==k) break;
				sprintf((char*)ch,"ERR1:A=%d,B=%d,C=%d,T=%d,k=%d",m_Code,m_Link,f,n,k);
				SaveData((char*)ch);
				n++;
			}

			if(Waite(5000))break;
			
			if(m_Link!=16)
			{
				sprintf((char*)ch,"ERR4:A=%d,B=%d,C=%d,T=%d,k=%d",m_Code,m_Link,f,n,k);
				SaveData((char*)ch);
				return -1;
				//已断线了
			}

			if(m_Code!=1)
			{
				sprintf((char*)ch,"ERR2:A=%d,B=%d,C=%d,R=%d",m_Code,m_Link,f,R_ln);
				SaveData((char*)ch);
				Sleep(500);
				if(m_Code==0) Sleep(5000-f*500);
				memset(ch,0,32);
				for(s=0;s<56;s++) TxData(ch,32);//补发一次零数据,已清空对方结缓冲区
			}
			f++;
		}
	}
	if(lw!=ln)
	{
		sprintf((char*)ch,"ERR3:A=%d,B=%d,C=%d",m_Code,m_Link,f);
		SaveData((char*)ch);
	}
	return lw;
}

BOOL ModeoCom::TestLink()
{
	if(hCom==NULL||hCom==(void*)0xffffffff) return FALSE;
	return TRUE;
}


/*
第一步:执行MODEO复位操作  ATZ0
执行ATW2要求返回实际连接速度
第二步:ATD电话号码。
数据传送

如果数据发不出?

第三步:+++
第四步:ATH0挂机
*/
BOOL ModeoCom::TallPh(char * tall)//拨号
{
	DWORD k;
	MSG   msg;
	R_ln=0;
	if(hCom==NULL||hCom==(void*)0xffffffff)  return FALSE;
	m_RxSeek=0;
	m_TxSeek=0;
	m_Code=0;
	R_ln=0;
	m_NEW=FALSE;
	m_BEAK_ph=TRUE;
	memset(Err_code,0,32);
	memset(S_buf,0,128);
	sprintf((char*)S_buf,"ATDT%s",tall);
	k=strlen((char*)S_buf);
	S_buf[k]=0x0D;k++;
	if(TxData(S_buf,k)!=(long)k)
	{
		sprintf(Err_code,"无法发送号码:%s",tall);
		return FALSE;
	}
	Sleep(1000);//等-秒
	m_NEW=FALSE;
	m_End_Code=128;
	m_Link=1;//正在连接
	k=GetTickCount();
	while(GetTickCount()-k<60000)
	{
		
		switch(m_End_Code)
		{
		case 0://0、已连接
			strcpy(Err_code,"OK,已成功连接");
			if(m_TxSeek==0) m_TxSeek=m_RxSeek;
			R_ln=0;
			m_ln=0;
			m_Input=0;
			m_End_Code=128;
			m_Link=16;
			return TRUE;
			break;
		case 1://1、OK
			break;
		case 2://2、来电
			strcpy(Err_code,"来电");
			k=130;
			break;
		case 3://对方不应答
			strcpy(Err_code,"对方不应答");
			R_ln=0;
			m_End_Code=128;
			m_Link=0;
			return FALSE;
			break;
		case 4://4、错误
			R_ln=0;
			m_End_Code=128;
			m_Link=0;
			return FALSE;
			break;
		case 5://5、未检测到拨号音
			strcpy(Err_code,"没有拨号音");
			R_ln=0;
			m_End_Code=128;
			m_Link=0;
			return FALSE;
			break;
		case 6://6、检测到忙音 
			strcpy(Err_code,"电话占线或对方不应答");
			R_ln=0;
			m_End_Code=128;
			m_Link=0;
			return FALSE;
			break;
		case 7://7、无静音应答 
			strcpy(Err_code,"无静音应答");
			R_ln=0;
			m_End_Code=128;
			m_Link=0;
			return FALSE;
			break;
		case 8://8、所拨的号码已延迟 
			strcpy(Err_code,"来电");
			R_ln=0;
			m_End_Code=128;
			m_Link=0;
			return FALSE;
			break;
		default:
			Sleep(20);
		
			if(!m_BEAK_ph)
			{
				strcpy(Err_code,"手动挂断电话了");
				return FALSE;
			}
			break;
		}
	}
	m_Link=0;
	strcpy(Err_code,"等待超时,没有收到调解器的任何有用信息");
	m_End_Code=128;
	return FALSE;
}

DWORD ModeoCom::FenTallChar(BOOL TX)
{
	int n,f;
	if(R_ln==0) return 128;
	for(int k=0;k<R_ln;k++)
	{
		for(n=0;n<MAX_COMMDAND_STR;n++)
		{
	       if(memcmp(End_code[n],&R_buf[k],strlen(End_code[n]))==0)
		   {
			   if(TX)
			   {
				   k+=strlen(End_code[n]);
				   for(f=0;f<R_ln-k;f++)
				   {
					   R_buf[f]=R_buf[f+k];
				   }
				   if(R_ln>k) R_ln-=k;
				   else R_ln=0;
			   }
			   return n;
		   }
		}
	}

	return 128;
}

BOOL ModeoCom::SendCommand(char * comx)//执行AT指令
{
	BYTE ch[64];
	MSG   msg;
	if(hCom==NULL||hCom==(void*)0xffffffff)  return FALSE;
	DWORD tx=8000;
	memset(command,0,64);
	strcpy((char*)ch,comx);
	DWORD k=strlen((char*)ch);
	command_ln=k;
	strcpy(command,comx);
	if(strcmp(comx,"AT")==0) tx=1000;
	ch[k]=0x0D;
	k++;
	m_End_Code=128;
	SaveData(comx);
	if(strcmp(comx,"+++")==0) k=3;
	if(memcmp(comx,"ATA",3)==0) tx=60000;//如果是应答命令则等长一些 
	if(TxData(ch,k)!=(long)k) return FALSE;
	Sleep(50);
	k=GetTickCount();
	while(GetTickCount()-k<tx)
	{
		switch(m_End_Code)
		{
		case 1:
			m_End_Code=128;
			return TRUE;
			break;
		case 4:
			m_End_Code=128;
			return FALSE;
			break;
		case 128:
		
			break;
		default:
			m_End_Code=128;
			return TRUE;
			break;
		}
	}
	SaveData("超时");
	m_End_Code=128;
	return FALSE;
}


BOOL ModeoCom::FindThDataMac()//分析来电显示 
{
	BOOL Tm[3];
	int k,n;
	Tm[0]=FALSE;
	Tm[1]=FALSE;
	Tm[2]=FALSE;
	if(R_ln==8) return FALSE;
	for(k=0;k<R_ln;k++)
	{
		if(*(DWORD*)&R_buf[k] == *(DWORD*)"DATE") Tm[0]=TRUE;
		if(*(DWORD*)&R_buf[k] == *(DWORD*)"TIME") Tm[1]=TRUE;
		if(*(DWORD*)&R_buf[k] == *(DWORD*)"NMBR") Tm[2]=TRUE;
	}
	if(!Tm[0] || !Tm[1] || !Tm[2]) return FALSE;//没有来电

	memset(VCID_time,0,16);
	memset(VCID_data,0,16);
	memset(VCID_ph,0,32);
	//把后继数据取完
	do
	{
		Sleep(100);
		n=GetRvcLength();
		if(n>0)
		{
			m_Tall_time=GetTickCount();
			if(R_ln>65535) R_ln=0;
			k=65535-R_ln;
			if(k>n) k=n;
			k=RxData(&R_buf[R_ln],k);
			if(k>0) R_ln+=k;
			R_buf[R_ln]=0;
		}

	}while(n>0);

	for(k=0;k<R_ln;k++)
	{
		if(*(DWORD*)&R_buf[k] == *(DWORD*)"TIME") 
		{
			k+=4;
			n=k;
			while(k<R_ln)
			{
				if(R_buf[k]>='0' && R_buf[k]<='9') //去掉前面的空格
				{
					n=k;
					break;
				}
				k++;
			}
			while(k<R_ln)
			{
				if(R_buf[k]<'0' || R_buf[k]>'9')
				{
					R_buf[k]=0;
					break;
				}
				k++;
			}
			if(strlen((char*)&R_buf[n])<16)strcpy(VCID_time,(char*)&R_buf[n]);//来电时间
		}


		if(*(DWORD*)&R_buf[k] == *(DWORD*)"DATE")
		{
			k+=4;
			n=k;
			while(k<R_ln)
			{
				if(R_buf[k]>='0' && R_buf[k]<='9') //去掉前面的空格
				{
					n=k;
					break;
				}
				k++;
			}
			while(k<R_ln)
			{
				if(R_buf[k]<'0' || R_buf[k]>'9')
				{
					R_buf[k]=0;
					break;
				}
				k++;
			}
			if(strlen((char*)&R_buf[n])<16)strcpy(VCID_data,(char*)&R_buf[n]);//来电时间
		}

		if(*(DWORD*)&R_buf[k] == *(DWORD*)"NMBR")
		{
			k+=4;
			n=k;
			while(k<R_ln)
			{
				if(R_buf[k]>='0' && R_buf[k]<='9') //去掉前面的空格
				{
					n=k;
					break;
				}
				k++;
			}
			while(k<R_ln)
			{
				if(R_buf[k]<'0' || R_buf[k]>'9')
				{
					R_buf[k]=0;
					break;
				}
				k++;
			}
			if(strlen((char*)&R_buf[n])<32)
			{
				strcpy(VCID_ph,(char*)&R_buf[n]);//来电号码
				m_End_Code=32;//显电了
				m_End_CodeEx=32;
				sprintf(command_str,"电话:%s 时间:%s:%s",VCID_ph,VCID_data,VCID_time);
				//sprintf(command_ok, "电话:%s 时间:%s:%s",VCID_ph,VCID_data,VCID_time);
				sprintf(command_ok,"来电:%s",VCID_ph);
				m_NEW=TRUE;
				Sleep(200);
				R_ln=0;
				return TRUE;
			}
		}
	}
	memset(VCID_time,0,16);
	memset(VCID_data,0,16);
	memset(VCID_ph,0,32);
	return FALSE;
}
void ModeoCom::AddTall(char * ip)//加入电话号码
{
	if(ip[0]==0) return;
	strcpy(MAC_th[num],ip);
	if(num<32) num++;
}
void ModeoCom::DownPh()
{
	if(m_Link==0) return;
	if(m_Link==16)SendCommand("+++");
	sprintf(command_ok,"请稍后,挂断电话");
	m_NEW=TRUE;
	
	if(SendCommand("ATH0"))
	{
		SaveData("挂断电话");
	    m_Link=0;
		m_BEAK_ph=FALSE;
		sprintf(command_ok,"OK!电话已挂断");
	    m_NEW=TRUE;
		if(m_hWnd!=NULL)::PostMessage(m_hWnd,RING_COM,3,0);
	}
}

void ModeoCom::Link()//手动连接
{
	m_Link=1;//正在连接
	SaveData("手动应答");
	sprintf(command_ok,"请稍后,正在应答......");
	m_NEW=TRUE;
	SendCommand("ATA");
	SaveData("手动应答OK");
}

void ModeoCom::PhAutoMac()//根据电话号码应答
{
	int k,n,ln,lx;
	lx=strlen((char*)VCID_ph);
	for(k=0;k<num;k++)
	{
		ln=strlen((char*)MAC_th[k]);
		ln-=lx;
		for(n=0;n<=ln;n++)
		{
			if(memcmp(&MAC_th[k][n],VCID_ph,lx)==0)
			{
				SaveData("号吗应答ATA");
				m_Link=1;//正在连接
				sprintf(command_ok,"正在应答:%s",VCID_ph);
				m_NEW=TRUE;
				//SendCommand("ATA");
				BYTE cx[8];
				strcpy((char*)cx,"ATA");
				cx[3]=0x0D;
				TxData(cx,4);
				SaveData(command_ok);
				return;
			}
		}
	}
}



void ModeoCom::Lock()
{
	if(hMutex ==NULL) hMutex=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"MODEM_SEND_Mutex");//申请同步事件
	if(hMutex!=NULL)  WaitForSingleObject(hMutex,10000);//==WAIT_OBJECT_0) 
}

void ModeoCom::UnLock()
{
	ReleaseMutex(hMutex);
}

void ModeoCom::SaveData(char *ip)
{
	BYTE buf[32];
	if(OPEN==0)
	{
		if(!m_fp.Open("modemdata.ini",CFile::modeWrite))
		{
#ifdef _DEBUG

			if(!m_fp.Open("modemdata.ini",CFile::modeWrite|CFile::modeCreate))
			{
				OPEN=1;
			    return;
			}
			else
			{
				OPEN=16;
			}

#else

			OPEN=1;
			return;
#endif
			
		}
		else
		{
			OPEN=16;
			m_fp.SeekToEnd();
			m_fp.Write("-----------------------------",strlen("-----------------------------"));
			buf[0]=0x0D;
			buf[1]=0x0A;
			m_fp.Write(buf,2);
		}
	}
	if(OPEN!=16) return;

	SYSTEMTIME ts;


	::GetLocalTime(&ts);
	sprintf((char*)buf,"%02d %02d:%02d:%02d ",ts.wDay,ts.wHour,ts.wMinute,ts.wSecond);
	m_fp.SeekToEnd();
	m_fp.Write(buf,strlen((char*)buf));
	m_fp.Write(ip,strlen(ip));
	buf[0]=0x0D;
	buf[1]=0x0A;
	m_fp.Write(buf,2);
}

DWORD ModeoCom::GetTai(){return m_Link;}
BOOL ModeoCom::GetVCIDph()
{
	if(VCID_ph[0]==0) return FALSE;
	return TRUE;
}

char* ModeoCom::GetTallName(){return VCID_ph;}

void ModeoCom::SendKey(BYTE TR, UINT nChar, UINT nRepCnt, UINT nFlags)
{
	
	BYTE mx[32];
	memset(mx,0,16);
	*(DWORD*)&mx[0]=0xBABABAB2;
	mx[4]=TR;
	mx[5]=nChar;
	mx[6]=nRepCnt;
	mx[7]=nFlags;
	TxData(mx,8);

	/*KEY_TABE[5]=TR;
	KEY_TABE[6]=nChar;
	KEY_TABE[7]=nRepCnt;
	KEY_TABE[8]=nFlags;
	TxData(KEY_TABE,16*4);*/


}

void ModeoCom::SendMouse(DWORD key, CPoint point)
{
	BYTE mx[32];
	*(DWORD*)&mx[0]=0xBABABAB1;
	*(DWORD*)&mx[4]=key;
	*(CPoint*)&mx[8]=point;
	TxData(mx,16);
}

int ModeoCom::SendExMessage(void *lpData, WORD ln)
{
	if(hCom==NULL||hCom==(void*)0xffffffff)  return 0;
	Cls();//清队收发标致
	if(TxData(lpData,ln)!=ln) return 0;		
	if(WaiteEx(5000)) return 1;
	return m_Code;
}

BOOL ModeoCom::WaiteEx(DWORD tx)
{
	Sleep(0);//切换线程
	MSG   msg;
	if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
	{
		if(GetMessage(&msg, NULL, 0, 0) == FALSE)
		{
		}
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	if(m_Code==1) return TRUE;
	if(m_Code==2) return FALSE;
	DWORD tr=GetTickCount();
	while(GetTickCount()-tr<tx+DEBUG_TIME)
	{

		if(m_Code==1) return TRUE;
		if(m_Code==2) return FALSE;
		if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
		{
			if(GetMessage(&msg, NULL, 0, 0) == FALSE)
			{
			}
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
		if(Read_Event!=NULL)
		{
			::WaitForSingleObject(Read_Event,1000);
			::ResetEvent(Read_Event);
		}
		if(m_Code==1) return TRUE;
		if(m_Code==2) return FALSE;

	}
	return FALSE;
}

BOOL ModeoCom::RxFile(int k, BYTE *m_sou)
{
	

	return TRUE;
}

void ModeoCom::GetPh(DWORD ID)
{
	BYTE buf[16];
	*(DWORD*)&buf[0]=0xBFBCBE9F;
	*(DWORD*)&buf[4]=ID;
	TxData(buf,8);
}

⌨️ 快捷键说明

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