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

📄 jbmcomm.c

📁 电话PSTN线路上FSK处理软件。。。。。。。。。
💻 C
📖 第 1 页 / 共 3 页
字号:
	if((bPaBuf!=OLD_IDD_CLASS_PA)||(bNeBuf!=OLD_IDD_CLASS_NE)){
		bErrorCode=ERR_05;
		return;
	}
	if(!RxData())
		return;
	GeneralWriteData(OLD_IDD_CLASS_ADDR);
	bParaByte=CalcCSSubA(OLD_IDD_CLASS_ADDR,iPaNeNum);
	AutoWritePara(226);
	TxCmd(OK);
}
// End function: OldIDDClass()

/************************************************************
 *
 *		函	数:OldDDDClass()
 *		说	明:OLD模式接收国内级数表
 *
 ***********************************************************/
void OldDDDClass(void)
{
	TxCmd(OK);
	if(!RxPaNe())
		return;
	if((bPaBuf!=OLD_DDD_CLASS_PA)||(bNeBuf!=OLD_DDD_CLASS_NE)){
		bErrorCode=ERR_05;
		return;
	}
	if(!RxData())
		return;
	GeneralWriteData(OLD_DDD_CLASS_ADDR);
	bParaByte=CalcCSSubA(OLD_DDD_CLASS_ADDR,iPaNeNum);
	AutoWritePara(227);
	TxCmd(OK);
}
// End function: OldDDDClass()

/************************************************************
 *
 *		函	数:OldLocalClass()
 *		说	明:OLD模式接收本地级数表
 *
 ***********************************************************/
void OldLocalClass(void)
{
	TxCmd(OK);
	if(!RxPaNe())
		return;
	if((bPaBuf!=OLD_LOCAL_CLASS_PA)||(bNeBuf!=OLD_LOCAL_CLASS_NE)){
		bErrorCode=ERR_05;
		return;
	}
	if(!RxData())
		return;
	GeneralWriteData(OLD_LOCAL_CLASS_ADDR);
	bParaByte=CalcCSSubA(OLD_LOCAL_CLASS_ADDR,iPaNeNum);
	AutoWritePara(228);
	TxCmd(OK);
}
// End function: OldLocalClass()

/************************************************************
 *
 *		函	数:OldIDDTariff()
 *		说	明:OLD模式接收国际区号表
 *
 ***********************************************************/
void OldIDDTariff(void)
{
	TxCmd(OK);
	if(!RxPaNe())
		return;
	if(!RxData())
		return;
	if((OLD_IDD_TARIFF_ADDR+iPaNeNum)<0xe000){
		bErrorCode=ERR_16;
		return;
	}
	GeneralWriteData(OLD_IDD_TARIFF_ADDR);
	bParaByte=CalcCSSubB(OLD_IDD_TARIFF_ADDR);
	AutoWritePara(229);
	TxCmd(OK);
}
// End function: OldIDDTariff()

/************************************************************
 *
 *		函	数:OldDDDTariff()
 *		说	明:OLD模式接收国内区号表
 *
 ***********************************************************/
void OldDDDTariff(void)
{
	byte bTemp;
	uint iAddr;
	TxCmd(OK);
	if(!RxPaNe())
		return;
	if(!RxData())
		return;
	iAddr=OLD_IDD_TARIFF_ADDR;
	while(TRUE){				// 计算国际区号表的结束地址
		Page(1);
		bTemp=XBYTE[iAddr];
		Page(5);
		if(++iAddr==0xffff){
			bErrorCode=ERR_16;
			return;
		}
		if(bTemp==0xff)
			break;
	}
	iAddr+=0x20;
	if((iAddr+iPaNeNum)<0xe000){
		bErrorCode=ERR_17;
		return;
	}
	GeneralWriteData(iAddr);
	aDataBuf[0]=((byte)(iAddr>>8))&0x3f;
	aDataBuf[1]=(byte)(iAddr&0x00ff);
	aDataBuf[2]=aDataBuf[0]+aDataBuf[1];
	WriteData(1,PARA_232,3,&aDataBuf);
	bParaByte=CalcCSSubB(iAddr);
	AutoWritePara(230);
	TxCmd(OK);
}
// End function: OldDDDTatiff()

/************************************************************
 *
 *		函	数:OldLocalTariff()
 *		说	明:OLD模式本地区号表
 *
 ***********************************************************/
void OldLocalTariff(void)
{
	uint iAddr;
	TxCmd(OK);
	if(!RxPaNe())
		return;
	if(!RxData())
		return;
	iAddr=0x10000-iPaNeNum;
	if(iAddr<0xf310){
		bErrorCode=ERR_18;
		return;
	}
	GeneralWriteData(iAddr);
	aDataBuf[0]=((byte)(iAddr>>8))&0x3f;
	aDataBuf[1]=(byte)(iAddr&0x00ff);
	aDataBuf[2]=aDataBuf[0]+aDataBuf[1];
	WriteData(1,PARA_233,3,&aDataBuf);
	bParaByte=CalcCSSubB(iAddr);
	AutoWritePara(231);
	TxCmd(OK);
}
// End function: OldLocalTariff()

/************************************************************
 *
 *		函	数:OldQueryBills()
 *		说	明:OLD模式下传指定话单数据
 *
 ***********************************************************/
void OldQueryBills(void)
{
	TxCmd(OK);
	if(!RxPaNe())
		return;
	if((bPaBuf!=OLD_QUERYBILL_PA)||(bNeBuf!=OLD_QUERYBILL_NE)){
		bErrorCode=ERR_05;
		return;
	}
	if(!RxData())
		return;
	memcpy(&aNumBuf,&aDataBuf,7);		// 缓存匹配号码数组
	TxCmd(OK);
}
// End function: OldQueryBills()

/************************************************************
 *
 *		函	数:OldReportQueryBills()
 *		说	明:OLD模式回报指定话单
 *
 ***********************************************************/
void OldReportQueryBills(void)
{
	byte i,j,bTemp;
	uint iAddr;
	uint ciBills;
	TxCmd(OLD_REPORT_QUERYBILLS);
	if(!RxCmd())
		return;
	if(bRecSBUF!=OK){
		bErrorCode=ERR_05;
		return;
	}
	ciBills=0;
	iAddr=OLD_BILLS_ADDR;
	for(i=0;i<200;i++,iAddr+=OLD_BILL_LEN){
		if(!SelectBill(iAddr))
			continue;
		for(j=0;j<OLD_BILL_LEN;j++){					// 存储找到的话单入aDataBuf
			Page(1);
			bTemp=XBYTE[iAddr+j];
			Page(5);
			if(j==0){
				if(bTemp==0x0c);						// 被叫号码
				else if((bTemp==0x0d)||(bTemp>0x29))	// 异常号码
					break;
			}
			aDataBuf[ciBills++]=bTemp;
		}
	}
	if(ciBills==0){
		bPaBuf=0;
		bNeBuf=0;
	}
	else{
		bPaBuf=(byte)(ciBills/128);
		bNeBuf=(byte)(ciBills%128);
		if(bNeBuf==0){
			bNeBuf=128;
			--bPaBuf;
		}
	}
	if(!TxPaNe())
		return;
	if(ciBills!=0){
		if(!TxData())
			return;
	}
	TxCmd(EQ);
}
// End function: OldReportQueryBills()

/************************************************************
 *
 *		函	数:SelectBill()
 *		说	明:OLD/NEW模式从话单存储区中选定一张指定话单,
 *				找到一张,返回TRUE,否则返回FALSE,
 *				查找的起始地址为入口参数iAddr.
 *
 ***********************************************************/
bool SelectBill(uint iAddr)
{
	byte i,j;
	byte bTemp0,bTemp1;
	byte data aTemp[16];
	if(aNumBuf[0]==0xcc)
		return TRUE;
	iAddress=iAddr;
	if(fWorkMode){
		ReadBytes(1,8);
		for(i=0;i<8;i++){
			aTemp[2*i]=aParaBuf[i]>>4;
			aTemp[2*i+1]=aParaBuf[i]&0x0f;
		}
		memset(aParaBuf,0xcc,8);
		if(aTemp[0]!=0){
			i=1;
			aParaBuf[0]=aTemp[0];
		}
		else if(aTemp[1]!=0){
			i=2;
			aParaBuf[0]=aTemp[1]|0x10;
		}
		else{
			i=3;
			aParaBuf[0]=aTemp[2]|0x20;
		}
		for(j=1;j<8;j++){
			aParaBuf[j]=aTemp[i++]<<4;
			if(i==16){
				aParaBuf[j]+=0x0c;
				break;
			}
			aParaBuf[j]+=aTemp[i++];
			if(i==16)
				break;
		}
		j=8;
	}
	else{
		ReadBytes(1,7);
		j=7;
	}
	for(i=0;i<j;i++){
		bTemp0=aNumBuf[i];
		bTemp1=aParaBuf[i];
		if(bTemp0==0xcc)
			return TRUE;
		else if((bTemp0&0x0f)==0x0c){
			if((bTemp1&0xf0)==(bTemp0&0xf0))
				return TRUE;
			else
				return FALSE;
		}
		else if(bTemp1!=bTemp0){
			 return FALSE;
		}
	}
	return TRUE;
}
// End function: SelectBill()

/************************************************************
 *
 *		函	数:OldClock()
 *		说	明:OLD/NEW模式接收实时时钟
 *
 ***********************************************************/
void OldClock(void)
{
	byte i,bTemp;
	byte xdata *Point;
	TxCmd(OK);
	if(!RxPaNe())
		return;
	if((bPaBuf!=OLD_CLOCK_PA)||(bNeBuf!=OLD_CLOCK_NE)){
		bErrorCode=ERR_05;
		return;
	}
	if(!RxData())
		return;
	Page(6);						// 暂停12887走时
	XBYTE[RTC_CONTROLB]=0x92;
	Page(5);
	// 存储实时时钟
	for(i=0,Point=0xc000;i<10;i++,Point++){
		bTemp=aDataBuf[i];
		Page(6);
		*Point=bTemp;
		Page(5);
	}
	Page(6);						// 启动12887继续走时
	XBYTE[RTC_CONTROLB]=0x12;
	Page(5);
	TxCmd(OK);
}
// End function: OldClock()

void OldScallTotal(byte bType)
{
	byte i,bTemp;
	uint iAddr;
	if(bType==OLD_SCALL_TOTAL)
		TxCmd(OLD_SCALL_TOTAL);
	else
		TxCmd(NEW_SCALL_TOTAL);
	if(!RxCmd())
		return;
	bPaBuf=OLD_SCALLTOTAL_PA;
	bNeBuf=OLD_SCALLTOTAL_NE;
	if(!TxPaNe())
		return;
	for(i=0,iAddr=PARA_65;i<bNeBuf;i++){ 	// 准备被叫数据
		Page(6);
		bTemp=XBYTE[iAddr++];
		Page(5);
		aDataBuf[i]=bTemp;
	}
	if(!TxData())
		return;
	Page(6);								// 清除被叫记录
	for(i=0,iAddr=PARA_65;i<bNeBuf;i++)
		XBYTE[iAddr++]=0;
	Page(5);
	TxCmd(EQ);
}
// End function: OldScallTotal()

/************************************************************
 *
 *		函	数:NewComm()
 *		说	明:NEW模式下传数据交换过程
 *				bStatusWord=S_NEWUPCALL和S_NEWDOWNCALL时调用.
 *
 ***********************************************************/
void NewComm(void)
{
	byte bTemp;
	byte bRecord=0;
	uint iCommFail;
	bDlpReason=0;
	bErrorCode=ERR_NO;
	// NEW模式上呼通信准备
	if(bStatusWord==S_NEWUPCOMM){
		SendTelNum(0);
		while(1){
			if(RxCmd())
				break;
			if(bRecSBUF==OK)
				break;
			else
				bErrorCode=ERR_04;
			ExitPro();
			return;
		}
		if((bCallReason==OLD_TEST)||(bCallReason==OLD_REPORT_BILLS))
			bCallReason=NEW_TEST;
		if(bCallReason==NEW_TEST)
			bRecord=1;
	}
	else{									// NEW模式下传通信准备
		TxCmd(OK);
		bCallReason=DYNAMIC_PASSWORD;		// 接收动态密码
	}
	fWorkMode=1;
	while(TRUE)
	{
		iCommFail=0;
		if(bCallReason==DYNAMIC_PASSWORD)
			bTemp=bCallReason;
		else{
			bTemp=SearchCmd(bCallReason);
			DispCmd(bTemp);						// 显示通信代码
		}
		if(bTemp==0xff)
			break;
		switch(bCallReason){
			case NEW_MANAGEMENT_PARA:
				ManageNumber();
				break;
			case DYNAMIC_PASSWORD:			// 0x09
				DynamicPassword();
				break;
			case NEW_SYSTEM:				// 0x60
				NewSystem();
				break;
			case NEW_DISCOUNT:				// 0x61
				iCommFail=PARA_91;
				NewDiscount();
				break;
			case NEW_CALLSTATION:  			// 0x62
				NewCallStation();
				break;
			case NEW_IDD_CLASS:				// 0x63
				iCommFail=PARA_93;
				NewIDDClass();
				break;
			case NEW_DDD_CLASS:				// 0x64
				iCommFail=PARA_94;
				NewDDDClass();
				break;
			case NEW_LOCAL_CLASS:			// 0x65
				iCommFail=PARA_95;
				NewLocalClass();
				break;
			case NEW_IDD_TARIFF:			// 0x66
				iCommFail=PARA_96;
				NewIDDTariff();
				break;
			case NEW_DDD_TARIFF:			// 0x67
				iCommFail=PARA_97;
				NewDDDTariff();
				break;
			case NEW_LOCAL_TARIFF:			// 0x68
				iCommFail=PARA_98;
				NewLocalTariff();
				break;
			case NEW_CLOCK: 		     	// 0x69
				OldClock();
				break;
			case NEW_QUERY_PARA:			// 0x6a
				NewQueryPara();
				break;
			case NEW_QUERY_BILLS:			// 0x6c
				NewQueryBills();
				break;
			case NEW_REPORT_BILLS:			// 0x70
				NewReportBills();
				break;
			case NEW_REPORT_QUERYBILLS: 	// 0x71
				NewReportQueryBills();
				break;
			case NEW_TEST:					// 0x73
				NewTest();
				break;
			case NEW_DAYTOTAL:				// 0x74
				NewDayTotal();
				break;
			case NEW_POWERONOFF: 			// 0x75
				NewPowerOnOff();
				break;
			case NEW_SCALL_TOTAL:			// 0x76
				OldScallTotal(bCallReason);
				break;
			case NEW_EXPAND_PARA:			// 0x77
				NewExpandPara();
				break;
			case QUERY_VERSION:				// 0x81
				QueryVersion();
				break;
			default:						// 收到异常命令
				bErrorCode=ERR_33;
				break;
		} // End switch(bCallReason)
		// 接收下一条命令或进行出错处理:
	    if(bDlpReason!=0)
	    	return;
		if((bErrorCode!=ERR_NO)||(!RxCmd())){
			// 2001-03-15 15:30 add 避免通讯不成功时,写入不完整的数据 yxw,更改校验和
			if((iCommFail>=PARA_91)&&(iCommFail<PARA_99)){
				Page(6);
				XBYTE[PARA_76]=1;
				Page(5);
			}
			break;
		}
		if(bRecSBUF==END){
			AutoReadPara(47);
			if(bParaByte!=0x99){
				bParaByte=0x99;
				AutoWritePara(47);
				ClrRam();
			}
			if(bRecord==2)
				bCallReason=NEW_TEST;
			break;
		}
		bCallReason=bRecSBUF;
		if(bCallReason==NEW_CLOCK)
			bRecord++;
		else
			bRecord=0;
	} // End while(TRUE);
	ExitPro();
}
// End function: NewComm()

void ManageNumber(void)
{
	TxCmd(OK);
	if(!RxPaNe())
		return;
	if(iPaNeNum>NEW_MANAGEMENT_LIMIT){
		bErrorCode=ERR_05;				// 参数越限
		return;
	}
	if(!RxData())
		return;
	GeneralWriteData(NEW_MANAGEMENT_ADDR);
	bParaByte=CalcCSSubA(NEW_MANAGEMENT_ADDR,iPaNeNum);
	TxCmd(OK);
}
/***************************************************************
 *
 *
 *		函	数: QueryVersion()
 *		说	明: NEW模式上传测试参数(0x81)
 *
 *
 **************************************************************/
void QueryVersion()
{
	TxCmd(QUERY_VERSION);
	if(!RxCmd())
		return;
	if(bRecSBUF!=OK){
		bErrorCode=ERR_05;
		return;
	}
	bPaBuf=VERSION_PA;				// 0x00
	bNeBuf=VERSION_NE;				// 0x0a
	if(!TxPaNe())
		return;
	AutoReadPara(50);
	memcpy(&aDataBuf,&aParaBuf,10);
	if(!TxData())
		return;
	TxCmd(EQ);						// 寻问管理机下一命令
	if(!RxCmd())
		return;
	if(bRecSBUF==END){
		bErrorCode=ERR_34;
		return;
	}
	if(bRecSBUF!=DOWNLOAD_PROGRAM){
		bErrorCode=ERR_05;
		return;
	}
	bDlpReason=5;
	EA=0;
}
// End function: QueryVersion()

/***************************************************************
 *
 *	函	数: NewTest()
 *	说	明: NEW模式上传测试参数
 *
 **************************************************************/
void NewTest(void)
{
	byte i;
	TxCmd(NEW_TEST);
	if(!RxCmd())
		return;
	if(bRecSBUF!=OK){
		if(bRecSBUF==END)
			bErrorCode=ERR_21;
		else
			bErrorCode=ERR_05;
		return;
	}
	bPaBuf=NEW_TEST_PA;				// 0x00
	bNeBuf=NEW_TEST_NE;				// 0x0a
	if(!TxPaNe())
		return;
	i=0;
	memcpy(&aDataBuf,&aTestPara,9);	//
	//aDataBuf[9]=0x99;
	/*
#ifdef MODEM_TEST
	for(i=0;i<9;i++)
		aDataBuf[i]=~aDataBuf[i];
#endif
	*/
	if(!TxData())
		return;
	TxCmd(EQ);			// 寻问管理机下一命令
}
// End function: NewTest()

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

/***************************************************************
 *
 *		函	数: NewDayTotal()
 *		说	明: NEW模式上传日分项合计值
 *				命令代码:NEW_DAYTOTAL=0x74.
 *
 **************************************************************/
void NewDayTotal(void)
{
	TxCmd(NEW_DAYTOTAL);
	if(!RxCmd())
		return;
	if(bRecSBUF!=OK){
		bErrorCode=ERR_05;
		return;
	}
	bPaBuf=NEW_DAYTOTAL_PA;		// 0x05;
	bNeBuf=NEW_DAYTOTAL_NE;		// 0x20;
	if(!TxPaNe())
		return;
	GeneralReadData(1,NEW_DAYTOTAL_ADDR,iPaNeNum,&aDataBuf);
	if(!TxData())
		return;

⌨️ 快捷键说明

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