您的位置:首页 > 其它

邮箱发送

2016-06-28 21:15 190 查看

<a target=_blank href="http://blog.csdn.net/huangxianxinalice/article/details/9356307">http://blog.csdn.net/huangxianxinalice/article/details/9356307</a>
/////////////////////////////////////////////////////////////////////////////////////////
/**
\param     pMbx        指针指向发送给主站的邮箱命令.

\brief    这个函数拷贝数据到发送邮箱.
*////////////////////////////////////////////////////////////////////////////////////////

UINT8 MBX_CopyToSendMailbox( TMBX MBXMEM *pMbx )
{
if ( (nAlStatus & STATE_MASK) == STATE_INIT)
{
/* 从站如果在INIT状态,邮箱服务是被禁止的 */
return( ERROR_INVALIDSTATE );
}

if ( !bMbxRunning )
{
/* 从站如果在INIT状态,邮箱服务是被禁止的 */
return( ERROR_INVALIDSTATE );
}

if ( bSendMbxIsFull )
{
/* 邮箱服务不能被发送因为发送邮箱已满 */
return MBXERR_NOMOREMEMORY;
}
else
{
/* 变量mbxSize包含被发送的邮箱数据大小 */
UINT16 mbxSize = pMbx->MbxHeader.Length;

HW_EscWriteMbxMem((UINT8 *)pMbx, u16EscAddrSendMbx, (mbxSize + MBX_HEADER_SIZE));

{
/*读SM1的控制和状态字,检查缓存是否仍然被标记为空*/

VARVOLATILE UINT8 smstate = 0x00;
HW_EscReadByte(smstate,(ESC_SYNCMAN_STATUS_OFFSET + SYNCMAN_REG_SIZE));
#endif
<span style="white-space: pre;">	</span>/* 写最后的字节来出发邮箱满符号位,如果已经读到SM的邮箱缓存满,则不需要设置符号位*/
if(!(smstate & SM_STATUS_MBX_BUFFER_FULL))
{
u8dummy = 0;
HW_EscWriteByte(u8dummy,(u16EscAddrSendMbx + u16SendMbxSize - 1));
}

#if !MAILBOX_QUEUE
// 如果它不为0的时候,就返回buffer值
if ( pMbx != psWriteMbx && psWriteMbx != 0 )
{
/* MBX_MailboxSendReq 将会被调用,当buffer不等于asMbx[0]和asMbx[1],
所以,邮箱响应需要被拷贝用来重复 */
MBXMEMCPY(psWriteMbx, pMbx, mbxSize + MBX_HEADER_SIZE);
pMbx = psWriteMbx;
}
#endif
/*  保存最后的发送邮箱服务用来存储一个可能的重复的缓存包括最后一个发送服务
另外一个实际的服务将会被发送(psReadMbx),没有可用的缓存给邮箱接收服务,,
直到最后一个发送缓存被主站读,在INIT2PREOP之后,异常提示这里没有最后一个发送的服务 */
if ( psReadMbx )
psWriteMbx = NULL;
else
{
/* only the first time after the INIT2PREOP-transition */
psWriteMbx = &asMbx[1];
}
// HBu 17.06.06: psRepeatMbx was already updated in MBX_MailboxReadInd
// psRepeatMbx = psReadMbx;
psReadMbx = pMbx;

/* set flag that send mailbox is full now */
bSendMbxIsFull = TRUE;
return 0;
}
}


其中函数HW_EscWriteMbxMem就是写‘len’长度的字节从应用程序的缓存,由“pdata”指向的然后拷贝到ESC的邮箱空间,注意这里的sdo配置还是通过邮箱的方式配置的。

概念,邮箱的处理与协议上面之间是完全分开的,协议可以不顾邮箱的实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: