📄 mtcom.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 + -