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

📄 jbdata.c

📁 电话PSTN线路上FSK处理软件。。。。。。。。。
💻 C
📖 第 1 页 / 共 2 页
字号:
	bool fFirstOk=0;
	cbDelaySecond=4;
	fDelaySecond=FALSE;
	while(TRUE){
		if(fDelaySecond){
			bErrorCode=ERR_35;
			break;
		}	
    	if(!fRxDataReady)
    		continue;
	    fRxDataReady=FALSE;
   		if(!fFirstOk){
   			if(bRecSBUF==OK)
   				fFirstOk=1;
   			continue;
   		}
   		else if(bRecSBUF==0xfe)
	   		return TRUE;
	}
	return FALSE;
}
// End function: RxFirstOK()

/***************************************************************
 *
 *		函	数: RxPaNe()
 *		说	明: 接收管理机下传的Pa,Ne,并作应答处理 
 *
 **************************************************************/
bool RxPaNe(void)
{
	byte i,aTemp[3];
	bool fFalse=FALSE;
	byte bSendTimes;
	for(bSendTimes=0;bSendTimes<3;bSendTimes++){	
		for(i=0;i<3;i++){
			if(!RxByte()){
				if(fFalse)
					return FALSE;
				fFalse=TRUE;
				i=0xff;
				continue;
			}
			aTemp[i]=bRecSBUF;
			if((i==1)&&(aTemp[0]==ERR_CS)&&(aTemp[1]==~ERR_CS)){
				TxCmd(bLastCmd);
				i=0xff;
				continue;
			}	
		}					
		if(aTemp[2]==(byte)(aTemp[0]+aTemp[1])){
			bPaBuf=aTemp[0];
			bNeBuf=aTemp[1];
			iPaNeNum=((uint)bPaBuf*128)+bNeBuf;
			iParaWord=iPaNeNum;
			return TRUE;
		}
		TxCmd(ERR_CS);
	}
	bErrorCode=ERR_04;
	return FALSE;
}
// End function: RxPaNe()

/***************************************************************
 *
 *		函	数: TxPaNe()
 *		说	明: 向管理机发送Pa,Ne,并等待答应 
 *
 **************************************************************/
bool TxPaNe(void)
{
	byte i;
	iPaNeNum=(uint)(bPaBuf*128)+bNeBuf;
	for(i=0;i<3;i++){
		TxByte(bPaBuf);
		TxByte(bNeBuf);
		TxByte(bPaBuf+bNeBuf);
		if(!RxCmd())
			return FALSE;
		if(bRecSBUF==OK)
			return TRUE;
		else if(bRecSBUF!=ERR_CS){
			bErrorCode=ERR_05;
			return FALSE;
		}
	}
	bErrorCode=ERR_04;
	return FALSE;
}
// End function: TxPaNe()

/******************************************************************
 *
 *	函数名:RxData()			
 *	功	能:从CBUS口接收由bPaBuf,bNeBuf指定的数据
 *			数据被顺序缓冲在aDataBuf[]中
 *			包函接收数据和给出应答
 *
 ******************************************************************/
bool RxData(void)
{
	bool fOneTimes;
	byte i,j,bCheckSum;
	uint iAddr=0;
	if(iPaNeNum!=0) 
		TxCmd(OK);			
	while(bPaBuf!=0){
		for(i=0,fOneTimes=FALSE;i<3;i++){
			for(j=0,bCheckSum=0;j<129;j++){
				if(!RxByte()){
					if((j>=1)&&
					(aDataBuf[iAddr]==ERR_CS)&&(aDataBuf[iAddr+1]==~ERR_CS)){
						aDataBuf[iAddr]=0;
						aDataBuf[iAddr+1]=0;
						TxCmd(bLastCmd);
						j=0xff;
						continue;
					}	
					if(fOneTimes)
						return FALSE;							
					else{
						fOneTimes=TRUE;
						j=0xff;
						continue;
					}
				}
				if(j<128){
					bCheckSum+=bRecSBUF;
					aDataBuf[iAddr+j]=bRecSBUF;
				}
			} // End for(j...)
			if(bCheckSum!=bRecSBUF){				//若校验和不正确,重新发送数据
				TxCmd(ERR_CS);	
				continue;
			}
			iAddr+=128;
			Flash(1);
			if((--bPaBuf!=0)||(bNeBuf!=0))
				TxCmd(OK);
			break;
		} // End for(i...)
		if(i==3){
			bErrorCode=ERR_04;
			return FALSE;
		}
	} // End while(bPaBuf!=0)		
	while(bNeBuf!=0){
		for(i=0,fOneTimes=FALSE;i<3;i++){
			for(j=0,bCheckSum=0;j<bNeBuf+1;j++){
				if(!RxByte()){
					if((j>=1)&&
					(aDataBuf[iAddr]==ERR_CS)&&(aDataBuf[iAddr+1]==~ERR_CS)){
						aDataBuf[iAddr]=0;
						aDataBuf[iAddr+1]=0;
						TxCmd(bLastCmd);
						j=0xff;
						continue;
					}	
					if(fOneTimes){
						DelaySecond(2);
						return FALSE;				
					}				
					else{
						fOneTimes=TRUE;
						j=0xff;
						continue;
					}
				}
				if(j<bNeBuf){
					aDataBuf[iAddr+j]=bRecSBUF;	
					bCheckSum+=bRecSBUF;
				}
			} // End for(j...)
			if(bCheckSum!=bRecSBUF){				//若校验和不正确,重新发送数据
				TxCmd(ERR_CS);	
				continue;
			}
			return TRUE;
		} // End for(i...)
		DelaySecond(2);
		bErrorCode=ERR_04;
		return FALSE;
	} // End while(bNeBuf!=0)	
	return TRUE;
}	
// End function: RxData()	

/******************************************************************
 *
 *		函	数: TxData()			
 *		功	能: 从CBUS口发送由bPaBuf,bNeBuf指定的数据
 *				数据被顺序缓冲在aDataBuf[]中
 *				包函发送数据和接收应答
 *
 ******************************************************************/
bool TxData(void)
{
	byte i,j,bCheckSum;
	uint iAddr;
	iAddr=0;
	while(bPaBuf!=0){
		for(i=0;i<3;i++){
			for(j=0,bCheckSum=0;j<128;j++){
				if(!TxByte(aDataBuf[iAddr+j]))
					return FALSE;
				bCheckSum+=aDataBuf[iAddr+j];
			}
			TxByte(bCheckSum);
			if(!RxCmd())
				continue;
			if(bRecSBUF==OK)
				break;
			else if(bRecSBUF!=ERR_CS)
				break;
		}

		if((bRecSBUF!=OK)||(i==3)){
			bErrorCode=ERR_04;
			return FALSE;
		}	 
		 
		--bPaBuf;
		iAddr+=128;
		FlashComm();
	} // End while(bPaBuf!=0)
	while(bNeBuf!=0){
		for(i=0;i<3;i++){
			for(j=0,bCheckSum=0;j<bNeBuf;j++){
				if(!TxByte(aDataBuf[iAddr+j]))
					return FALSE;
				bCheckSum+=aDataBuf[iAddr+j];
			}
			TxByte(bCheckSum);
			if(!RxCmd())
				continue;
			if(bRecSBUF==OK)
				break;
			else if(bRecSBUF!=ERR_CS)
				break;
		}
		if((i==3)||(bRecSBUF!=OK)){
			bErrorCode=ERR_04;
			return FALSE;
		} 
		break;
	}
	return TRUE;
}
// End function: TxData()

/**********************************************************************
 *
 *		函数名:	WriteData()
 *		功	能:	将DataBuf中指定长度的数据写入FLASH或RTC_RAM存储器中
 *					FLASH的写入过程在DlpTime0中断中进行
 *		入口参数:	bPage:欲写入的页面	
 *					tAddr:欲写入的目标地址
 *					bLen: 欲写入数据的长度(1-256)
 *		全局变量:	fWriteFlashRequest: 写入FLASH请求标志
 *					bWriteFlashPage:	欲写入的页面
 *					tWriteFlashAddr: 	欲写入的目标地址
 *					sWriteFlashBuf[256]:欲写入FLASH数据缓冲区					
 *					bWriteFlashLen: 欲写入数据的长度(1-256)
 *		注	意:		在有严格时间要求的过程中不能调用本函数,执行时间约30MS
 *
 **********************************************************************/
// 暂按128字节页面(SST29EE010/SST29EE020)设计:
void WriteData(byte bPage,uint tAddr,byte bLen,byte*p)
{
	byte i,bTemp;
    byte code *pFrom;
    byte xdata *pTo;
	if(bPage>=4){
		for(i=0;i<bLen;i++){
			bTemp=p[i];
			Page(bPage);
			XBYTE[tAddr+i]=bTemp;
			Page(5);
		}
		return;
	}
	Page(4);								// 拷贝写FLASH过程到Page4
    for(pFrom=0x2000,pTo=0x2000;pFrom<0x2300;pFrom++,pTo++)
        *pTo=*pFrom;
    Page(5);
	bWriteFlashPage=bPage;					// 设置页面
	tWriteFlashAddr=tAddr;					// 设置目标地址
	for(i=0;i<bLen;i++,p++)
		sWriteFlashBuf[i]=*p;
	bWriteFlashLen=bLen;				 	// 设置长度
	fWriteFlashRequest=1;					// 开始请求写入
	while(fWriteFlashRequest) IDLE;			// 等待写入完成
}
// End function: WriteData()

/******************************************************************
 *
 *		函	数: GeneralWriteData()			
 *		功	能: 向FLASH中写入由bPaBuf,bNeBuf指定的已收到数据
 *				数据被缓冲在aDataBuf[]中.
 *
 ******************************************************************/
void GeneralWriteData(uint iAddr)
{
	uint i;
	byte bFirst=0;
	byte bSecond=0;
	byte bThree=0;
	if((iAddr&0x007f)==0){
		bSecond=iPaNeNum/128;
		bThree=iPaNeNum%128;
	}	
	else{
		bFirst=(byte)(iAddr&0x00ff);
		if(bFirst<0x80)
			bFirst=0x80-bFirst;
		else
			bFirst=(byte)(0x100-bFirst);
		i=iPaNeNum;
		if(i>bFirst){
			bSecond=(byte)((i-bFirst)/128);
			bThree=(byte)((i-bFirst)%128);
		}
		else
			bFirst=i;					
	}
	i=0;
	while(bFirst!=0){
		WriteData(1,iAddr,bFirst,&aDataBuf[i]);
		iAddr+=bFirst;
		i+=bFirst;
		bFirst=0;
	}
	while(bSecond!=0){
		WriteData(1,iAddr,128,&aDataBuf[i]);
		iAddr+=128;
		i+=128;
		--bSecond;
	}
	while(bThree!=0){
		WriteData(1,iAddr,bThree,&aDataBuf[i]);
		bThree=0;
	}
}
// End function: GeneralWriteData()

/******************************************************************
 *
 *		函	数: GeneralReadData()			
 *		功	能: 从FLASH中读出由bPaBuf,bNeBuf指定的数据
 *				缓冲到aBuf[]中.
 *
 ******************************************************************/
void GeneralReadData(byte bPage,uint sAddr,uint iLen,byte *aBuf)
{
	byte bTemp;
	uint i;
	for(i=0;i<iLen;i++,sAddr++){
		Page(bPage);
		bTemp=XBYTE[sAddr];
		Page(5);
		aBuf[i]=bTemp;
	}
}
// End function: GeneralReadData()

/******************************************************************
 *
 *		函	数: ReadPara()			
 *		功	能: 从FLASH或RTC_RAM中读出由bLen指定的数据
 *				缓冲到aBuf[]中.bLen<256.
 *
 ******************************************************************/
void ReadData(byte bPage,uint sAddr,byte bLen,byte *aBuf)
{
	byte i,bTemp;
	for(i=0;i<bLen;i++,sAddr++){
		Page(bPage);
		bTemp=XBYTE[sAddr];
		Page(5);
		aBuf[i]=bTemp;
	}
}
// End function: ReadData()

/******************************************************************
 *
 *	函	数: AutoReadPara()			
 *	功	能: 自动读参数.根据参数代码从参数索引表中取出页面,长度,
 *			和类型,取出参数后自动转换,用Para类型返回.
 *
 ******************************************************************/
bool AutoReadPara(byte bParaCode)
{
	byte i;
	byte code *Point;
	byte xdata aBuf[6];
	byte xdata aBuf1[10];
	uint iAddr;
	Point=PARA_START;
	while(TRUE){							// 找参数代码
		if(*Point==bParaCode)
			break;
		Point+=6;			
		if(Point>=PARA_END)
			return FALSE;
	}
	Page(5);
	for(i=0;i<6;i++)
		aBuf[i]=Point[i];
	iAddr=(uint)(aBuf[3]*256)+aBuf[4];
	ReadData(aBuf[5],iAddr,aBuf[1],&aBuf1);	// 读出参数内容:
	i=aBuf[2]&0x0f;
	switch(i){
		case QUERY_BYTE:					// 字节型可查询参数
		case QUERY_BIT:						// 位寻址可查询参数
			bParaByte=aBuf1[0];
			break;
			
		case QUERY_HEX:
		case QUERY_BCD:						// 压缩BCD可查询参数
			memcpy(&aParaBuf,&aBuf1,aBuf[1]);	
			if(aBuf[1]==1)	
				bParaByte=aBuf1[0];
			break;
					
		case QUERY_INT:						// 整型可查询参数
			iParaWord=(uint)(aBuf1[0]*256)+aBuf1[1];
			break;
			
		case QUERY_LONG:					// 长整型可查询参数
			lParaLWord=(ulint)(aBuf1[0]*65536)+(ulint)(aBuf1[1]*256)+aBuf1[2];
			break;
			
		default:
			return FALSE;
	}
	return TRUE;
}
// End function: AutoReadPara()

/******************************************************************
 *
 *
 *		函	数: AutoWritePara()			
 *		功	能: 自动写参数.根据参数代码从参数索引表中取出页面,长度,
 *				和类型,将bParaByte等相应的值存入FLASH.
 *
 *
 ******************************************************************/
bool AutoWritePara(byte bParaCode)
{
	byte i;
	byte xdata aBuf[6];
	byte xdata aBuf1[10];
	uint iAddr;
	byte code *Point;
	Point=PARA_START;
	while(TRUE){
		if(bParaCode==*Point)
			break;
		Point+=6;
		if(Point>PARA_END)
			return FALSE;
	}
	for(i=0;i<6;i++,Point++)
		aBuf[i]=*Point;
	iAddr=(uint)(aBuf[3]*256)+aBuf[4];	// 计算目标地址
	i=aBuf[2]&0x0f;
	switch(i){
		case QUERY_BYTE:				// 字节型可查询参数
		case QUERY_BIT:					// 位寻址可查询参数
			aBuf1[0]=bParaByte;
			break;
		
		case QUERY_HEX:
		case QUERY_BCD:					// 压缩BCD可查询参数
			memcpy(&aBuf1,&aParaBuf,aBuf[1]);
			if(aBuf[1]==1)
				aBuf1[0]=bParaByte;
			break;
		
		case QUERY_INT:					// 整型可查询参数
			aBuf1[0]=(byte)(iParaWord/256);
			aBuf1[1]=(byte)(iParaWord%256);
			break;
			
		case QUERY_LONG:				// 长整型可查询参数
			aBuf1[0]=(byte)((lParaLWord>>16)&0xff);
			aBuf1[1]=(byte)((lParaLWord>>8)&0xff);
			aBuf1[2]=(byte)(lParaLWord&0xff);
			break;
			
		default:
			return FALSE;
	}
	WriteData(aBuf[5],iAddr,aBuf[1],&aBuf1);
	return TRUE;
}
// End function: AutoWritePara()
//
// End file: jbData.c
//

⌨️ 快捷键说明

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