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

📄 uart_com.c

📁 HX-87 GPS模块协议转换程序
💻 C
字号:
#include"GLOBLE.H"
UBYTE8		gcv_arr_buff[80];//={"$GPRMC,024110.629,A,3115.4365,N,12036.1465,E,0.00,,130606,,,A*7B" };
UBYTE8		gcv_r_len_buff=0;
UBYTE8		gcv_uart_complete=0;
UBYTE8		gcv_sbuff_tmp=0;
UBYTE8		gcv_check_right_flg=0;
UBYTE8		gcv_coma_num=0;
UBYTE8		gcv_copy_num=0;
UBYTE8		gcv_string_select=0;
UBYTE8		gcv_send_buff_count=0;
UBYTE8		gcv_receive_flg=0;

UBYTE8		gcv_tmp1=0;
UBYTE8		gcv_tmp2=0;
UBYTE8		gcv_tmp3=0;
ULONG32	gfv_digit_arr_latitude[5]={0,0,0,0,0};
ULONG32	gfv_digit_arr_longitude[5]={0,0,0,0,0};
typedef  union send_buff
{
	struct
		{
			UBYTE8   	head;
			WordType	addr;
			UBYTE8	coma0;
			WordType	hour;
			WordType	min;
			WordType	second;
			UBYTE8		coma1;
			//UBYTE8		n_s;
			//UBYTE8		coma2;
			UBYTE8		latitude[9];
			UBYTE8		coma2;
			UBYTE8		n_s;
			UBYTE8		coma3;
			UBYTE8		longitude[10];
			UBYTE8		coma4;
			UBYTE8		w_e;
			UBYTE8		coma5;
			WordType	fram_check;
			WordType	fram_tail;
		}Fram_data;
	UBYTE8	send_arr[40];
}send_buff ;
	
send_buff guv_send_buff;

//---------------------------------------------------------

void UART_COM_Send_byte(unsigned char massage)    //发送一个字节
{
	SBUF=massage;
	while(TI==0);
	TI=0;
}


void UART_COM_Uart_INT () interrupt 4 using 2
{
	#if 0
	if(RI)
		{
			gcv_sbuff_tmp=SBUF;
			RI=0;
			if(gcv_r_len_buff>=80)
				gcv_r_len_buff=0;
			
			if(gcv_sbuff_tmp=='$')                    			 //接收到帧头
				{
					gcv_r_len_buff=0;					//接收长度清零
				}
			
			gcv_arr_buff[gcv_r_len_buff]=gcv_sbuff_tmp;	//将数据放入缓存中
			gcv_sbuff_tmp=0;
		
				//判断是否接收到帧尾
			if((gcv_arr_buff[gcv_r_len_buff-1]==0x0d)&&(gcv_arr_buff[gcv_r_len_buff]==0x0a))   
				{
					gcv_uart_complete=1;         		//接收完成
				//	gcv_tmp3=gcv_r_len_buff+1;
					ES=0;
				}
				
			gcv_r_len_buff++;					//帧长度计算
		}	
	#endif
	
	if(RI)
		{
		gcv_sbuff_tmp=SBUF;
		
		if(gcv_sbuff_tmp=='$')                     //接收到":"
				{
					gcv_r_len_buff=0;
					gcv_receive_flg=1;
				}
			if(gcv_receive_flg)
				{
			
					gcv_arr_buff[gcv_r_len_buff]=gcv_sbuff_tmp;
			
					if((gcv_arr_buff[gcv_r_len_buff-1]==0x0d)&&(gcv_arr_buff[gcv_r_len_buff]==0x0a))   
						{
							gcv_uart_complete=1;         		//接收完成
							gcv_receive_flg=0;
							ES=0;
						}
					gcv_r_len_buff++;	
				}
			RI=0;
			}
	
			
}

 /*--------------------------------------------------------------------------------------
                                                                   ASC-HEX
 ----------------------------------------------------------------------------------------*/
unsigned char UART_COM_Asc_hex(unsigned char in)
{
 	unsigned char out;
 	if (in<(0x40))      //每一位转化成16进制
       	out=in-0x30;
       else   
	   	out=in-0x37;
	   
	return (out);
	      
}
 /*---------------------------------------------------------------------------------------
                                                           组合
 -----------------------------------------------------------------------------------------*/
unsigned char UART_COM_Combination(unsigned char value_H, unsigned char value_L)
 	{
 		unsigned char value_out;
		value_out=(value_H<<4)+value_L;
		return value_out;
 	}

 /*---------------------------------------------------------------------------
                                 转ASCII                                                                                
--------------------------------------------------------------------------*/
unsigned char  UART_COM_hex_asc(unsigned char in)
{
	unsigned char out;

	if(in<0x0a)
	out=in+48;
	else out=in+55;

	return out;
}
/*--------------------------------------------------------------*/
/*                                    高位地位分离                                         */
/*----------------------------------------------------------------*/
unsigned char  UART_COM_Caculate_H(unsigned char value_h)//
{
    unsigned char i;
	i=value_h;
	i=i>>4;
	i=i&0x0f;
		
	return i;
}
unsigned char UART_COM_Caculate_L(unsigned char value_l)
{
	unsigned char j;
	j=value_l;
	j=j&0x0f;
	return j;
}
//---------------------------------------------------------
void UART_COM_Fill_send_buf(ULONG32 fill_data, UBYTE8 bit_num,UBYTE8 *fill_arr)
{
	UBYTE8 lcv_fill_tmp,i;
	UBYTE8	*lcv_pfill_arr;
	UBYTE8	lcv_count;
	lcv_pfill_arr=&fill_arr[bit_num-1];
	i=0;
	//while(fill_data>0)
	for(lcv_count=0;lcv_count<bit_num;lcv_count++)
		{
			if(i==4)
				{
					*lcv_pfill_arr='.';
					i++;
					lcv_pfill_arr--;
					continue;
				}
			lcv_fill_tmp=fill_data%10;
			*lcv_pfill_arr=UART_COM_hex_asc(lcv_fill_tmp);
			fill_data=(fill_data-lcv_fill_tmp)/10;
			lcv_pfill_arr--;
			i++;
		}


}

ULONG32 UART_COM_digit_filer(ULONG32 *digit_arr,ULONG32 new_data)
{
	ULONG32 *lfv_pdigit_arr;
	UBYTE8 lcv_count;
	ULONG32 llv_caculate_tmp;
	ULONG32 llv_res_tmp;
	lfv_pdigit_arr=digit_arr;
	llv_caculate_tmp=0;
	for(lcv_count=0 ;lcv_count<DIGIT_FILER_ARR_NUM-1;lcv_count++)    
		lfv_pdigit_arr[lcv_count]=lfv_pdigit_arr[lcv_count+1];
	lfv_pdigit_arr[lcv_count]=new_data;


 
	for(lcv_count=0;lcv_count<DIGIT_FILER_ARR_NUM;lcv_count++)
	{				
		llv_caculate_tmp+=lfv_pdigit_arr[lcv_count];
	}

 	llv_res_tmp=llv_caculate_tmp/DIGIT_FILER_ARR_NUM;

	return(llv_res_tmp);


}

void UART_COM_Send_buff_anlyse(UBYTE8 *Send_arr, UBYTE8 arr_num, ULONG32 *digit_filter_arr)
{
	UBYTE8 *lcv_parr;
	UBYTE8 	lcv_Send_arr_num;
	UBYTE8	lcv_count;
	ULONG32 llv_unit;
	UWORD16	lfv_send_data_integer=0,lfv_send_data_decimal=0;
	ULONG32	lfv_send_data;
	
	
	lcv_Send_arr_num=arr_num-6;
	llv_unit=1;
	lcv_parr=&Send_arr[lcv_Send_arr_num];
	lfv_send_data_integer=0;
	
	for(lcv_count=0;lcv_count<=lcv_Send_arr_num;lcv_count++)	//取浮点数的整数部分
		{
			lfv_send_data_integer+=llv_unit*UART_COM_Asc_hex(*lcv_parr);
			lcv_parr--;
			llv_unit*=10;
		}
	
	lcv_parr=&Send_arr[arr_num-1];
	llv_unit=1;

	for(lcv_count=(lcv_Send_arr_num+2);lcv_count<arr_num;lcv_count++)	//取浮点数的小数部分
		{
			lfv_send_data_decimal+=llv_unit*UART_COM_Asc_hex(*lcv_parr);
			lcv_parr--;
			llv_unit*=10;
		}
	
	lfv_send_data=((ULONG32)lfv_send_data_integer)*10000+lfv_send_data_decimal;
	lfv_send_data=UART_COM_digit_filer(digit_filter_arr,lfv_send_data);
	UART_COM_Fill_send_buf(lfv_send_data,arr_num,Send_arr);
	


}

//------------------------------------------------------
UBYTE8 UART_COM_Check_sum(UBYTE8 * data_buff_addr)
{
	UBYTE8	lcv_check_sum_tmp;
	UBYTE8	lcv_count;
	UBYTE8	lcv_check_sum;
	lcv_check_sum_tmp=data_buff_addr[1];
	
	for(lcv_count=2;lcv_count<(gcv_r_len_buff-UART_CHECK_END);lcv_count++)
		{
			lcv_check_sum_tmp^=data_buff_addr[lcv_count];
		}
	
	lcv_check_sum=UART_COM_Combination(UART_COM_Asc_hex(data_buff_addr[gcv_r_len_buff-5]),\
										      UART_COM_Asc_hex(data_buff_addr[gcv_r_len_buff-4]));
	
	if(lcv_check_sum==lcv_check_sum_tmp)		//调试注销
		return(1);
	else 
		return(0);
	

}


UWORD16 UART_COM_LRC()
{
	UBYTE8 lcv_lrcsum=0;
	UBYTE8 lcv_lrcsum_count;
	WordType lcv_lrcsum_asc;
	for(lcv_lrcsum_count=1;lcv_lrcsum_count<36;lcv_lrcsum_count++)
		{
		lcv_lrcsum+=guv_send_buff.send_arr[lcv_lrcsum_count];
		}
	lcv_lrcsum=0-lcv_lrcsum;
	lcv_lrcsum_asc.bytes.bh=UART_COM_hex_asc(UART_COM_Caculate_H(lcv_lrcsum));
	lcv_lrcsum_asc.bytes.bl=UART_COM_hex_asc(UART_COM_Caculate_L(lcv_lrcsum));
	return(lcv_lrcsum_asc.wd);
}

void	UART_COM_Sendfram()
{
	UBYTE8	lcv_hour_tmp;
	UBYTE8	lcv_send_count;

	lcv_hour_tmp=UART_COM_Combination(UART_COM_Asc_hex(guv_send_buff.Fram_data.hour.bytes.bh),
										   UART_COM_Asc_hex(guv_send_buff.Fram_data.hour.bytes.bl)	);
	lcv_hour_tmp+=8;
	if(lcv_hour_tmp>=24)
		lcv_hour_tmp=lcv_hour_tmp-24;
	guv_send_buff.Fram_data.hour.bytes.bh=UART_COM_hex_asc(lcv_hour_tmp/10);
	guv_send_buff.Fram_data.hour.bytes.bl=UART_COM_hex_asc(lcv_hour_tmp%10);
	guv_send_buff.Fram_data.head=':';
	guv_send_buff.Fram_data.addr.bytes.bh=0x30;
	guv_send_buff.Fram_data.addr.bytes.bl=0x31;
	guv_send_buff.Fram_data.coma0=',';
	guv_send_buff.Fram_data.fram_check.wd=UART_COM_LRC();
	guv_send_buff.Fram_data.fram_tail.bytes.bh=0x0d;
	guv_send_buff.Fram_data.fram_tail.bytes.bl=0x0a;
	for(lcv_send_count=0;lcv_send_count<40;lcv_send_count++)
		UART_COM_Send_byte(guv_send_buff.send_arr[lcv_send_count]);
}	

void UART_COM_Analyse()
{
	UBYTE8	*lcv_pbuff_arr;
	UBYTE8	*lcv_psend_arr;
	UBYTE8	  lcv_num_count;	
	UBYTE8	i;
	lcv_pbuff_arr=&gcv_arr_buff;
	lcv_psend_arr=&guv_send_buff.Fram_data.hour.bytes.bh;
	
	gcv_coma_num=0;
	gcv_copy_num=0;
	gcv_send_buff_count=0;
	gcv_string_select=0;

	for(i=0;i<41;i++)
		{
		guv_send_buff.send_arr[i]=0;
		}

	if(gcv_arr_buff[5]=='C')
		{
		//	gcv_arr_buff[5]=0;
			for(lcv_num_count=0;lcv_num_count<45;lcv_num_count++)
				{
					if(*lcv_pbuff_arr==',')
						gcv_coma_num++;
					switch(gcv_string_select)
						{
						case TIME :
							if(gcv_coma_num==1&&gcv_copy_num<6)
								{
									if(*lcv_pbuff_arr==',')
										break;
									*lcv_psend_arr=*lcv_pbuff_arr;
									lcv_psend_arr++;
									gcv_copy_num++;
								}
							
							if(gcv_copy_num>5)
							{
								gcv_string_select=POSITION;
							}
							break;
							
						case POSITION:
							if(gcv_coma_num>2&&gcv_coma_num<8)
								{
									*lcv_psend_arr=*lcv_pbuff_arr;	
									lcv_psend_arr++;
								}
							break;

						default:  break;
						}
					lcv_pbuff_arr++;			
				}
			UART_COM_Send_buff_anlyse(&guv_send_buff.Fram_data.latitude,9, &gfv_digit_arr_latitude);
			UART_COM_Send_buff_anlyse(&guv_send_buff.Fram_data.longitude,10, &gfv_digit_arr_longitude);
			UART_COM_Sendfram();
		}
}


⌨️ 快捷键说明

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