邮箱发送

/
/**
 \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
	/* 写最后的字节来出发邮箱满符号位,如果已经读到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配置还是通过邮箱的方式配置的。

概念,邮箱的处理与协议上面之间是完全分开的,协议可以不顾邮箱的实现。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值