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

📄 rs485.c

📁 ARM平台上的RS485通信,接受发送都使用中断方式
💻 C
📖 第 1 页 / 共 3 页
字号:
	m=Rs485_DataAccr(tt&0x0f,m);
	m=Rs485_DataAccr(((tt>>4)&0x0f),m);
	for(i=1;i<6;i++)
	{
		{
			if(bbptr==180) bbptr=0;
			buf2=(*(head+bbptr))/4;
			bbptr++;
		}
		Rs485_Dec(tt,buf2);
		m=Rs485_DataAdd(m);
		tt=buf2;		
	}	
	return m;

}

//***************************************************************
//函数名:uint8 TapPul(uint8 tnum,uint8 num)
//输入:uint8 num 
//输出:uint8 num
//功能描述:脉搏播数据打包(demo数据)
//全局变量:
//***************************************************************
uint8 TapPul(uint8 tnum,uint8 num)
{
	uint8 *head,pp[180];
	uint8 i,m;
	uint8 buf2,tt;
	head=(uint8 *)(0xc000000+0x3f000+360);
      	for(i=0;i<90;i++)
		pp[i]=*(head+i);
	m=num;
	if(ppptr==45) ppptr=0;
	tt=pp[2*ppptr];
	ppptr++;
	m=Rs485_DataAccr(tt&0x0f,m);
	m=Rs485_DataAccr(((tt>>4)&0x0f),m);
	for(i=1;i<6;i++)
	{
	if(ppptr==45) ppptr=0;
		{
			buf2=pp[2*ppptr];
			ppptr++;
		}
		Rs485_Dec(tt,buf2);
		m=Rs485_DataAdd(m);
		tt=buf2;		
	}
	return m;
}



//*****************************************************************
//** 函数名:void Rs485_BagHalfFirst(void)   
//** 输 入:
//**        
//** 输 出: Null
//** 功能描述:抱文头处理
//** 全局变量:uint8
//*****************************************************************

uint8 Rs485_BagHalfFirst(void)
{	
	uint8 k;
	k=0;
	k=ID_SIZE;
	return (k&0xf0);
}





//*****************************************************************
//** 函数名:void Rs485_TapNull(void)   
//** 输 入:
//**        
//** 输 出: Null
//** 功能描述:空数据抱文
//** 全局变量:Null
//*****************************************************************



void Rs485_TapNull(uint8 BagNull[3])
{
	uint8 Rs485_Crc;
	BagNull[0]=ID_SIZE;
	BagNull[1]=1;
	Rs485_Crc=1+ID_SIZE;
	BagNull[2]=-Rs485_Crc;
	
}




//*****************************************************************
//** 函数名:void Rs485_TapConf(void)   
//** 输 入:
//**        
//** 输 出: Null
//** 功能描述:配置抱文
//** 全局变量:Null                   暂时没有使用
//*****************************************************************
void Rs485_TapConf(void)
{
	uint8 m=0;
	uint8 Rs485_Crc;
	uint8 BagConf[13];
	BagConf[0]=ID_SIZE+1;
	BagConf[1]=CONF_SIZE+1;
	BagConf[2]=1;
	BagConf[3]=0xfe;
	BagConf[4]=0x00;
	BagConf[5]=0x00;
	BagConf[6]=0x00;
	BagConf[7]=0x00;
	BagConf[8]=0x00;
	BagConf[9]=0x00;
	BagConf[10]=0x00;
	Rs485_Crc=0;
	for(m=0;m<11;m++)
	{
		Rs485_Crc+=BagConf[m];
	}
	BagConf[11]=0-Rs485_Crc;
	BagConf[12]=0;
	Rs485_BagAcc(BagConf);
}






//*****************************************************************
//** 函数名:void Rs485_TapHeart()   
//** 输 入:
//**        
//** 输 出: Null
//** 功能描述:心电波行抱文
//** 全局变量:Null
//*****************************************************************
/*void Rs485_TapHeart(uint8 TapNum)
{

	uint8 BagHeart[75];
	uint8 *BagStart;
	uint8 m,i,Rs485_Crc;
	uint8 length=48;
	BagHeart[0]=ID_SIZE+2;
	BagHeart[2]=TapNum;
//	m=TapHeart(TapNum);
	Rs485_Crc=0;
	for(i=0;i<m;i++)
	{
		Rs485_Crc+=BagHeart[i];
	}
	Rs485_Crc-=TapNum;
	BagHeart[m]=0-Rs485_Crc;

	Rs485_BagAcc(BagHeart);	
	
}*/




//*****************************************************************
//** 函数名:void Rs485_TapOther()   
//** 输 入:
//**        
//** 输 出: Null
//** 功能描述:其他波形抱文
//** 全局变量:Null
//*****************************************************************
/*void Rs485_TapOther(uint8 TapNum)
{
	uint8 BagOther[48];
	uint8 *BagStart;
	//uint8 *BagEnd;
	uint8 m,i,Rs485_Crc;
	uint8 length=48;
	m=Rs485_BagHalfFirst();
	m|=3;
	BagOther[0]=m;
	BagOther[2]=TapNum;
	Rs485_DataOpen(BagStart);	
	//BagOther[1]=Rs485_BagRar(BagStart,BagEnd,length)+1;
	m=3;
	while(*BagEnd)
	{
		BagOther[m]=*BagEnd;
		m++;
		BagEnd++;	
	}
	Rs485_Crc=0;
	for(i=0;i<m;i++)
	{
		Rs485_Crc+=BagOther[i];
	}
	Rs485_Crc-=TapNum;
	BagOther[m]=0-Rs485_Crc;
	BagOther[m+1]=0;
	Rs485_BagAcc(BagOther);	

}
*/

//*****************************************************************
//** 函数名:void Rs485_TapData()   
//** 输 入:
//**        
//** 输 出: Null
//** 功能描述:打数据抱文
//** 全局变量:Null
//*****************************************************************
void Rs485_TapData(void)
{
	uint8 m=0;
	uint8 BagData[16];
	uint8 Rs485_Crc;
	BagData[0]=ID_SIZE+4;
	BagData[1]=DATA_SIZE+1;
	BagData[2]=0x80;
	BagData[3]=80+10*sin(rand());
	BagData[4]=25+5*sin(rand());
	BagData[5]=20+10*sin(rand());
	BagData[6]=95+5*sin(rand());	
	BagData[7]=BagData[3];	
	BagData[8]=38+2*sin(rand());
	BagData[9]=38+2*sin(rand());
	BagData[10]=120+10*sin(rand());
	BagData[11]=80+10*sin(rand());
	BagData[12]=BagData[10]-BagData[11];
	BagData[13]=0xff;
	Rs485_Crc=0;
	for(m=0;m<14;m++)
	{
		Rs485_Crc+=BagData[m];
	}
	BagData[14]=0-Rs485_Crc;
	BagData[15]=0;
	Rs485_BagAcc(BagData);
}




//*****************************************************************
//** 函数名:void Rs485_TapSet()   
//** 输 入:
//**        
//** 输 出: Null
//** 功能描述:打设置抱文
//** 全局变量:Null
//*****************************************************************
void Rs485_TapSet(void)
{
	uint8 k;
	uint8 BagSet[12];
	uint8 Rs485_Crc;
	BagSet[0]=ID_SIZE+5;
	BagSet[1]=SET_SIZE+1;
	for(k=2;k<10;k++)
	{
		BagSet[k]=50+20*sin(rand());
	}
	Rs485_Crc=0;
	for(k=0;k<10;k++)
	{
		Rs485_Crc+=BagSet[k];
	}
	BagSet[10]=0-Rs485_Crc;
	Rs485_BagAcc(BagSet);
}






//*****************************************************************
//** 函数名:void Rs485_TapAll()   
//** 输 入:
//**        
//** 输 出: Null
//** 功能描述:打合并波形抱文(demo数据)
//** 全局变量:Null
//*****************************************************************
void Rs485_TapAll(uint8 TapNum)
{
	uint8 m,i,Rs485_Crc;
	for(i=1;i<95;i++)
		{TapAll[i]=0;}
	stateh=statel=1;
	TapAll[0]=ID_SIZE+9;
	TapAll[2]=TapNum;
	m=TapHeart(TapNum);
	m=TapBrea(TapNum,m);
	TapAll[1]=TapPul(TapNum,m);
	Rs485_Crc=0;
	for(i=0;i<TapAll[1]+1;i++)
		{Rs485_Crc+=TapAll[i];}
	TapAll[(TapAll[1]+1)]=-Rs485_Crc;
	Rs485_BagAcc(TapAll);
}

//********************************************************************
//函数名:void Rs485_WaitComm(void)
//输入:NULL
//输出:NULL
//功能描述:对中央太通信命令进行处理
//全局变量:Rs485_CommData,Rs485_RxByte,Rs485_State
//********************************************************************
void Rs485_WaitComm(void)
{
	uint8 b;
	uint8 TapNull[3];
	b=Rs485_RxByte;
		if(0==(b&0xf0)||(b&0xf0)==ID_SIZE)
		{
		switch (b&0x0f)
		{	 
			case 0		:break;
			case 2		:
					 if(Rs485_State==RS485_Offline) {Rs485_Reset();}						
				 	 else	{	
						Rs485_DataState();
						Rs485_RecToSend();						
					 	Rs485_State=RS485_Wait;
						Rs485_TxString=&b;
						Rs485_TxNum=1;
						while(!(rUTRSTAT1 & 0x4)); 
						rINTMSK &= ~BIT_UTXD1;
						}
					 Rs485_Last=Rs485_RxByte;
					 Rs485_RxByte=0x00;
					 break;
			 case 3		:
					 if(Rs485_State==RS485_Wait)
					{
					 Rs485_DataState();
			 		 Rs485_RecToSend();					 
					 if(Rs485_Last==0x12&&Rs485_ReSendTime%2==1&&Rs485_ReSendTime<6)
						{
							Rs485_TxString=Rs485_ReData;
							Rs485_TxNum=Rs485_ReData[1]+2;
							while(!(rUTRSTAT1 & 0x4)); 
							rINTMSK &= ~BIT_UTXD1;
							Rs485_ReSendTime++;
						}
					 else 
					{
						if(Rs485_TxbufNum==Rs485_RxBufNum)
						{
	 						Rs485_TapNull(TapNull);	
							Rs485_TxString=TapNull;
							Rs485_TxNum=TapNull[1]+2;
							while(!(rUTRSTAT1 & 0x4)); 
							rINTMSK &= ~BIT_UTXD1;
							Rs485_ReData[0]=TapNull[0];
							Rs485_ReData[1]=TapNull[1];
							Rs485_ReData[2]=TapNull[2];
							Rs485_ReSendTime=0;
						}
						 else {Rs485_SendOneBag();}
					 }
					 Rs485_Last=Rs485_RxByte;
					 Rs485_RxByte=0x00;
					}				
					else	{Rs485_Reset();}
					break;
			 case 4		:
			 		 if(Rs485_State==RS485_Wait)
					 {
					 Rs485_DataState();					 
					 Rs485_RecToSend();
					 Rs485_ReStart();
					 Rs485_Last=Rs485_RxByte;
					 Rs485_RxByte=0x00;	
					 }
					 else {Rs485_Reset();}		
					 Rs485_RxByte=0x00;
					 break;			
			case 5		:Rs485_Rtc();
					 break;
			case 9		:
			 		 Rs485_Reset();break;
			 default	:Rs485_Reset();break;	
		}
		}
}


//********************************************************************************
//函数名:void Rs485_CommDataInt(void)
//输入:NULL
//输出:NULL
//功能描述:发送接收缓冲区清0
//全局变量:
//*******************************************************************************
void Rs485_CommDataInt(void)
{
	uint8 i,j;
	for(i=0;i<Rs485_Buffer_Size;i++)
	{Rs485_RxPtr[i]=0;}
	for(i=0;i<Rs485_TxBuf_Size;i++)
		for(j=0;j<95;j++)
			{Rs485_Txbuffer[i][j]=0;}
	Rs485_RxByte=0x00;
}



//********************************************************************
//函数名:void Rs485_SendEnable(void)
//输入:NULL
//输出:NULL
//功能描述:使能RS485发送
//全局变量:
//********************************************************************
void Rs485_SendEnable(void)
{
	rUMCON1|=1;
}








//********************************************************************
//函数名:void Rs485_SendDisable(void)
//输入:NULL
//输出:NULL
//功能描述:禁止Rs485发送
//全局变量:
//********************************************************************
void Rs485_SendDisable(void)
{
	rUMCON1&=0xfe;
}




//********************************************************************
//函数名:void Rs485_RecToSend(void))
//输入:NULL
//输出:NULL
//功能描述:Rs485接受状态转为发送状态
//全局变量:
//********************************************************************

void Rs485_RecToSend(void)
{

	while(!(rUTRSTAT1&0x2));       
	Rs485_SendEnable();
	msc_wait(3000);

}





//********************************************************************
//函数名:void Rs485_SendToRec(void)
//输入:NULL
//输出:NULL
//功能描述:Rs485发送状态转为接收状态
//全局变量:
//********************************************************************

void Rs485_SendToRec(void)
{ 	uint8 m;

	m=RdURXH1();
	while(!(rUTRSTAT1&0x4));
	Rs485_SendDisable();
	msc_wait(1000);

}




//********************************************************************
//函数名:void Rs485_Pro(void)
//输入:NULL
//输出:NULL
//功能描述:Rs485通信的一个历程,在住函数中调用(包括打印机的历程)
//全局变量:
//********************************************************************

void Rs485_Pro(void)
{       
	if(setpara.mode)		//发送实时数据的处理
	{
		if(((saveep>(14+Rs485_Ecgrp2))||(Rs485_Ecgrp2<(saveep+1186)&&Rs485_Ecgrp2>saveep))&&((savepp>(14+Rs485_Pulrp))||(Rs485_Pulrp<(savepp+1186)&&Rs485_Pulrp>savepp))&&((saverp>(7+Rs485_Brearp))||(Rs485_Brearp<(saverp+1193)&&Rs485_Brearp>saverp)))
		{	Rs485_TapWave(realnum++);}
		if(bagflag==1&&t1mcount==9) {Rs485_RealData();bagflag=0;}
	}	
	else				//发送demo的处理
	{
	 if(bagflag==1)
	 {
		if(t1mcount==9) 
		{Rs485_TapData();}
		Rs485_TapAll(t100mscount);
		bagflag=0;
	 }
	}
}








//********************************************************************
//函数名:void getin(int8 *quan, uint8 f1,uint8 f2)
//输入:int8 *quan数据串, uint8 f1原频率,uint8 f2现频率
//输出:NULL
//功能描述:插补算法
//全局变量:
//********************************************************************
void getin(int8 *quan, uint8 f1,uint8 f2)
{
 uint8 i=0,j=0;
 int16 k=0;
 if(f2>f1) f2+=10;
 k=f1-f2;
 if(f1!=f2)
 {
 for(i=0;i<(f1/10);i++)
  {
   k=k+f2;
   while(k>=f1)
	{
	 k=k-f1;
	 ppp[j]=*(quan+i)-(k*(*(quan+i)-*(quan+i-1)))/f2;

⌨️ 快捷键说明

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