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

📄 jbdata.c

📁 电话PSTN线路上FSK处理软件。。。。。。。。。
💻 C
📖 第 1 页 / 共 2 页
字号:

/*******************************************************
 *
 *	文	件: jbdata.c
 *	功	能:	存放通信过程中的子函数
 *
 ******************************************************/
#include <jbData.h>

//#pragma SRC
//#pragma DEBUG

/************************************************************
 *
 *		函	数:Dial()
 *		功	能:Modem拨号
 *		出	口:联络成功,返回TRUE;出错或联络失败,返回FALSE。
 *
 ***********************************************************/
bool Dial(void)
{
	byte i,j,bTemp;
	byte bRecallTimes;
	CheckSumTest();							    // 计算所有可检验参数检验和
	memcpy(&aTestPara,&aNumBuf,9);			    // test
	if(!fWorkMode){
		AutoReadPara(211);						// 初始化各种控制标志位
		fbBuf1=bParaByte;					
		AutoReadPara(202);
		AutoReadPara(204);
	}	
	else{
		AutoReadPara(13);
		if(bParaByte!=0)
			fDialForm=1;
		AutoReadPara(01);
		AutoReadPara(04);
	}
	for(i=0;i<8;i++){
		aNumBuf[2*i]=aParaBuf[i]>>4;
		aNumBuf[2*i+1]=aParaBuf[i]&0x0f;
	}
	if(!fWorkMode)	
		memset(&aNumBuf[8],0x0c,8);				// OLD模式,只使用8个号码
	bRecallTimes=bParaByte&0x0f;		
	DispClr();
	DispSymbol(LARGE_PHONE);
	Delay5MS(255);
	Close(RLY);
	do{
		Close(POWER_ON);
		DispClr();
   		DispSymbol(LARGE_PHONE);
   		Close(MLD);
		DelaySecond(3);							// 挂机3秒
		Open(MLD);
   		DispSymbol(LARGE_HOOK);
   		DispSymbol(LARGE_COMM);
   		MD_CLK=0;
		DelaySecond(2);
//		Open(POWER_ON);
		if(fDialForm){
			WriteModem(CR1,0x00);
			WriteModem(CR0,0x1a);
		}
		for(i=0;i<16;i++)						// 拨号
		{		
			bTemp=aNumBuf[i];
			if(bTemp==0x0c)
				break;
			if(i<11)	
				aLargeBuf[i]=aLCDSegment[bTemp];	
			DispSymbol(LARGE_HOOK);
			bTemp=aNumBuf[i];
			if(bTemp>9)
				break;
			else if(bTemp==0)
				bTemp=0x0a;
			if(fDialForm){	
				WriteModem(TR,bTemp);
				WriteModem(CR0,0x1a);
				bTemp=ReadModem(TR);
				WriteModem(TR,(bTemp|0x10));
				Delay5MS(21);
				bTemp=ReadModem(TR);
				WriteModem(TR,(bTemp&0xef));
				WriteModem(CR0,0x00);
				Delay5MS(20);
			}
			else{									// 脉冲拨号方式
				for(j=0;j<bTemp;j++){
					Close(MLD);
					Delay5MS(13);
					Open(MLD);
					Delay5MS(7);
				}
				Delay5MS(80);
			}	
			cbDelay5MS=5;							// 发模拟拨号音
			fDelay5MS=FALSE;
			Page(6);
			XBYTE[0xc00b]=0x1a;			
			Page(5);
			while(!fDelay5MS) 
				IDLE;
		}	
   		MD_CLK=1;
		WriteModem(CR1,0x04);
		if(DetectConnectTone(0))		// 检测通信联络音'D'
			return TRUE;
	}while(--bRecallTimes!=0);
	bFailTimes=8;
	return FALSE;
}
// End function: Dial()
			
/*********************************************************************
 *
 *	函	数:	DetectConnectTone()
 *	功	能:	接收通信联络音“D”;
 *	入	口: bWhich=0:计费器主动上呼时调用,检测到“D”,
 *			返回TRUE,否则返回FALSE;等待时间为20秒;
 *			bWhich=1:管理机呼叫,计费器手动摘机时调用,检测到“D”,
 *			返回TRUE,否则返回假;等待时间由参数31决定;
 *			bWhich=2:管理机呼叫,计费器自动摘机时调用,检测到“D”,
 *			返回TRUE,否则发出三声催摘音后,返回假。等待时间由参数31决定;
 *
 ********************************************************************/
bool DetectConnectTone(byte bWhich)
{
    byte bTemp,i;
    byte bWaitTime;								//单位:100ms
	ResetModem();
    if(bWhich==0)
    	bWaitTime=200;
	else{
    	Open(MLD);
		DispClr();
		DispSymbol(LARGE_HOOK);
		if(fWorkMode){
			AutoReadPara(31);
			bWaitTime=(byte)(iParaWord/20);
			if(bWaitTime<16)					//测‘D’音时长不能小于1600毫秒。
				bWaitTime=16;
		}	 
		else{
			AutoReadPara(51);
			if((bParaByte&0x40)!=0)
				bWaitTime=20;
			else
				bWaitTime=16;
		}
		Delay5MS(1);
    	Close(RLY);
	}
    while(TRUE){
        cbDelay5MS=20;
        fDelay5MS=0;
		while(!fDelay5MS){
			IDLE;
			bTemp=ReadByte(IN_CE,6)&0x04;
    	    if(bTemp!=0){
    	    	bTemp=ReadByte(DTMF_ENB,7)&0x0f;
            	if(bTemp==0){ 					//测到‘D’音
            		DispSymbol(LARGE_FLASH);
			   		DispSymbol(LARGE_COMM);
//					Open(POWER_ON);
            		return TRUE;
            	}
            	DispSymbol(LARGE_FLASH);
				DispSymbol(LARGE_COMM);
//				Open(POWER_ON);
    			return TRUE;
	        }
		}
        if(--bWaitTime==0)          			//超时退出
            break;
    }
    DispSymbol(LARGE_FLASH);
	DispSymbol(LARGE_COMM);
//	Open(POWER_ON);
    return TRUE;
    //没有测到‘D’音,提醒用户摘机
    if(bWhich==2){
    	Open(RLY);								//自动摘机后,接话机
        DispClr();
        DispSymbol(LARGE_PHONE);
        bTemp=3;
        while(bTemp!=0){
            --bTemp;
            for(i=0;i<3;i++){
            	Speaker(18);
                while(!fDelay5MS){
                	if(OffHook()){
                		i=100;
                		break;
                	}	
                	IDLE;
                }	
                Delay5MS(18);
            }
            if(i==100)
            	break;
            bWaitTime=16;              			// 在1.6秒内等待摘机 
            i=0;
            while(TRUE){
                cbDelay5MS=20;
                fDelay5MS=0;
                while(!fDelay5MS){
					IDLE;
					if(OffHook()){
						i=1;
						break;
					}	
                }
            	if(i!=0)
	               	break;
	            if(--bWaitTime==0) 
	            	break;
            }
        } // End outside for(;;)
        if(OffHook());
        else{
        	Close(MLD);
        	fDelaySecond=1;
        	return FALSE;
        }	
    }
    if(bWhich==1)					//手动摘机的情况
    	Open(RLY);
	if(bWhich!=0){					//不是系统的呼叫
    	if(fWorkMode)
			bStatusWord=S_NEWSLAVECALL;
		else
			bStatusWord=S_OLDSLAVECALL;
		AutoReadPara(55);
		if(bParaByte==1)			//模拟负载延时断开
			ciiDelaySecond=4;
		else{	
	    	Delay5MS(30);
			Close(MLD);
			ciiDelaySecond=3;		//不并模拟负载
		}	
		fiiDelaySecond=0;	
	}		
    return FALSE;
}
// End function: DetectConnectTone()

/*******************************************************************
 *
 *		函数名:ConnectModem()
 *		功	能:计费器MODEM与管理系统MODEM卡的联络过程
 *		用	途:管理机下传和计费器上呼时
 *		注	意:计费器 MODEM  处于应答模式,管理系统MODEM处于发起模式
 *
 ******************************************************************/
bool ConnectModem(void)
{
	byte bTemp;
	bool fSelect=0;
	EX0=1;
	MD_CLK=0;
	Delay5MS(4);
	AutoReadPara(57);
	if(bParaByte==1){		           //300 bps
		bParaByte=0;
		AutoWritePara(77);
		WriteModem(CR1,0x04);
		WriteModem(CR0,0xb2);
		WriteModem(TR,0x00);
		WriteModem(CR1,0x10);
		cbDelaySecond=8;
		fDelaySecond=0;
		while(1){
			if(fDelaySecond)
				return 0;
			bTemp=ReadModem(DR);	
			if((bTemp&0x08)!=0){
				Delay5MS(96);
				TH1=L300;
				TL1=L300;
				break;
			}	
		}	
		
	}
	else{								//1200 bps		
		WriteModem(CR1,0x04);
		DelaySecond(2);
		Delay5MS(32);
		WriteModem(CR1,0x04);
		WriteModem(TR,0xa1);
		WriteModem(CR0,0x1a);
		WriteModem(CR1,0x90);
		DelaySecond(3);
		Delay5MS(120);
		WriteModem(CR0,0x18);
		Delay5MS(16);
		WriteModem(TR,0xc0);
		WriteModem(CR1,0x90);
		WriteModem(CR0,0x1a);
		Delay5MS(128);
		cbDelaySecond=3;
		fDelaySecond=0;
		while(1){
			if(fDelaySecond)
				return FALSE;
			bTemp=ReadModem(DR);	
			if((bTemp&0x08)!=0){
				WriteModem(CR1,0x80);
				Delay5MS(136);
				WriteModem(TR,0x40);
				WriteModem(CR1,0x00);
				TH1=L1200;
				TL1=L1200;
				break;
			}	
		}	
	}	
	EX1=0;
	TI=0;
	RI=0;
	TR1=1;
    REN=1;
    ES=1;
    bLastCmd=0xff;
	fRxDataReady=0;
	fTxDataReady=0;
	return TRUE;
}
// End function: ConnectModem()

/***********************************************************
 *
 *	函数名:ResetModem()
 *	功	能:初始化CML644A芯片
 *
 **********************************************************/
void ResetModem(void)
{
	Page(7);
	XBYTE[0x8001]=0x04;
	Page(5);
	MD_CLK=1;
}
// End function: ResetModem()
 
/*******************************************************************
 *
 *		函数名:ReadModem()
 *		功	能:从CML644A中由bAddr指定的寄存器中读出字节返回
 *
 *******************************************************************/
byte ReadModem(byte bAddr)
{
 	byte i;
	Page(7);
	i=XBYTE[0x8000+bAddr];
	Page(5);
	return i;
}
// End function: ReadModem()
 
/**********************************************************
 *
 *
 *		函数名:WriteModem()
 *		功	能:将bData写入CML644A芯片bAddr寄存器
 *
 *
 **********************************************************/
void WriteModem(byte bAddr,byte bTemp)
{
	Page(7);
	XBYTE[0x8000+bAddr]=bTemp;
	Page(5);
}
// End function: WriteModem()

/******************************************************************
 *
 *		函数名:TxByte()			
 *		功	能:发送一个字节
 *
 ******************************************************************/
bool TxByte(byte bByte)
{
	SBUF=bByte;
	while(!fTxDataReady) {;}
	bLastCmd=0xff;
	fTxDataReady=0;
	return TRUE;
}                           
// End function: TxByte()

/******************************************************************
 *
 *		函数名:TxCmd()			
 *		功	能:往CBUS口发送一条命令
 *
 ******************************************************************/
void TxCmd(byte bCmd)
{
	FlashComm();
	TxByte(bCmd);
	TxByte(~bCmd);
	bLastCmd=bCmd;						//Add for Resend command
}
// End function: TxCmd() 
 
/******************************************************************
 *
 *		函数名:RxByte()			
 *		功	能:接收一个字节
 *
 ******************************************************************/
bool RxByte(void)
{
    cbDelaySecond=SLAVE_TIME_OUT;
    fDelaySecond=FALSE;
	while(TRUE){
    	if(fRxDataReady){
		    fRxDataReady=FALSE;
           	return TRUE;
        }
        if(fWaitExit){
			if(fKey){
				fKey=0;
				if(bKeyBuf==K1)
					return TRUE;
			}		
			continue;
		}	
   	    if(fDelaySecond){
   	    	if(bErrorCode!=0x24)
   	    		bErrorCode=ERR_02;
			return FALSE;	
		}	
	}	
}
// End function: RxByte()
 
/******************************************************************
 *
 *		函数名:RxCmd()			
 *		功	能:从CBUS口接收一条命令
 *
 ******************************************************************/
bool RxCmd(void)
{
	bool fErrOneTime=FALSE;
	byte i;
	byte aTemp[2];
	byte bSendTimes;
   	if(bStatusWord==S_SERVICE)			// 在老模式的操作方式中,取消键无效
   		fWaitExit=0;
	for(bSendTimes=0;bSendTimes<3;bSendTimes++){
		for(i=0;i<2;i++){				// 用于重发命令,重发的命令存于bLastCmd
			if(!RxByte()){
				if(fErrOneTime)
					return FALSE;
				fErrOneTime=TRUE;
				i=0xff;
				continue;
			}	
			if(fWaitExit){
				if(bKeyBuf==K1){
					bErrorCode=KEY_EXIT;
					return TRUE;
				}
			}		
			if(fFirstCmd&&(i==0)&&
			  ((bRecSBUF<0x30)||(bRecSBUF>0x90))){	//消除干扰
				i=0xff;
				continue;
			}	
			aTemp[i]=bRecSBUF;
		}	
		if(aTemp[0]==~aTemp[1]){
			bRecSBUF=aTemp[0];
			if((bLastCmd<0x99)&&(bRecSBUF==ERR_CS)){
				TxByte(bLastCmd);					//对方接收命令校验出错,重发上一个命令
				TxByte(~bLastCmd);
				continue;
			}
			bLastCmd=0xff;
			return TRUE;
		}
		TxCmd(ERR_CS);
	}
	bLastCmd=0xff;
	bErrorCode=ERR_08;	
	return FALSE;
}			
// End function: RxCmd()

/******************************************************************
 *
 *		函数名:	RxFirstOK()			
 *		功	能:	上呼时接收第一个OK
 *
 ******************************************************************/
bool RxFirstOK(void)
{

⌨️ 快捷键说明

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