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

📄 jbscomm.c

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

/***********************************************************
 *
 *	说	明:串口通讯程序,包函新、老数据格式
 *	日	期:1999/11/29
 *
 **********************************************************/

//#pragma SRC
//#pragma DEBUG
#include <jbScomm.h>

/***********************************************************
 *
 *	说	明:串口通讯程序,包函新、老数据格式
 *	日	期:1999/11/29
 *
 **********************************************************/
void UartComm(void)
{
	byte cbMenu=4;				// 缺省进入呼叫管理机状态
	bool fEnterSelect=FALSE;	
	bool fDispUpdate=TRUE;
	bool fLastKey=TRUE;			// 避免长按键多次起作用
   	while(TRUE){
		IDLE;
		if(fDispUpdate){
			fDispUpdate=FALSE;
			memset(aLargeBuf,0,20);
			memcpy(&aLargeBuf,&aUartMenu[cbMenu],11);
			ConvertCode();
			DispOut();
		}
		if(fLastKey){
			if(bKeyBuf==0xf0)
				fLastKey=FALSE;
			continue;	
		}	
        if((!fKey)||(cbKey>30)) continue;
        fKey=FALSE;
        // 菜单选择循环:
        bErrorCode=ERR_NO;
        switch(bKeyBuf)
        {
			case K1:
				if(cbMenu==8){
					bStatusWord=S_HARDWAREINIT;
					bEnterFlag=0x69;
					return;
				}				
				cbMenu=8;
				break;

    	    case DOWN_ARROW:        	//向前翻滚
        	    if(cbMenu!=0)
            	    cbMenu--;
	            else
    	            cbMenu=8;
        	    break;

	        case UP_ARROW:          	//向后翻滚 
    	        if(cbMenu!=8)
        	        cbMenu++;
            	else
                	cbMenu=0;
	            break;

			case MENU_ENTER:          	// 确定键
        	    if(cbMenu==8){     		// 退出键
					bStatusWord=S_HARDWAREINIT;
    	        	return;
	            }
	            else if(cbMenu==4){
	            	if(fWorkMode)
	            		bCallReason=NEW_TEST;
	            	else	
	            		bCallReason=OLD_TEST;
	               	bStatusWord=S_UPCALL;
	               	return;
	            }	
	            fEnterSelect=TRUE;
	            break;
		}
        fDispUpdate=TRUE;
        if(!fEnterSelect) continue;
		fEnterSelect=FALSE;
		fFlash=0;
		// 功能处理循环:
		switch(cbMenu)	            
   	    {
   	    	case 0:					// "1 F-SA     ",发送所有数据
   	    		SendAll(cbMenu);
   	    		break;
   	    	case 1:					// "2 F-SAC    ",发送所有数据并指示接收方初始化
   	    		SendAll(cbMenu);
   	    		break;
   	    	case 2:					// "3 F-SC     ",发送时钟
   	    		SendClock();
   	    		break;
   	    	case 3:					// "4 F-RD     ",进入接收等待
   	    		RecvAll();
   	    		break;
   	    	case 5:					// "5 F-SEr	   ",
   	    		DispClr();
				EX0=1;					
				bStatusWord=S_SERVICE;
				return ;
   	    	case 6:					// "6 F-SER	   ",
				SendProgram();
   	    		break;
   	    		//ChangeWorkMode();
   	    		//break;
   	    	case 7:					//"7 F-PC     "
   	    		PRNCLRServer();
   	    		break;
   	    }
		if(bDlpReason!=0) return;	// 转入串口程序下载过程	
		ExitUart();
	} // End while(TRUE)
}
// End function: UartComm()	   	    

void SetPrnBackDistance(void)			//lmt add 2001.3.13
{
	byte i1;
	Page(6);
	i1=XBYTE[PARA_59];
	Page(5);
	while(1){
		IDLE;
		memcpy(aLargeBuf,"3-",2);
		ConvertCode();
		aLargeBuf[2]=aLCDSegment[i1/100];
		aLargeBuf[3]=aLCDSegment[(i1%100)/10];
		aLargeBuf[4]=aLCDSegment[i1%10];
		DispOut();
					
		if(fKey){
			fKey=0;
			switch(bKeyBuf){
				case K2:
					if(cbKey>199)
						cbKey=180;
					i1--;
					break;
				
				case K3:
					if(cbKey>199)
						cbKey=180;
					i1++;
					break;
					
				case K1:
					Page(6);
					XBYTE[PARA_59]=i1;
					Page(5);
					return;
			}
		}
	}
}						
	
void PRNCLRServer(void)			//lmt add 2001.3.13
{
	byte xdata bManue;
	byte data i;
	bManue=1;
	memset(aLargeBuf,0,20);
	
	while(1){
		IDLE;
		if(bManue==3){
			Page(6);
			i=XBYTE[PARA_59];
			Page(5);
			while(1){
				IDLE;
				aLargeBuf[0]='3';
				aLargeBuf[1]='-';
				ConvertCode();
				aLargeBuf[2]=aLCDSegment[i/100];
				aLargeBuf[3]=aLCDSegment[(i%100)/10];
				aLargeBuf[4]=aLCDSegment[i%10];
				DispOut();
				if(fKey){
					fKey=0;
					if(cbKey>30)
						continue;
					if(bKeyBuf==K4){
						if(cbKey>199)
							cbKey=180;
						Speaker(40);
						SetPrnBackDistance();
						return;
					}
					else if(bKeyBuf==K3){
						if(cbKey>199)
							cbKey=180;
						bManue=1;
						break;
					}
					else if(bKeyBuf==K2){
						if(cbKey>199)
							cbKey=180;
						bManue=2;
						break;
					}
				}
			}
		}
		if(bManue==1)
			memcpy(aLargeBuf,"1-PRN",5);
		if(bManue==2)
			memcpy(aLargeBuf,"2-CLR",5);
		ConvertCode();
		DispOut();
		
		if(fKey){
			fKey=0;
			if(cbKey>30)
				continue;
			switch(bKeyBuf){
				case K1:
					if(bManue==1){
						if(PrintBaoBiao()){
							return;
						}
						else{
							bManue=1;
							break;
						}
					}
					if(bManue==2){
						ClrLastClass();
						return;
					}
					break;
				
				case K2:
					if(cbKey>199)
						cbKey=180;
					--bManue;
					if(bManue<=0)
						bManue=3;
					break;
				
				case K3:
					if(cbKey>199)
						cbKey=180;
					++bManue;	
					if(bManue>=4)
						bManue=1;
					break;
				
				case K4:
					Speaker(20);
					break;
			}
		}
	}
}

void ClrLastClass(void)			//lmt add 2001.3.13
{   
	byte i;
	
	WaitRTC();
	Page(6);
	XBYTE[StartTimeAddress]=XBYTE[0xe004];		//清除时间即为该班开始统计时间
	XBYTE[StartTimeAddress+1]=XBYTE[0xe002];
	XBYTE[StartTimeAddress+2]=XBYTE[0xe000];
	XBYTE[EndTimeAddress]=XBYTE[0xe004];		//清除时间即为该班开始统计时间
	XBYTE[EndTimeAddress+1]=XBYTE[0xe002];
	XBYTE[EndTimeAddress+2]=XBYTE[0xe000];
	for(i=0,iAddress=ClassIDDAddress;i<15;i++){
		XBYTE[iAddress+i]=0x00;
	}
	Page(5);
}					

void ExitUart(void)
{		
	TR1=0;REN=0;ES=0;			// 关闭串口中断
    if(bErrorCode==ERR_NO)
    	DispOK(3);
    else if(bErrorCode==KEY_EXIT)
    	cbKey=200;
    else
    	DispErrorCode();				
} 	
// End function: ExitUart()

   	    						
/************************************************************
 *
 *	函	数:SendAll()
 *	说	明:OLD模式/NEW模式下发送所有数据
 *
 ***********************************************************/
void SendAll(byte bMenu)
{
	if(fWorkMode)
		NewSendAll(bMenu);	
	else
		OldSendAll(bMenu);
}
// End function: SendAll()
				
/************************************************************
 *
 *	函	数:SendClock()
 *	说	明:OLD模式/NEW模式下发送时钟
 *
 ***********************************************************/
void SendClock(void)
{
	byte i,bTemp,bCheckSum=0;
	uint iAddr=0xc000;
	DispSymbol(LARGE_COMM);
    ResetUart();
    TxCmd(0x32);
    fWaitExit=1;
    if(!RxCmd())
    	return;
	fWaitExit=0;
    if(bErrorCode==KEY_EXIT)
    	return;
    else if(bRecSBUF!=OK){
		bErrorCode=ERR_05;    
    	return;	
    }	
	DispSymbol(LARGE_FLASH);
    WaitRTC();
    for(i=0;i<10;i++)
    {
	    Page(6);
		bTemp=XBYTE[iAddr++];
	    Page(5);
        TxByte(bTemp);
        bCheckSum+=bTemp;
    }
    TxByte(bCheckSum);
	if(!RxCmd())
		return;
	if(bRecSBUF!=OK)
		bErrorCode=ERR_05;
}
// End function: SendClock()
				
/************************************************************
 *
 *	函	数:RecvAll()
 *	说	明:OLD模式/NEW模式下接收所有数据
 *			数据可来自管理机或另一台计费器。
 *
 ***********************************************************/
void RecvAll(void)
{
	DispSymbol(LARGE_COMM);
	ResetUart();
	while(TRUE){
		fWaitExit=1;
		fFirstCmd=1;
		if(!RxCmd())
			continue;
		fFirstCmd=0;	
		fWaitExit=0;
		if(bErrorCode==KEY_EXIT)
			return;
		bErrorCode=ERR_NO;	
		if((bRecSBUF>=0x30)&&(bRecSBUF<=0x32)){
			DispSymbol(LARGE_FLASH);
		    fWorkMode=0;
			OldRecvAll();
			return;
		}
		else if((bRecSBUF>=0x40)&&(bRecSBUF<=0x57)){	
			DispSymbol(LARGE_FLASH);
		    fWorkMode=1;
			NewRecvAll();
			return;
		}
		else if(bRecSBUF==0x81){
			DispCmd(bRecSBUF);
			QueryVersion();		
			/*	
		 	if(!RxCmd())
				break;
			if(bRecSBUF!=DOWNLOAD_PROGRAM){
				bErrorCode=ERR_05;
				break;
			}
			*/
			if(bErrorCode!=ERR_NO)
				break;
			DispCmd(bRecSBUF);	
			return;
		}	
		else
			continue;
	} // End while(TRUE)
}
// End function: RecvAll()
		
			
/************************************************************
 *
 *	函	数:OldSendAll()
 *	说	明:OLD模式发送所有数据
 *
 ***********************************************************/
void OldSendAll(byte bCmd)
{
	byte i,j,bCheckSum;
	byte bTemp;
	uint iAddr;
	DispSymbol(LARGE_COMM);
	ResetUart();
	TxCmd(bCmd+0x30);
	DispCmd(bCmd);
	fWaitExit=1;
    if(!RxCmd())
    	return;
	fWaitExit=0;
    if(bErrorCode==KEY_EXIT)
    	return;
    else if(bRecSBUF!=OK){
		bErrorCode=ERR_05;    
    	return;	
    }	
	DispSymbol(LARGE_FLASH);
	//
	iAddress=PARA_232;
	ReadBytes(1,2);
	iParaWord--;
	iParaWord|=0xf000;
	AutoReadPara(51);
	if((bParaByte&0x08)!=0)
		bParaByte&=0xf7;
	else
		bParaByte|=0x08;	
	aDataBuf[0]=bParaByte;
	WriteData(1,iParaWord,1,&aDataBuf);		// 将老模式控制参数填到费率中
	//
	iAddr=PARA_202;
	for(i=0;i<81;i++){
		for(j=0,bCheckSum=0;j<64;j++){
			Page(1);
			bTemp=XBYTE[iAddr+j];
			Page(5);
			TxByte(bTemp);
			bCheckSum+=bTemp;
		}
		TxByte(bCheckSum);
		if(!RxCmd())
			return;
		if(bRecSBUF!=OK){
			bErrorCode=ERR_04;
			return;
		}
		iAddr+=64;
		FlashComm();
	}
}
// End function: OldSendAll()
				
/************************************************************
 *
 *	函	数:NewSendAll()
 *	说	明:OLD模式/NEW模式下发送所有数据
 *
 ***********************************************************/
byte aNewUCmd[]={
	S_NEW_SYSTEM,  		// 0x40
	S_NEW_DISCOUNT,		// 0x41
	S_CALLSTATION,		// 0x42
	S_IDD_CLASS,		// 0x43
	S_DDD_CLASS,		// 0x44
	S_LOCAL_CLASS,		// 0x45
	S_IDD_TARIFF,		// 0x46
	S_DDD_TARIFF,		// 0x47
	S_LOCAL_TARIFF,		// 0x48
	S_MANAGEMENT,

⌨️ 快捷键说明

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