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

📄 mtcom.c

📁 PIC18F4520与MTx通信及控制程序。包括报文配置等。
💻 C
字号:
# include<pic18f4520.h>
#define MTCom_GLOBALS
# include"MTCom.h"

/**************************************************
函数名称:SendMessage  发送函数
说明:  发送报文的统一格式
      发送报文的长度;
输入:要发送报文的首地址
输出:报文
另外的说明:
时间:2007-03-19 By XY

***********************************************/
void SendMessage(char *p,char Length)   //报文发送函数
{
 int i=0;
 char *send;
 send=p;
 for (i=0;i<Length;i++)
  {
   while(TXIF==0);  //上次发送完成
   TXIF=0;          // 标志位清零  
   TXREG=*send;     //发送
   send++;         //准备下一个
  }
}


/**************************************************
函数名称:RecMessage  接受函数
说明:  接受报文的统一格式
输入:  上次发送报文的首地址
输出:  错误信息
另外的说明:多次校验,每次都是分支形式,
            前面的不正确,后面的不执行,直接跳出。
时间:2007-03-19 By XY

***********************************************/

void RecMessage(char SendMid )   //报文接受函数
{
  char RcMid=SendMid;
  char head=0;
  char bid=0;
  char mid=0;
  char Length=0;
  char checksum=0;
  char i=0; 
  char j=0;
  unsigned char sum=1;   //用于校验和  注意清零
  Angle_Current0=Angle_Current;   // 缓冲,存放
  while(RCIF==0);
   RCIF=0;
   head=RCREG;          //接受信息报头
  while(RCIF==0);
   RCIF=0;
   bid=RCREG;          //接受信息BID
   sum=0;              //此处先清零!!!!!!!!
   sum+=bid;
  if(head!=0xfa&&bid!=0xff)   //识别是不是MTCom
    {
          Flag_MTError=1;        //错误标志位置位
    }
  else                         //确实是MTCom,则向下进行
    {
     while(RCIF==0);
     RCIF=0;
     mid=RCREG;                //接受MID
     sum+=mid;

     while(RCIF==0);
     RCIF=0;
     Length=RCREG;          //接受信息数据长度
     sum+=Length;

     if(mid==0x42)             //判断是否为错误数据
         {
          Flag_MTError=1;        //错误标志位置位
          } 

//**********************测量数据处理模式**************************                 
     else if((mid==RcMid)&&(mid==0x32))          //测量数据处理模式
        {
        for(i=0;i<6;i++)
            {
             for(j=4;j>0;j--)   //需要考虑顺序问题!!!!
              {
                   while(RCIF==0);
                   RCIF=0;                   
                   MsDateFloat.chdata[j-1]=RCREG; //接受字符型的数据
                   sum+=MsDateFloat.chdata[j-1];
               }
              MsData[i]=MsDateFloat.fldata;  //存储浮点型数据            
             }
          while(RCIF==0);
          RCIF=0;
          sum+=RCREG;          //接受校验和有关信息
             if(sum==0)            //如果校验和正确则存储数据
              {
             acc[0]=MsData[0];
             acc[1]=MsData[1];
             acc[2]=MsData[2];              //各方向加速度
             Angle_Current=MsData[5]; //陀螺仪计算的当前角度
              }
             else
              {
               Flag_MTError=1;        //校验和错误标志位置位
              }
         }

//**********************非测量数据处理模式**************************      
           else if((mid==RcMid)&&(mid!=0x32))  // 非测量应答mid正确
                  { 
                     while(RCIF==0);
                     RCIF=0;
                     checksum=RCREG;
                     sum+=checksum;    //接受校验和有关信息
                         
                       if(sum==0)    //如果校验和正确则存储数据
                          {
                            Flag_MTError=0;     //正确置位零
                           } 
                        else 
                           {
                            Flag_MTError=1; //校验和错误标志位置位 
                           } 
                   }                           
                else                   //应答mid错误
                  {
                     Flag_MTError=1;     //错误标志位置位
                  }

    }
   if((Flag_MTError==0)&&(SendStep<8))   //在进程小于8时,接受正确一次
   {
    SendStep+=1;         //接受正确,则进程加1
   } 
   Angle_Current+=Angle_Initial;   //加上初始值
   if(Angle_Current>180)              //陀螺方向角的边界控制  
       Angle_Current-=360;
    else if(Angle_Current<-180)
       Angle_Current+=360;
}






⌨️ 快捷键说明

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