?? uart_com.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) //發(fā)送一個字節(jié)
{
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; //將數(shù)據(jù)放入緩存中
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)) //每一位轉(zhuǎn)化成16進(jìn)制
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;
}
/*---------------------------------------------------------------------------
轉(zhuǎn)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++) //取浮點數(shù)的整數(shù)部分
{
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++) //取浮點數(shù)的小數(shù)部分
{
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) //調(diào)試注銷
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();
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -