?? 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 + -