📄 recv.c
字号:
// CMSioRecvPackLenMin = 8
if(cSioRecvBufEnd < CMSioRecvPackLenMin)
return 0;
// 强制类型转换
pack = (SioPackHead *)&SioRecvBuf;
type = pack->type.types.type;
len = 15;
if(cSioRecvBufEnd < CMSioLeadLen+len) // 如果SioRecvBuf.buf中不够18个字节
return 0; // 返回0!
cp = SioRecvBuf.buf+CMSioLeadLen; // cp指向包的第1个有效字节(类型+序列)
/* 收到"调试"包后的处理模块 */
if(type == CMSioTypeDebug) // 包类型为"调试"
{
RecvMOnTimeDebug();
return -7; // 返回-7!
}
/* CRC校验模块 */
Rc = CRCChk((char *)cp,len-CMSioCRCLen);
if(Rc != 1)
{
cgflgD4Flash = 0;
cgflgD5Flash = 1;
cgflgD6Flash = 0;
return -8; // 如果CRC校验未通过,返回-8!
}
/* 地址校验模块 */
Ra = MachineAddrChk(pack->addr,Rc);
if(!Ra) // Ra=0,机器地址校验出现错误
{
cgflgD4Flash = 0;
cgflgD5Flash = 0;
cgflgD6Flash = 1;
return -9; // 返回-9!
}
cRecvBufType = type; // 接收包的类型
return 1; // 一切正常,返回1!
}
/******************************************************************************
* 函数原形: void UrgencyStop(void); *
* 功能: 紧急停车函数 *
* 说明: 1.禁止一切控制动作 *
* 2.切断B5,SI1和-24V电源 *
******************************************************************************/
void UrgencyStop (void)
{
RecvMsgFailShow();
}
/******************************************************************************
* 函数原型: int RecvMOnTimeDataDispatch(void); *
* 功能: 判断接收包的类型并做相应的解包处理 *
* 说明: 正常情况下返回值为包的类型 *
******************************************************************************/
int RecvMOnTimeDataDispatch (void)
{
int type;
static unsigned char cRightPackCounter;
if(!cRecvBufType) // 如果cRecvBufType未被赋值,说明收到的包
// 未能通过CRC校验或机器地址校验
return 0; // 返回0!
type = cRecvBufType;
cRecvBufType = 0x00; // 注意清0
/* 系统恢复模块 */
if(cflgCommDatOvertime)
{
switch(type)
{
case CMSioTypeCtrlData:
case CMSioTypeSetCurrent:
case CMSioTypeSetOilFlow:
cRightPackCounter ++;
nflgCommDatRight = CommDatRightTime;
if(cRightPackCounter >= ConsecutiveRightPack)
{
cRightPackCounter = 0;
cflgCommDatOvertime = 0;
cflgUrgencyStop &= ~UrgStopTransMsgFail;
cgflgD4Flash = 1;
cgflgD5Flash = 0;
cgflgD6Flash = 0;
cgflgD11Flash = 0;
RecvMsgNormalShow();
}
return type;
default:
cRightPackCounter = 0;
return -1;
}
}
/* 正常处理模块 */
switch(type)
{
case CMSioTypeCtrlData: // 包类型为"普通级控制数据"
nflgCommDatRight = CommDatRightTime;
cgflgD4Flash = 1;
cgflgD5Flash = 0;
cgflgD6Flash = 0;
cgflgD11Flash = 0;
return type; // 返回包的类型!
case CMSioTypeSetCurrent:
case CMSioTypeSetOilFlow:
nflgCommDatRight = CommDatRightTime;
cgflgD4Flash = 1;
cgflgD5Flash = 0;
cgflgD6Flash = 0;
cgflgD11Flash = 0;
return type; // 返回包的类型!
}
return 0; // 接收包的类型出现错误,返回0!
}
/******************************************************************************
* 函数原型: void RecvMOnTimeDeleteLead(void); *
* 功能: 删除包头 *
* 说明: 无 *
******************************************************************************/
void RecvMOnTimeDeleteLead (void)
{
int n;
n = cSioRecvBufEnd-CMSioLeadLen; // n > 0
__memmovebuf(SioRecvBuf.buf,CMSioLeadLen,n); // 除包头外的所有数据向前移动3个字节
cSioRecvBufEnd -= CMSioLeadLen; // 更新cSioRecvBufEnd的值
}
/******************************************************************************
* 函数原型: void CheckRecvRight(void); *
* 功能: 保证2s内从发射机接收到正确的包 *
* 说明: 在2s内收不到正确的包,禁止一切控制动作 *
******************************************************************************/
void CheckRecvRight (void)
// called at 100Hz
{
if(nflgCommDatRight)
{
nflgCommDatRight --;
return;
}
// 如果在2s内未收到正确的包,做如下处理
cflgUrgencyStop |= UrgStopTransMsgFail;
cflgCommDatOvertime = 1;
cgflgD4Flash = 0;
cgflgD5Flash = 0;
cgflgD6Flash = 0;
cgflgD11Flash = 1;
}
/******************************************************************************
* 函数原型: void RecvMOnTime(void); *
* 功能: 实时接收发射机的数据 *
* 说明: 注意函数执行的次序 *
******************************************************************************/
void RecvMOnTime (void)
// called at 100Hz
// * 数据发送
// * 检查数据包
// * 检查通讯
{
int lead, data, r;
CheckRecvRight();
RecvMOnTimeReadRxBuf();
lead = RecvMOnTimeCheckLead();
RecvMOnTimeNormalBuf(lead);
if(lead == 0) // 如果未能在SioRecvBuf.buf中找到包头
return; // 返回
data = RecvMOnTimeCheckData();
if(data == 0) // 如果SioRecvBuf.buf中数据不够18个字节
return; // 返回
r = RecvMOnTimeDataDispatch();
RecvMOnTimeDeleteLead();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -