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

📄 jbscomm.c

📁 电话PSTN线路上FSK处理软件。。。。。。。。。
💻 C
📖 第 1 页 / 共 2 页
字号:
	S_EXPAND,			// 0x52
	S_NEW_TEST			// 0x53
	};

void NewSendAll(byte bMenu)
{
	byte bParaNum=0;
	byte bParaType;
	uint iAddr;
	bool fSendManagement=0;
	DispSymbol(LARGE_COMM);
	ResetUart();
	DispSymbol(LARGE_FLASH);
	fFirstCmd=0;
	while(TRUE){
		bParaType=aNewUCmd[bParaNum];
		switch(bParaType){
			case S_NEW_SYSTEM:  		// 0x40
				AutoReadPara(100);
				iAddr=NEW_SYSTEM_ADDR;
				break;
			case S_NEW_DISCOUNT:		// 0x41
				AutoReadPara(101);
				iAddr=NEW_DISCOUNT_ADDR;
				break;
			case S_CALLSTATION:			// 0x42
				AutoReadPara(102);
				iAddr=NEW_CALLSTATION_ADDR;
				break;
			case S_IDD_CLASS:			// 0x43
				AutoReadPara(103);
				iAddr=NEW_IDD_CLASS_ADDR;
				break;
			case S_DDD_CLASS:			// 0x44
				AutoReadPara(104);
				iAddr=NEW_DDD_CLASS_ADDR;
				break;
			case S_LOCAL_CLASS:			// 0x45
				AutoReadPara(105);
				iAddr=NEW_LOCAL_CLASS_ADDR;
				break;
			case S_IDD_TARIFF:			// 0x46
				AutoReadPara(106);
				iAddr=NEW_IDD_TARIFF_ADDR;
				break;
			case S_DDD_TARIFF:			// 0x47
				AutoReadPara(107);
				iAddr=NEW_DDD_TARIFF_ADDR;
				break;
			case S_LOCAL_TARIFF:			 // 0x48
				AutoReadPara(108);
				iAddr=NEW_LOCAL_TARIFF_ADDR;
				break;
			case S_EXPAND:					 // 0x50
				AutoReadPara(109);
				if(!fSendManagement)	// 少传2个参数
					iParaWord-=2;
				iAddr=NEW_EXPAND_ADDR;
				break;
			
			case S_MANAGEMENT:
				if(!fSendManagement){
					bParaNum++;
					continue;
				}	
				AutoReadPara(110);
				
				iAddr=NEW_MANAGEMENT_ADDR;
				break;
				
			case S_NEW_TEST:				 // 0x53
				iParaWord=0x0a;
				iAddr=NEW_TEST_ADDR;
				break;
		}
		DispCmd(bParaType);
		iPaNeNum=iParaWord;
		GeneralReadData(1,iAddr,iPaNeNum,&aDataBuf);		// 缓冲数据到aDataBuf[]中。	
		bPaBuf=(byte)(iParaWord/128);
		bNeBuf=(byte)(iParaWord%128);
		TxCmd(aNewUCmd[bParaNum]);			 // 发送命令
		if(bParaNum==0){
			fWaitExit=1;
	    	if(!RxCmd())
    			return;
			fWaitExit=0;
    		if(bErrorCode==KEY_EXIT)
			  	return;
    	}	
		else{
			fWaitExit=0;	
			if(!RxCmd())
				return;
		}		
		if((bParaType==S_NEW_SYSTEM)&&(bRecSBUF==0x10))
			fSendManagement=1;
    	else if(bRecSBUF!=OK){
			bErrorCode=ERR_05;    
	    	return;	
    	}	
		if(!TxPaNe())				// 发送PA、NE,并接收应答:
			return;
		if(!TxData())				// 发送数据:
			return;	
		if(++bParaNum==12){
			if(bMenu==1){			//最后发送初始化命令
				TxCmd(S_INITIAL);
				if(!RxCmd())
					return;
			}		
			TxCmd(END);
			return;
		}	
	} // End while(TRUE)
}
// End function: NewSendAll()

/************************************************************
 *
 *	函	数:OldRecvAll()
 *	说	明:OLD模式下接收所有数据
 *
 ***********************************************************/
void OldRecvAll(void)
{
	byte i,j;
	byte bCmdBuf;
	byte bCheckSum;
	uint iAddr;
	// 先接收时钟:
	bCmdBuf=bRecSBUF;
	DispCmd(bCmdBuf&0x0f);
	TxCmd(OK);
	if(bCmdBuf==S_TRANSCLOCK){
		RecvClock();
		return;
	}
	// 接收其它所有数据,并将它们缓冲到aDataBuf:
   	iAddr=0;
	for(i=0;i<81;i++)	 					// 共81包数据
	{
		for(j=0,bCheckSum=0;j<65;j++){ 		// 每包数据64字节+1字节检验和
           	if(!RxByte())
				return;
			if(j<64){
				aDataBuf[iAddr+j]=bRecSBUF;
				bCheckSum+=bRecSBUF;		// 计算校验和
			}	
		}
		if(bCheckSum!=bRecSBUF){
			bErrorCode=ERR_04;
			return;
		}
		iAddr+=64;
		if(i<80) TxCmd(OK);
	}
    TxCmd(OK);
	iPaNeNum=iAddr;
	Open(POWER_ON);
	GeneralWriteData(PARA_202);				// 写到OLD模式数据区
	// 将老模式控制参数写到扩充参数内
	iAddress=PARA_232;
	ReadBytes(1,2);
	iParaWord--;
	iParaWord|=0xf000;
	iAddress=iParaWord;
	ReadBytes(1,1);
	if((bParaByte&0x08)!=0)					// 特殊情况,BHY的标志与其他相反
		bParaByte&=0xf7;
	else
		bParaByte|=0x08;	
	AutoWritePara(51);					
	// 若命令是S_TRANSANDCLR,还需要清除FLASH和12887的有关记录
	if(bCmdBuf==S_TRANSANDCLR)
		ClrTotal();
    // 自动设置计费器为OLD模式:
    bParaByte=0x88;
    AutoWritePara(47);
    Close(POWER_ON);
}
// End function: OldRecvAll()

/************************************************************
 *
 *	函	数:NewRecvAll()
 *	说	明:NEW模式下接收所有数据
 *
 ***********************************************************/
void NewRecvAll(void)
{
	byte bParaType;
	byte bParaCode;
	uint iAddr;
	bool fClrTalk=0;
	while(TRUE){
		bParaType=bRecSBUF;
		DispCmd(bParaType);
		if(bRecSBUF==END){
			Open(POWER_ON);
			if(fClrTalk)
				ClrTotal();
			Close(POWER_ON);
			break;
		}	
		else if(bRecSBUF==S_CLOCK){
			TxCmd(OK);					// 要接收管理系统号码
			RecvClock();
			break;
		}
		else if(bRecSBUF==S_INITIAL){
			fClrTalk=1;
			TxCmd(OK);
			if(!RxCmd()) 
				return;
			continue;	
		}
		if(bParaType==S_NEW_SYSTEM)		// 2002-04-01 17:26 yxw add ch
			TxCmd(0x10);
		else
			TxCmd(OK);
		if(!RxPaNe())					// 接收PA、NE,并接收应答:
			break;
		if(!RxData())					// 接收数据:
			break;
		switch(bParaType){
			case S_NEW_SYSTEM:  		// 0x40
				bParaCode=100;
				iAddr=NEW_SYSTEM_ADDR;
				break;
			case S_NEW_DISCOUNT:		// 0x41
				bParaCode=101;
				iAddr=NEW_DISCOUNT_ADDR;
				break;
			case S_CALLSTATION:			// 0x42
				bParaCode=102;
				iAddr=NEW_CALLSTATION_ADDR;
				break;
			case S_IDD_CLASS:			// 0x43
				bParaCode=103;
				iAddr=NEW_IDD_CLASS_ADDR;
				break;
			case S_DDD_CLASS:			// 0x44
				bParaCode=104;
				iAddr=NEW_DDD_CLASS_ADDR;
				break;
			case S_LOCAL_CLASS:			// 0x45
				bParaCode=105;
				iAddr=NEW_LOCAL_CLASS_ADDR;
				break;
			case S_IDD_TARIFF:			// 0x46
				bParaCode=106;
				iAddr=NEW_IDD_TARIFF_ADDR;
				break;
			case S_DDD_TARIFF:			// 0x47
				bParaCode=107;
				iAddr=NEW_DDD_TARIFF_ADDR;
				break;
			case S_LOCAL_TARIFF:		// 0x48
				bParaCode=108;
				iAddr=NEW_LOCAL_TARIFF_ADDR;
				break;
			case S_EXPAND:				// 0x50
				bParaCode=109;
				iAddr=NEW_EXPAND_ADDR;
				break;
			case S_NEW_TEST:			// 0x53
				iAddr=NEW_TEST_ADDR;
				break;
			case S_MANAGEMENT:
				bParaCode=110;
				iAddr=NEW_MANAGEMENT_ADDR;
				break;
				
			default:
				bErrorCode=ERR_05;
				return;	
		}
		Open(POWER_ON);
		GeneralWriteData(iAddr);		// 写入参数内容
		if(bParaType!=S_NEW_TEST)
			AutoWritePara(bParaCode);	// 写入参数长度
		Close(POWER_ON);	
		TxCmd(OK);
		if(!RxCmd()) 
			return;
	} // End while(TRUE)
	bParaByte=0x99;
	AutoWritePara(47);
}
// End function: NewRecvAll()

void RecvClock(void)
{
	byte i;
	byte bTemp;
	for(i=0,bTemp=0;i<10;i++){
		if(!RxByte())
			return;
		aNumBuf[i]=bRecSBUF;
		bTemp+=bRecSBUF;
	}
	if(!RxByte())
		return;
	if(bTemp!=bRecSBUF){
		bErrorCode=ERR_04;
		return;
	}	
	Page(6);
	XBYTE[RTC_CONTROLB]=0x92;
	for(i=0;i<10;i++)
		aRTCTime[i]=aNumBuf[i];
	XBYTE[RTC_CONTROLB]=0x12;
	Page(5);
	TxCmd(OK);                   		//回应OK
}
// End function: RecvClock()

/************************************************************
 *
 *	函	数:ChangeWorkMode()
 *	说	明:切换工作模式。“88”表示OLD模式,“99”表示NEW模式。			
 *
 ***********************************************************/
void ChangeWorkMode(void)
{
	bool fLastKey=TRUE;
	bool fDispUpdate=TRUE;
	AutoReadPara(47);
	if((bParaByte!=0x88)&&(bParaByte!=0x99)){
		bParaByte=0x99;
		AutoWritePara(47);
	}	
	while(TRUE){
		IDLE;
		if(fDispUpdate){
			fDispUpdate=FALSE;
			DispClr();
			DispCmd(bParaByte);			
		}
		if(fLastKey){
			if(bKeyBuf==0xf0)
				fLastKey=FALSE;
			continue;	
		}	
        if(!fKey) continue;
        fKey=FALSE;
        switch(bKeyBuf){
        	case K1:
        		//bErrorCode=KEY_EXIT;
        		return;
        		
        	case K23:
        		fDispUpdate=TRUE;
        		if(bParaByte==0x88){
        			bParaByte=0x99;
        			fWorkMode=1;
        		}	
        		else{
        			bParaByte=0x88;
        			fWorkMode=0;
        		}	
        		break;		
        		
        	case K4:
        		AutoWritePara(47);
				DispOK(3);        		
        		return;
        }
	} // End while(TRUE)
}
// End function: ChangeWorkMode()
//
// 下为各上层调用的子函数:
//  	    	
/************************************************************
 *
 *	函	数:ResetUart()
 *	说	明:初始化异步串行口
 *
 ***********************************************************/
void ResetUart(void)
{	
    SCON=0x40;					// 串口工作模式1,8位UART
    TH1=L9600;					// 串口9600BPS定时常数
	TL1=L9600;
	TI=0;
	RI=0;
	TR1=1;
    REN=1;
    ES=1;
    EX0=1;
    bLastCmd=0xff;
	fRxDataReady=0;
	fTxDataReady=0;
}
// End function: ResetUart() 

void SendProgram(void)
{
	byte i,bTemp;
	byte bNum,k;
	uint j;
	byte code *Program;
	bErrorCode=ERR_NO;
	DispSymbol(LARGE_COMM);
    ResetUart();
    TxCmd(QUERY_VERSION);
    fWaitExit=1;
    if(!RxCmd())
    	return;
	fWaitExit=0;
    if(bErrorCode==KEY_EXIT)
    	return;
    else if(bRecSBUF!=QUERY_VERSION){
		bErrorCode=ERR_05;    
    	return;	
    }	
	TxCmd(OK);
	if(!RxPaNe())
		return;
	if(!RxData())	
		return;
	TxCmd(OK);	
	if(!RxCmd())
		return;
	if(bRecSBUF!=EQ){
		bErrorCode=ERR_05;
		return;
	}	
	AutoReadPara(50);
	if(memcmp(&aDataBuf,&aParaBuf,7)!=0){
		TxCmd(END);
		bErrorCode=ERR_34;
		return;
	}	
	if(aParaBuf[7]>aDataBuf[7]);
	else if(aParaBuf[8]>aDataBuf[8]);
	else if(aParaBuf[9]>=aDataBuf[9]);
	else{
		bErrorCode=ERR_34;
		return;
	}
	TxCmd(DOWNLOAD_PROGRAM);
	if(!RxCmd())
		return;
	if(bRecSBUF!=OK){
		bErrorCode=ERR_05;
		return;
	}
	DispSymbol(LARGE_FLASH);
	DispCmd(DOWNLOAD_PROGRAM);
	bPaBuf=0x01;
	bNeBuf=0xc0;
	if(!TxPaNe())
		return;
	bNum=44;	
	k=0;
	for(i=0,Program=0x2000;i<224;i++){
		DispSpeed(bNum);
		bPaBuf=1;
		bNeBuf=128;
		for(j=0;j<256;j++,Program++){
			Page(0);
			bTemp=*Program;
			Page(5);
			aDataBuf[j]=bTemp;
		}
		if(++k==5){
			k=0;
			bNum--;
		}
		FlashComm();	
		if(!TxData())
			return;
	}			
	TxCmd(END);
}	

//
// End file: jbscomm.c
//

⌨️ 快捷键说明

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