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

📄 rs485.c

📁 ARM平台上的RS485通信,接受发送都使用中断方式
💻 C
📖 第 1 页 / 共 3 页
字号:
	 j++;
	}
  }
 }
 else for(i=0;i<f1/10;i++)
 	ppp[i]=*(quan+i);
}




//********************************************************************
//函数名:uint8 Alarmswitch(void)
//输入:NULL
//输出:NULL
//功能描述:报警处理,返回报警序列
//全局变量:
//********************************************************************
uint8 Alarmswitch(void)
{
	uint8 temp,i,k;
	temp=0;k=0;
	for(i=1;i<=8;i++)
	{
		if(alarmstate[i]>temp)
		{
			temp=alarmstate[i];
			k=i;	
		}
	}
	return k;	
}


//********************************************************************
//函数名:void Rs485_TapWave(uint8 TapNum)
//输入:uint8 TapNum   抱文序列
//输出:NULL
//功能描述:实时波形抱文处理
//全局变量:
//********************************************************************
void Rs485_TapWave(uint8 TapNum)
{
	uint8 m,i,j,Rs485_Crc;
	uint8 buf,temp1,buf2[4],tt[4],tempptr=0;
	int8 ttt[14]=0;
	for(i=1;i<95;i++)
		{TapAll[i]=0;}
	stateh=1;statel=1;
	for(i=0;i<12;i++)
	{
		Rs485_Ecg1[i]=0x00;
		Rs485_Ecg3[i]=0x00;
		Rs485_Ecg4[i]=0x00;	
	}
	for(i=0;i<14;i++)
	{
	if(Rs485_Ecgrp2==1200) Rs485_Ecgrp2=0;
	ttt[i]=saveecg[Rs485_Ecgrp2++];

	}
	getin(ttt,140,120);
	for(i=0;i<12;i++)
		Rs485_Ecg2[i]=ppp[i];
	for(i=0;i<14;i++)
	{
	if(Rs485_Pulrp==1200) Rs485_Pulrp=0;
	ttt[i]=saveple[Rs485_Pulrp++];

	}
	getin(ttt,140,120);
	for(i=0;i<12;i++)
		Rs485_Pul[i]=ppp[i];
	for(i=0;i<7;i++)
	{
	if(Rs485_Brearp==1200) Rs485_Brearp=0;
	ttt[i]=saverep[Rs485_Brearp++];

	}
	getin(ttt,70,60);
	for(i=0;i<6;i++)
		Rs485_Brea[i]=ppp[i];
	TapAll[3]=Rs485_Ecg1[0];tt[0]=Rs485_Ecg1[0];
	TapAll[4]=Rs485_Ecg2[0];tt[1]=Rs485_Ecg2[0];
	TapAll[5]=Rs485_Ecg3[0];tt[2]=Rs485_Ecg3[0];
	TapAll[6]=Rs485_Ecg4[0];tt[3]=Rs485_Ecg4[0];
	m=6;
	tempptr=0;
	for(i=1;i<12;i++)
	{
		tempptr++;
		buf2[0]=Rs485_Ecg1[tempptr];
		buf2[1]=Rs485_Ecg2[tempptr];
		buf2[2]=Rs485_Ecg3[tempptr];
		buf2[3]=Rs485_Ecg4[tempptr];
		for(j=0;j<4;j++)
		{
			Rs485_Dec(tt[j],buf2[j]);
			m=Rs485_DataAdd(m);
			tt[j]=buf2[j];		
		}
	}
	tempptr=0;
	temp1=Rs485_Brea[tempptr++];
	m=Rs485_DataAccr(temp1&0x0f,m);
	m=Rs485_DataAccr(((temp1>>4)&0x0f),m);
	for(i=1;i<6;i++)
	{
		buf=Rs485_Brea[tempptr++];
		Rs485_Dec(temp1,buf);
		m=Rs485_DataAdd(m);
		temp1=buf;		
	}	
	tempptr=0;
	buf=0;
	temp1=0;
	temp1=Rs485_Pul[2*tempptr++]*2;
	m=Rs485_DataAccr(temp1&0x0f,m);
	m=Rs485_DataAccr(((temp1>>4)&0x0f),m);
	for(i=1;i<6;i++)
	{
		buf=Rs485_Pul[2*tempptr++]*2;
		Rs485_Dec(temp1,buf);
		m=Rs485_DataAdd(m);
		temp1=buf;	
	}	
	TapAll[0]=ID_SIZE+9;
	TapAll[2]=TapNum;
	TapAll[1]=m;
	Rs485_Crc=0;
	for(i=0;i<TapAll[1]+1;i++)
		{Rs485_Crc+=TapAll[i];}
	TapAll[(TapAll[1]+1)]=0-Rs485_Crc;
	Rs485_BagAcc(TapAll);
}


//********************************************************************
//函数名:void Rs485_RealData(void)
//输入:NULL
//输出:NULL
//功能描述:实时数据抱文处理
//全局变量:
//********************************************************************
void Rs485_RealData(void)
{
	uint8 m=0,n=0;
	uint8 BagData[16];
	uint8 Rs485_Crc;
	n=Alarmswitch();
	switch(n)
	{
	 	case 0:m=0;break;
	 	case 1:m=12;break;
	 	case 2:m=10;break;
	 	case 3:m=9;break;
	 	case 4:m=8;break;
	 	case 5:m=7;break;
	 	case 6:m=11;break;
	 	case 7:m=6;break;
	 	case 8:m=5;break;
		default:m=0;break;
	}
	if(flag_newnibp)
		{m|=0x80;flag_newnibp=0;}
	BagData[0]=ID_SIZE+4;
	BagData[1]=DATA_SIZE+1;
	BagData[2]=m;
	BagData[3]=heartrate;
	BagData[4]=resp;
	if(-128<=stval&&stval<=127)	BagData[5]=stval+128;
	else BagData[5]=0xff;
	BagData[6]=spo2;	
	BagData[7]=pulse;
	if(temp>=200&&temp<=450)	BagData[8]=temp-200;
	else BagData[8]=0xff;
	BagData[9]=0xff;
	if(sbp>=30&&sbp<=270)	BagData[10]=sbp;
	else if(sbp<30) BagData[10]=0;
	else BagData[10]=0xff;
	if(10<=dbp&&dbp<=230)	BagData[11]=dbp;
	else if(dbp<10) BagData[11]=0;
	else BagData[11]=0xff;
	BagData[12]=mbp;
	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 printstart(void)
//输入:NULL
//输出:NULL
//功能描述:实时波形打印开始处理
//全局变量:
//********************************************************************
void printstart(void)
{
	uint16 m,i;
	int8 max,min,v;
	char crc;
	char bag[9];
	bag[0]=0x1e;
	m=2;
	bag[m++]=0x77; 
	bag[m++]=calender.year/100;
	bag[m++]=calender.year%100;
	bag[m++]=calender.mon;
	bag[m++]=calender.day;
	bag[m++]=calender.hour;
	bag[m++]=calender.min;
	if(saveep>250) i=saveep-250;
	else i=950;
	maxmin(&saveecg[i],&max,&min);
	v=(max+min)/2;
	bag[m++]=v;
	bag[1]=m-1;
	crc=0;
	for(i=1;i<m;i++)
		crc+=bag[i];	
	bag[m]=-crc;
	I2cTxdata(bag);	
	print_Ecgrp2=saveep;
	print_Pulrp=savepp;
	print_Brearp=saverp;
	print_RxBufNum=0;
	print_TxbufNum=0;
	printbusy_flag=0;
}


//********************************************************************
//函数名:void print_tap(uchar num)
//输入:uchar m  打印速度
//输出:NULL
//功能描述:波形数据打包处理
//全局变量:
//********************************************************************
void print_tap(uint8 num)
{
	char bag[50];
	int8 i,m;
	char crc=0;
	int8 ttt[24];
	bag[0]=0x1e;
	bag[2]=0x00;
	m=3;
	for(i=0;i<num;i++)
	{
		print_Ecg1[i]=0x00;
		print_Ecg3[i]=0x00;
		print_Ecg4[i]=0x00;	
	}
	for(i=0;i<14;i++)
	{
		if(print_Ecgrp2==1200) print_Ecgrp2=0;
		ttt[i]=saveecg[print_Ecgrp2++];
	}
	getin(ttt,140,num*10);
	for(i=0;i<num;i++)
		bag[m++]=ppp[i];
	for(i=0;i<14;i++)
	{
		if(print_Pulrp==1200) print_Pulrp=0;
		ttt[i]=saveple[print_Pulrp++];
	}
	getin(ttt,140,num*10);
	for(i=0;i<num;i++)
		bag[m++]=ppp[i];
	for(i=0;i<7;i++)
	{
		if(print_Brearp==1200) print_Brearp=0;
		ttt[i]=saverep[print_Brearp++];
	}
	getin(ttt,70,10*num);
	for(i=0;i<num;i++)
		bag[m++]=ppp[i];
	bag[1]=m-1;
	for(i=1;i<m;i++)
		crc+=bag[i];
	bag[m]=-crc;
	I2cTxdata(bag);
}

//********************************************************************
//函数名:void print_alarmtap(uint8 num)
//输入:uint8 num  报警序列
//输出:NULL
//功能描述:报警打印处理
//全局变量:
//********************************************************************
void print_alarmtap(uint8 num)
{
	int8 m,i;
	char crc=0;
	char bag[25];
	bag[0]=0x1e;
	//if(!num&0x10)	
//	bag[2]=0xc0;
	//else 
	bag[2]=0xc0;//+(((char)(setpara.reinforce)<<2)&0xc)+((char)(setpara.speed)&0x3);
	bag[3]=num;
	m=4;
	bag[m++]=calender.year/100;
	bag[m++]=calender.year%100;
	bag[m++]=calender.mon;
	bag[m++]=calender.day;
	bag[m++]=calender.hour;
	bag[m++]=calender.min;
	bag[m++]=heartrate;
	bag[m++]=resp;
	if(-128<=stval&&stval<=127)	bag[m++]=stval;
	else bag[m++]=0xff;
	bag[m++]=spo2;	
	bag[m++]=pulse;
	if(temp>=200&&temp<=450)	bag[m++]=temp-200;
	else bag[m++]=0xff;
	bag[m++]=0xff;
	if(sbp>=30&&sbp<=270)	bag[m++]=sbp-30;
	else if(sbp<30) bag[m++]=0;
	else bag[m++]=0xff;
	if(10<=dbp&&dbp<=230)	bag[m++]=dbp-10;
	else if(dbp<10) bag[m++]=0;
	else bag[m++]=0xff;
	bag[m++]=0xff;
	bag[1]=m-1;
	for(i=1;i<m;i++)
		crc+=bag[i];
	bag[m]=-crc;
	I2cTxdata(bag);	
}

//********************************************************************
//函数名:void print_timetap(uint8 num)
//输入:NULL
//输出:NULL
//功能描述:定时数据打印处理
//全局变量:
//********************************************************************
void print_timetap(uint8 num)
{
	uint16 m,i;
	int8 max,min,v;
	char crc=0;
	char bag[25];
	bag[0]=0x1e;
	if(setpara.content==1) 
	bag[2]=0x90+(((char)(setpara.reinforce)<<2)&0xc)+((char)(setpara.speed)&0x3);
	else bag[2]=0x80+(((char)(setpara.reinforce)<<2)&0xc)+((char)(setpara.speed)&0x3);
	bag[3]=num+0x80;
	m=4;
	bag[m++]=calender.year/100;
	bag[m++]=calender.year%100;
	bag[m++]=calender.mon;
	bag[m++]=calender.day;
	bag[m++]=calender.hour;
	bag[m++]=calender.min;
	bag[m++]=heartrate;
	bag[m++]=resp;
	if(-128<=stval&&stval<=127)	bag[m++]=stval;
	else bag[m++]=0xff;
	bag[m++]=spo2;	
	bag[m++]=pulse;
	if(temp>=200&&temp<=450)	bag[m++]=temp-200;
	else bag[m++]=0xff;
	bag[m++]=0xff;
	if(sbp>=30&&sbp<=270)	bag[m++]=sbp-30;
	else if(sbp<30) bag[m++]=0;
	else bag[m++]=0xff;
	if(10<=dbp&&dbp<=230)	bag[m++]=dbp-10;
	else if(dbp<10) bag[m++]=0;
	else bag[m++]=0xff;
	bag[m++]=0xff;
	if(saveep>250) i=saveep-250;
	else i=950;
	maxmin(&saveecg[i],&max,&min);
	v=(max+min)/2;
	bag[m++]=v;
	bag[1]=m-1;
	for(i=1;i<m;i++)
		crc+=bag[i];
	bag[m]=-crc;
	I2cTxdata(bag);	
}





//********************************************************************
//函数名:void print_timewave(void)
//输入:NULL
//输出:NULL
//功能描述:定时波形打印开始处理
//全局变量:
//********************************************************************
void print_timewave(void)
{
	char bag[155];
	int8 i,m,n;
	char crc=0;
	int8 ttt[50];
	bag[0]=0x1e;
	bag[2]=0xb0;
	switch((char)(setpara.speed))
	{
		case 0:n=12;break;
		case 1:n=24;break;
		case 2:n=48;break;
	}
	m=3;
	for(i=0;i<n;i++)
	{
		print_Ecg1[i]=0x00;
		print_Ecg3[i]=0x00;
		print_Ecg4[i]=0x00;	
	}
	for(i=0;i<14;i++)
	{
		if(print_Ecgrp2==1200) print_Ecgrp2=0;
		ttt[i]=saveecg[print_Ecgrp2++];
	}
	getin(ttt,140,10*n);
	for(i=0;i<n;i++)
		bag[m++]=ppp[i];
	for(i=0;i<14;i++)
	{
		if(print_Pulrp==1200) print_Pulrp=0;
		ttt[i]=saveple[print_Pulrp++];
	}
	getin(ttt,140,10*n);
	for(i=0;i<n;i++)
		bag[m++]=ppp[i];
	for(i=0;i<7;i++)
	{
		if(print_Brearp==1200) print_Brearp=0;
		ttt[i]=saverep[print_Brearp++];
	}	
	getin(ttt,70,10*n);
	for(i=0;i<n;i++)
		bag[m++]=ppp[i];	
	bag[1]=m-1;
	for(i=1;i<m;i++)
		crc+=bag[i];
	bag[m]=-crc;
	I2cTxdata(bag);
}



//********************************************************************
//函数名:void maxmin(int8 *data,int8 *max,int8 *min)
//输入:int8 *data,int8 *a,int8 *b   数据串地址,最大最小值存储地址
//输出:NULL
//功能描述:在一串数据中找出最大和最小值
//全局变量:
//********************************************************************
void maxmin(int8 *data,int8 *max,int8 *min)
{
 uint8 i;
 *max=*data;
 *min=*data;
 for(i=0;i<250;i++)
 {
 if(*(data+i)>*max) *max=*(data+i);
 if(*(data+i)<*min) *min=*(data+i);
 }
}



//********************************************************************
//函数名:void printpro(void)
//输入:NULL
//输出:NULL
//功能描述:与打印机转接板通信的一个历程,在住函数中调用
//全局变量:
//********************************************************************
void print_pro(void)
{	
	int8 n,m;	
	if(flag_print&&!printbusy_flag) 		//实时打印处理
	{
	if(((saveep>(14+print_Ecgrp2))||(print_Ecgrp2<(saveep+1186)&&print_Ecgrp2>saveep))&&((savepp>(14+print_Pulrp))||(print_Pulrp<(savepp+1186)&&print_Pulrp>savepp))&&((saverp>(7+print_Brearp))||(print_Brearp<(saverp+1193)&&print_Brearp>saverp)))
	   	print_tap(12);
	}

	n=Alarmswitch();				//判是否有报警
	switch(n)
	{
		case 1:m=12;break;
 		case 2:m=10;break;
 		case 3:m=9;break;
 		case 4:m=8;break;
 		case 5:m=7;break;
 		case 6:m=11;break;
 		case 7:m=6;break;
 		case 8:m=5;break;
		default:m=0;break;
	}
	if(!alarmitem) {printalarm_flag=0;printalarmstate=0;}
	if(setpara.alarm&&(n&&!printalarm_flag||alarmitem>printalarmstate)&&!printbusy_flag)
		{
												//发送报警数据
			print_alarmtap(m);
			printalarm_flag=1;
			printalarmstate=alarmitem;
		}

	if(setpara.time&&!flag_print&&!flag_timeprint&&!printbusy_flag)				//定时打印数据处理
		{	
		
			if(calender.hour*60+calender.min-printlasttime==setpara.timelong||24*60-printlasttime+calender.hour*60+calender.min==setpara.timelong)
			{
//			if(!setpara.content) print_alarmtap(m);
//			else 
			print_timetap(m);			
			printlasttime=calender.hour*60+calender.min;
			if(setpara.content)
				{    
				flag_timeprint=1;
				print_Ecgrp2=saveep;
				print_Pulrp=savepp;
				print_Brearp=saverp;
				timeprintcount=0;
				switch((char)(setpara.speed))
				{
				case 0:timecount=40;
				case 1:timecount=80;
		//		case 2:timecount=100;
				}
				time=0;
				}
			}		
		}

	if(flag_timeprint&&!printbusy_flag&&timeprintcount>=timecount)
		{		
		if(((saveep>(14+print_Ecgrp2))||(print_Ecgrp2<(saveep+1186)&&print_Ecgrp2>saveep))&&((savepp>(14+print_Pulrp))||(print_Pulrp<(savepp+1186)&&print_Pulrp>savepp))&&((saverp>(7+print_Brearp))||(print_Brearp<(saverp+1193)&&print_Brearp>saverp)))
			{print_timewave();time++;timeprintcount=0;}
		if(time==100) flag_timeprint=0;	
		}
	
}

⌨️ 快捷键说明

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