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

📄 串口通讯.h

📁 rs422串口编程
💻 H
📖 第 1 页 / 共 3 页
字号:
/*            Public:                                         				*/
/*                   CommRecBufferTail  接收缓冲区尾指针,用于判断数据接收完否			*/
/*                   CommRecBufferHead 从接收缓冲区读取数据后,头指针加一			*/
/*                   CommRecBuffer定   接收缓冲区,用于存放接收到的数据			*/
{
        unsigned char ch;
        while(CommRecBufferHead==CommRecBufferTail);        //无字符则等待
        ch=CommRecBuffer[CommRecBufferHead];
        CommRecBufferHead++;
 	if (CommRecBufferHead==REC_MAXSIZE){                //指针到头回零
		CommRecBufferHead=0;
	}
	if(CommRecBufferHead==CommRecBufferTail) FlagRecComm=0;
	return ch;
}
//串口关闭函数
void s_close( void )
/* s_close: 串行口关闭函数                      	*/
/*                                            	*/
/*            Input  :                        	*/
/*                     无                     	*/
/*            Return : 无                   	*/
{
	ES=0; 					// close the serial interrupt
}
//定时器0中断处理函数
void  timer0(void) interrupt 1
/* timer0: 定时器中断处理子程序                  		*/
/*                                            		*/
/*            Input  :                        		*/
/*                     无                      		*/
/*            Return : 无                   		*/
/*            Public:                          		*/
/*                    time0:定时计数器         		*/
/*                    pre_time:预设时间        		*/
/*                    time_flag:定时到标志     		*/
{
        TR0=0;
        TH0=0x70;//0xb8;//70;                      /*20ms定时*/
        TL0=0x00;//0x00;//00;
        time0=time0+1;
        if(time0>=pre_time){
          time_flag=1;
          time0=0;
        }
        TR0=1;
        return;
}
//定时函数
void time_count(unsigned int time)
/* time_count : 定时器函数,产生一定定时         		*/
/*                                            		*/
/*            Input  :                        		*/
/*                     time 定时时间常数        		*/
/*            Return : 无                   		*/
/*                    time0:定时计数器         		*/
/*                    pre_time:预设时间        		*/
/*                    time_flag:定时到标志     		*/
{
     time0=0;
     time_flag=0;
     pre_time=time;
     return;
}
//浮点数字节对换
float float_swap(float data_swap)
/* float_swap : 浮点数存储格式转换                     	*/
/*                                              	*/
/*            Input  :                          	*/
/*                     data_swap 要转换的数据     	*/
/*            Return : 转换完的数据		             	*/
{
union{
   float input_float;
   unsigned char input_char[4];
}input_data;
unsigned char tmp;
         input_data.input_float=data_swap;
         tmp=input_data.input_char[0];
         input_data.input_char[0]=input_data.input_char[3];
         input_data.input_char[3]=tmp;
         tmp=input_data.input_char[1];
         input_data.input_char[1]=input_data.input_char[2];
         input_data.input_char[2]=tmp;
         return(input_data.input_float);
}
//整数字节对换
int int_swap(int data_swap)
/* int_swap : 整数存储格式转换                     	*/
/*                                              	*/
/*            Input  :                          	*/
/*                     data_swap 要转换的数据     	*/
/*            Return : 转换完的数据             		*/
{
union{
   int input_int;
   unsigned char input_char[2];
}input_data;
unsigned char tmp;
         input_data.input_int=data_swap;
         tmp=input_data.input_char[0];
         input_data.input_char[0]=input_data.input_char[1];
         input_data.input_char[1]=tmp;
         return(input_data.input_int);
}
//长整型字节对换
long int long_int_swap(long int data_swap)
/* long_int_swap : 长整数存储格式转换                     	*/
/*                                                      	*/
/*            Input  :                                  	*/
/*                     data_swap 要转换的数据             	*/
/*            Return : 转换完的数据                     	*/
{
union{
   long int input_long_int;
   unsigned char input_char[4];
}input_data;
unsigned char tmp;
         input_data.input_long_int=data_swap;
         tmp=input_data.input_char[0];
         input_data.input_char[0]=input_data.input_char[3];
         input_data.input_char[3]=tmp;
         tmp=input_data.input_char[1];
         input_data.input_char[1]=input_data.input_char[2];
         input_data.input_char[2]=tmp;
         return(input_data.input_long_int);
}
//系统握手
unsigned char sys_done(void)
/* sys_done : 系统握手及应答                                  		*/
/*                                                           		*/
/*            Input  :                                       		*/
/*                     无                                    		*/
/*            Return : 握手状态                               		*/
/*            Public:                                        		*/
/*                     wait_time[]:IMU标定对准的剩余时间        	*/
{
       static unsigned char xdata head[6];
       unsigned char temp;
       if(s_intflag()<5) return(0);
       while((temp=s_read())!='$'){
           if(s_intflag()<5) return(0);
       }
       head[0]=temp;
       head[1]=s_read();
       head[2]=s_read();
       head[3]=s_read();
       head[4]=s_read();
       head[5]='\0';
       if(strcmp(head,"$DONE")==0) return(1);    //导航系统准备好
       if(strcmp(head,"$FAIL")==0) return(2);    //初始参数接收失败
       if(strcmp(head,"$GOOD")==0) return(3);    //初始参数接收成功
       if(strcmp(head,"$OVER")==0) return(4);    //IMU标定对准完成
       if(head[3]==' '&&head[4]=='A'){           //IMU标定对准剩余时间
          wait_time[0]=head[1];
          wait_time[1]=head[2];
          return(5);
       }
       if(head[3]==' '&&head[4]=='B'){
          wait_time[0]=head[1];
          wait_time[1]=head[2];
          return(5);
       }
       return(0);
}
//串口数据接收函数
unsigned char receive_data(void)
/* receive_data : 导航信息接收                              	*/
/*                                                         	*/
/*            Input  :                                     	*/
/*                     无                                  	*/
/*            Return : 接收数据的状态                        	*/
/*            Public:                                      	*/
/*                     rec_ins_data:导航信息共用体           	*/
{
unsigned char xdata j=0;
unsigned char xdata temp_c,test_code=0;
static unsigned char  xdata head[6],rec_data[56],tail[4];
       if(s_intflag()<65) return(0);          //判缓冲区数据量
       while((temp_c=s_read())!='$'){         //寻找数据头
            if(s_intflag()<65) return(0);
       }
       head[0]=temp_c;
       head[1]=s_read();
       head[2]=s_read();
       head[3]=s_read();
       head[4]=s_read();
       head[5]='\0';
       if(strcmp(head,"$NTHR")==0){           //三维系统判断数据头
            for(j=0;j<52;j=j+1){
                 rec_data[j]=s_read();
            }
            tail[0]=s_read();
            tail[1]=s_read();
            tail[2]=s_read();
            tail[3]=s_read();
            if(tail[0]=='*'&&tail[2]=='\r'&&tail[3]=='\n'){
               test_code=rec_data[0];
               for(j=0;j<51;j=j+1){             //计算校验码
                   test_code=test_code^rec_data[j+1];
               }
               for(j=0;j<4;j=j+1){
                  test_code=test_code^head[j+1];
               }
            }
            if(test_code==tail[1]){             //校验码无误,数据接收
               for(j=0;j<52;j=j+1){
                 rec_three.tra_data[j]=rec_data[j];
               }
               //////////////////数据格式转换//////////////////////
               rec_three.ins_data.sinstime=long_int_swap(rec_three.ins_data.sinstime);
               rec_three.ins_data.attitude1=float_swap(rec_three.ins_data.attitude1);
               rec_three.ins_data.attitude2=float_swap(rec_three.ins_data.attitude2);
               rec_three.ins_data.attitude3=float_swap(rec_three.ins_data.attitude3);
               rec_three.ins_data.ang_rate1=float_swap(rec_three.ins_data.ang_rate1);
               rec_three.ins_data.ang_rate2=float_swap(rec_three.ins_data.ang_rate2);
               rec_three.ins_data.ang_rate3=float_swap(rec_three.ins_data.ang_rate3);
               rec_three.ins_data.pos_integer1=float_swap(rec_three.ins_data.pos_integer1);
               rec_three.ins_data.pos_integer2=float_swap(rec_three.ins_data.pos_integer2);
               rec_three.ins_data.pos_integer3=float_swap(rec_three.ins_data.pos_integer3);
               rec_three.ins_data.pos_decimal1=float_swap(rec_three.ins_data.pos_decimal1);
               rec_three.ins_data.pos_decimal2=float_swap(rec_three.ins_data.pos_decimal2);
               rec_three.ins_data.pos_decimal3=float_swap(rec_three.ins_data.pos_decimal3);
               sys_flag=1;
               return(1);
            }
       }
       ///////////////////////////
       if(strcmp(head,"$NATT")==0){           //航姿系统判断数据头
            for(j=0;j<28;j=j+1){
                 rec_data[j]=s_read();
            }
            tail[0]=s_read();
            tail[1]=s_read();
            tail[2]=s_read();
            tail[3]=s_read();

⌨️ 快捷键说明

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