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

📄 jbmcomm.c

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

/************************************************************
 *
 *		文件名: jbmcomm.c
 *		说	明:MODEM通信主文件
 *		主要含: 计费器上呼管理机函数: UpCall()
 *			   管理机呼叫计费器函数: DownCall()
 *
 *************************************************************/

//#pragma SRC
//#pragma DEBUG

#include <jbMcomm.h>

#define MODEM_TEST 1

/************************************************************
 *
 *		函	数:UpCall(void)
 *		说	明:计费器呼叫管理机程序
 *				手动,出错自动呼叫及回报话单均调用本过程
 *
 ***********************************************************/
void UpCall(void)
{
	byte bBuf;
	bErrorCode=ERR_NO;				// 缺省设置为无错
	cbFangDao=0;					// 启动发防盗音
	while(TRUE)
	{
		if(!Dial()){				// 拨管理机电话号码
			bErrorCode=ERR_00;
			break;
		}
		if(!ConnectModem()){ 		// MODEM联络过程
			bErrorCode=ERR_01;
			break;
		}
		if(!RxFirstOK())			// 接收管理机下传的第一个OK
			break;
		SendTelNum(1);
		if(!RxByte())
			break;
		bBuf=bRecSBUF;
		if(!RxByte())
			break;
		if((bBuf==END)&&(bBuf==~bRecSBUF)){				// 无此用户
			bErrorCode=ERR_21;
			break;
		}
		if((bBuf==ERR_CS)&&(bBuf==~bRecSBUF)){
			fWorkMode=0;
			bStatusWord=S_OLDUPCOMM;
			return;
		}
		if((bRecSBUF!=0xbb)||((bBuf!=0x88)&&(bBuf!=0x99))){
			TxByte(0xcc);
			TxByte(0xdd);
			bErrorCode=ERR_31;
			break;
		}
		if(bBuf==0x88){
			fWorkMode=0;
			bStatusWord=S_OLDUPCOMM;	// 新系统下按OLD模式通信
			return;
		}
		fWorkMode=1;
		bStatusWord=S_NEWUPCOMM;		// 新系统下按NEW模式通信
		return;
	}
	ExitPro();							// 关闭CML644A并延时显示出错信息
}
// End function: UpCall()

/************************************************************
 *
 *
 *		函	数:DownCall
 *		说	明:管理机呼叫计费器程序,收到联络音后进入
 *
 *
 ***********************************************************/
void DownCall(void)
{
	byte i,bBuf,k,j;
	bErrorCode=ERR_NO;
	bCallReason=0xff;
	cbFangDao=0;
	////////////////////////////////////
	bDlpReason=0;
	InitLevel();
	FSK=1;
	EA=0;
	IE=0x00;
	TMOD=0x21;
	SCON=0x40;					// 串口工作模式1,8位UART
	TH0=L5MS_H;				// 主频为11.0592MHZ,5MS定时常数
    TL0=L5MS_L;
    ET0=1;
    TH1=0xfc;					// 串口9600BPS定时常数
	TL1=0xfc;
	TI=0;
	RI=0;
	TR1=0;
    REN=1;
    ES=1;
    T2CON=0x00;
	T2MOD=0x00;
	TF2=0;
	TR2=0;
	RCAP2H=0xff;						// 278US
	RCAP2L=0x56;
	TH2=0xff;
	TL2=0x56;
	ET2=1;
	EA=1;
	PCON=0x80;


    P1=(P1&0xf8)|0x06;
    Close(MD_CS);
	ResetUart();
	P1=(P1&0xf8)|0x05;
	aCallID[99]=0;
    aCallID[98]=0;
    aCallID[97]=0;
    TR2=0;
    TR1=1;
    TR0=0;

	bCurrentVoltage=0;
	fTxFSKStart=1;
	while(1){
		for(j=0;j<10;j++){
			TxByte(j);
		}
		TxByte(aCallID[99]);
		TxByte(aCallID[98]);
		TxByte(aCallID[97]);

		j=0;
		i=0;
		k=0;
		while(1){
			switch(k){
				case 0:
					TR0=1;
					EA=1;
					Delay5MS(100);
					TR0=0;
					TR1=0;
					TR2=0;
					EA=0;
					P1=(P1&0xf8)|0x06;
					k=1;
					break;


				case 1:
					j=0;
					for(i=0;i<8;i++){
						TxFskByte(0x55);
					}
					for(i=0;i<2;i++){
						TxFskByte(0xFF);
					}
						TxFskByte(0x80);
					while(j<128){
						TxFskByte(j++);
					}
					k=2;
					break;

				case 2:
					InitLevel();
					P1=(P1&0xf8)|0x05;
					TR0=1;
					TR1=1;
					TR2=1;
					EA=1;
					Delay5MS(200);
					TxByte(0xaa);
					TxByte(0xaa);
					k=3;
					break;

				case 3:
					Delay5MS(60);
					cbDelay5MS=200;
        			fDelay5MS=0;
					while(!fDelay5MS){
						if(aCallID[99]>0){
							if(RxFskByte(&j))
							TxByte(j);
							cbDelay5MS=200;
							fDelay5MS=0;
						}
					}
					k=0;
					break;


				default :
					TxByte(0xfa);
					TxByte(0xfa);
					break;
			}
		}
	}
	////////////////////////////////////


	while(TRUE){
		if(!ConnectModem()){
			bErrorCode=ERR_01;			// 载波联络失败
			break;
		}
		DispSymbol(LARGE_COMM);
		DelaySecond(2);
		TxCmd(OK);
		for(i=0,bBuf=0;i<17;i++){
			if(!RxByte())
				return;
			if(i<16)
				bBuf+=bRecSBUF;
		}
		if(bBuf==bRecSBUF){
			fWorkMode=0;
			bCallReason=0x88;
			bStatusWord=S_OLDDOWNCOMM;
			return;
		}
		if(bBuf!=~bRecSBUF){
			TxByte(0xcc);
			TxByte(0xdd);
			bErrorCode=ERR_31;
			break;
		}
        //TxCmd(OK);
        TxByte(0x66);
        TxByte(0xbb);
		if(!RxByte())
			break;
		bBuf=bRecSBUF;
		if(!RxByte())
			break;
		if((bRecSBUF!=0xbb)||((bBuf!=0x88)&&(bBuf!=0x99))){
			bErrorCode=ERR_31;
			break;
		}
		bCallReason=0x99;
		if(bBuf==0x88){
			if(fWorkMode)
				fSecretSelect=0;
			fWorkMode=0;
			bStatusWord=S_OLDDOWNCOMM;
			return;
		}
		if(!fWorkMode)
			fSecretSelect=0;
		fWorkMode=1;
		bStatusWord=S_NEWDOWNCOMM;
		return;
	}
	ExitPro();
}
// End function: DownCall()

/************************************************************
 *
 *		函	数:OldComm()
 *		说	明:OLD模式数据交换过程
 *				OLD模式上呼和下传均调用本函数
 *
 ***********************************************************/
void OldComm(void)
{
	byte bTemp;
	byte bRecord=0;
	bool fTest;
	uint iCommFail;
	bErrorCode=ERR_NO;
	if(bStatusWord==S_OLDUPCOMM){
		SendTelNum(0);
		while(1){
			if(RxCmd())
				break;
			if(bRecSBUF==OK)
				break;
			else
				bErrorCode=ERR_04;
			ExitPro();
			return;
		}
		if((bCallReason==NEW_TEST)||(bCallReason==NEW_REPORT_BILLS))
			bCallReason=OLD_TEST;
		if(bCallReason==OLD_TEST)
			bRecord=1;
	}
	else{									// OLD模式下传通信准备
		if(bCallReason==0x88)				//老系统下传
			TxCmd(ERR_CS);
		else
			TxCmd(OK);
		bCallReason=DYNAMIC_PASSWORD;		// 接收动态密码
	}
	fWorkMode=0;
	while(TRUE)
	{
		if(bCallReason==DYNAMIC_PASSWORD)
			bTemp=bCallReason;
		else{
			bTemp=SearchCmd(bCallReason);
			DispCmd(bTemp);						// 显示通信代码
		}
		if(bTemp==0xff)
			break;
		fTest=0;
		iCommFail=0;
		switch(bCallReason)
		{
			case OLD_TEST:					// 0x23
				OldTest();
				fTest=1;
				break;
			case DYNAMIC_PASSWORD:			// 0x09
				DynamicPassword();
				break;
			case OLD_REPORT_BILLS:			// 0x20
				OldReportBills();
				break;
			case OLD_DAYTOTAL:				// 0x24
				OldDayTotal();
				break;
			case OLD_SCALL_TOTAL:			// 0x25
				OldScallTotal(bCallReason);
				break;
			case OLD_POWERONOFF:	 		// 0x26
				OldPowerOnOff();
				break;
			case OLD_SYSTEM:				// 0x10
				OldSystem();
				break;
			case OLD_DISABLE:				// 0x12
				OldDisable();
				break;
			case OLD_DISCOUNT:				// 0x11
				OldDiscount();
				break;
			case OLD_IDD_TARIFF:			// 0x16
				iCommFail=PARA_229;
				OldIDDTariff();
				break;
			case OLD_DDD_TARIFF:			// 0x17
				iCommFail=PARA_230;
				OldDDDTariff();
				break;
			case OLD_LOCAL_TARIFF:			// 0x18
				iCommFail=PARA_231;
				OldLocalTariff();
				break;
			case OLD_IDD_CLASS:				// 0x13
				iCommFail=PARA_226;
				OldIDDClass();
				break;
			case OLD_DDD_CLASS:				// 0x14
				iCommFail=PARA_227;
				OldDDDClass();
				break;
			case OLD_LOCAL_CLASS:			// 0x15
				iCommFail=PARA_228;
				OldLocalClass();
				break;
			case OLD_QUERY_BILLS:			// 0x1c
				OldQueryBills();
				break;
			case OLD_REPORT_QUERYBILLS:		// 0x22
				OldReportQueryBills();
				break;
			case OLD_CLOCK:		      		// 0x19
				OldClock();
				break;
			case QUERY_VERSION:				// 0x81
				QueryVersion();
				break;

			default:
				bErrorCode=ERR_33;			// 收到异常命令
				break;
		}// End switch(bCallReason)
		// 接收下一条命令或进行出错处理:
		if(bDlpReason!=0) return;
		if((bErrorCode!=ERR_NO)||(!RxCmd())){
			// yxw 2001-03-15 15:30 add 避免通讯不成功时,写入不完整的数据,更改校验和
			if((iCommFail>=PARA_226)&&(iCommFail<PARA_232)){
				Page(6);
				XBYTE[PARA_76]=1;
				Page(5);
			}
			break;
		}
		if(bRecSBUF==END){
			if(fTest){
				bErrorCode=ERR_21;
				break;
			}
			AutoReadPara(47);
			if(bParaByte!=0x88){
				bParaByte=0x88;
				AutoWritePara(47);
				ClrRam();
			}
			if(bRecord==2)
				bCallReason=OLD_TEST;
			break;
		}
		bCallReason=bRecSBUF;
		if(bCallReason==OLD_CLOCK)
			bRecord++;
		else
			bRecord=0;
	} //End while(TRUE)
	ExitPro();
}
// End function: OldComm()

/************************************************************
 *
 *		函	数:OldTest()
 *		说	明:OLD模式上传测试参数
 *
 ***********************************************************/
void OldTest(void)
{
	byte i;
	TxCmd(OLD_TEST);
	if(!RxCmd())
		return;
	if(bRecSBUF!=OK){
		if(bRecSBUF==END)
			bErrorCode=ERR_21;
		else
			bErrorCode=ERR_05;
		return;
	}
	bPaBuf=OLD_TEST_PA;			// 0x00;
	bNeBuf=OLD_TEST_NE;			// 0x0a;
	if(!TxPaNe()){
		return;
	}
	i=0;
	memcpy(&aDataBuf,&aTestPara,9);
	if(!TxData())
		return;
	TxCmd(EQ);	 				// 寻问管理机下一命令
}
// End function: OldTest()

/************************************************************
 *
 *		函	数:DynamicPassword()
 *		说	明:校验动态密码及接收实时时钟
 *				OLD模式和NEW模式共用本函数
 *
 ***********************************************************/
void DynamicPassword(void)
{
	byte i,bTemp;
	byte xdata *Point;
	byte data aTemp[6];
	uint iAddr;
	bPaBuf=0x00;
	bNeBuf=0x10;
	iPaNeNum=0;
	if(!RxData())
		return;
	if(fWorkMode)
		iAddr=PARA_00;
	else
		iAddr=PARA_200;
	ReadData(1,iAddr,6,&aTemp);
	if(fSecretSelect){
		if((aTemp[2]!=0)&&(memcmp(&aDataBuf,&aTemp,6)!=0)){
			TxCmd(ERR_PW);
			bErrorCode=ERR_03;
			return;
		}
	}
	bParaByte=0;
	AutoWritePara(78);
	aTemp[0]=aDataBuf[15];			// 记录动态密码
	aTemp[1]=aDataBuf[14];
	aTemp[2]=aDataBuf[13];
	aTemp[3]=aDataBuf[10];
	aTemp[4]=aDataBuf[8];
	aTemp[5]=aDataBuf[6];
	WriteData(1,iAddr,6,&aTemp);
	Page(6);						// 暂停12887走时
	XBYTE[RTC_CONTROLB]=0x92;
	Page(5);
	// 存储实时时钟
	for(i=0,Point=0xc000;i<10;i++,Point++){
		bTemp=aDataBuf[i+6];
		Page(6);
		*Point=bTemp;
		Page(5);
	}
	Page(6);						// 启动12887继续走时
	XBYTE[RTC_CONTROLB]=0x12;
	Page(5);
	TxCmd(OK);
}
// End function: DynamicPassword()

/************************************************************
 *
 *		函	数:OldReportBills()
 *		说	明:OLD模式自动回报话单
 *
 ***********************************************************/
void OldReportBills(void)
{
	byte i,j,bTemp;
	uint cNoReport;
	uint ciBills;
	TxCmd(OLD_REPORT_BILLS);
	if(!RxCmd())
		return;
	if(bRecSBUF!=OK){
		bErrorCode=ERR_05;
		return;
	}
    // 计算需回报话单的Pa,Ne:
    AutoReadPara(69);
    cNoReport=iParaWord;				//汇报话单数量
    ciBills=iParaWord*OLD_BILL_LEN;		//汇报话单长度
    bPaBuf=(byte)(ciBills/128);
    bNeBuf=(byte)(ciBills%128);
    if(bNeBuf==0){
    	bNeBuf=128;
    	--bPaBuf;
    }
	if(!TxPaNe())
		return;
	// 从话单存储区取内容到aDataBuf[]缓冲区:
    AutoReadPara(68);					//汇报话单指针
	ciBills=OLD_BILLS_ADDR+iParaWord*OLD_BILL_LEN;
	iParaWord=0;
	for(i=0;i<cNoReport;i++){
		for(j=0;j<OLD_BILL_LEN;j++){
			Page(1);
			bTemp=XBYTE[ciBills++];
			Page(5);
			aDataBuf[iParaWord++]=bTemp;
		}
		if(ciBills>=(OLD_BILLS_ADDR+200*OLD_BILL_LEN))
			ciBills=OLD_BILLS_ADDR;
	}
	if(!TxData())
		return;
	iParaWord=0;
	AutoWritePara(69);
	AutoReadPara(67);
	AutoWritePara(68);
	TxCmd(EQ);
}
// End function: OldReportBills();

/************************************************************
 *
 *		函	数:OldDayTotal()
 *		说	明:OLD模式上传日分项合计记录
 *
 ***********************************************************/
void OldDayTotal(void)
{
	TxCmd(OLD_DAYTOTAL);
	if(!RxCmd())
		return;
	if(bRecSBUF!=OK){
		bErrorCode=ERR_05;
		return;
	}
	bPaBuf=OLD_DAYTOTAL_PA;			// 0x01;
	bNeBuf=OLD_DAYTOTAL_NE;			// 0x70;
	if(!TxPaNe())
		return;
	GeneralReadData(1,OLD_DAYTOTAL_ADDR,iPaNeNum,&aDataBuf);
	if(!TxData())
		return;
	TxCmd(EQ);
}
// End function: OldDayTotal()

/************************************************************
 *
 *		函	数:OldPowerOnOff()
 *		说	明:OLD模式上传开关机记录
 *
 ***********************************************************/
void OldPowerOnOff(void)
{
	TxCmd(OLD_POWERONOFF);
	if(!RxCmd())
		return;
	if(bRecSBUF!=OK){
		bErrorCode=ERR_05;
		return;
	}
	bPaBuf=OLD_POWERONOFF_PA;		// 0x02;
	bNeBuf=OLD_POWERONOFF_NE;		// 0x00;
	if(!TxPaNe())
		return;
	GeneralReadData(1,OLD_POWERONOFF_ADDR,iPaNeNum,&aDataBuf);
	if(!TxData())
		return;
	TxCmd(EQ);
}
// End function: OldPowerOnOff()

/************************************************************
 *
 *	函	数:OldSystem()
 *	说	明:OLD模式接收系统参数
 *
 ***********************************************************/
void OldSystem(void)
{
	TxCmd(OK);
	if(!RxPaNe())
		return;
	if((bPaBuf!=OLD_SYSTEM_PA)||(bNeBuf!=OLD_SYSTEM_NE)){
		bErrorCode=ERR_05;
		return;
	}
	if(!RxData())
		return;
	GeneralWriteData(OLD_SYSTEM_ADDR);
	bParaByte=CalcCSSubA(OLD_SYSTEM_ADDR,iPaNeNum);
	AutoWritePara(223);
	TxCmd(OK);
}
// End function: OldSystem()

/************************************************************
 *
 *		函	数:OldDisable()
 *		说	明:OLD模式上传测试参数
 *
 ***********************************************************/
void OldDisable(void)
{
	TxCmd(OK);
	if(!RxPaNe())
		return;
	if((bPaBuf!=OLD_DISABLE_PA)||(bNeBuf!=OLD_DISABLE_NE)){
		bErrorCode=ERR_05;
		return;
	}
	if(!RxData())
		return;
	GeneralWriteData(OLD_DISABLE_ADDR);
	bParaByte=CalcCSSubA(OLD_DISABLE_ADDR,iPaNeNum);
	AutoWritePara(225);
	TxCmd(OK);
}
// End function: OldDisableNumber()

/************************************************************
 *
 *		函	数:OldDiscount()
 *		说	明:OLD模式接收折扣参数
 *
 ***********************************************************/
void OldDiscount(void)
{
	TxCmd(OK);
	if(!RxPaNe())
		return;
	if((bPaBuf!=OLD_DISCOUNT_PA)||(bNeBuf!=OLD_DISCOUNT_NE)){
		bErrorCode=ERR_05;
		return;
	}
	if(!RxData())
		return;
	GeneralWriteData(OLD_DISCOUNT_ADDR);
	bParaByte=CalcCSSubA(OLD_DISCOUNT_ADDR,iPaNeNum);
	AutoWritePara(224);
	TxCmd(OK);
}
// End function: OldDiscount()

/************************************************************
 *
 *		函	数:OldIDDClass()
 *		说	明:OLD模式接收国际级数表
 *
 ***********************************************************/
void OldIDDClass(void)
{
	TxCmd(OK);
	if(!RxPaNe())
		return;

⌨️ 快捷键说明

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