求教大神 关于canopen的SDO用writeNetworkDict写入节点数据返回0xff错误失败问题。。

  最近用到CANOpen,通过SDO配置节点参数,发现很奇怪的一个问题,第一次可以通过SDO下发数据,加了延时后,同一个节点下发第二次数据,运行到getSDOlineOnUse(d, CliNbr, SDO_CLIENT, &line);时返回0xff错误,发送失败,第三次再下发又可以了,第四次下发失败,依次类推,中间会错开一个,怎么下发都不行,有没有大神遇到过这样的问题?我用的是开源的canfestival。

发送函数如下:

void canopen_send_sdo(uint16_t message_sdo[])
{
      uint32_t    abortCode = 0;
    int8_t      nodeID = 0;          /* ID       */
    uint16_t    index = 0;           /* 索引     */
    uint8_t     subIndex = 0;        /* 子索引   */
    uint8_t     dataType = uint8;    /* 数据类型 目前感觉这里应该是uint8就可以通用 */
    uint32_t    count = 4;           /* 数据长度 */
    uint8_t     sendData[4];      //数据
       uint8_t     result = 0x0;     //发送返回值
      
    nodeID = (uint8_t)(message_sdo[0] & 0xF);                               /* ID */
    index = (uint16_t)((message_sdo[3] << 8) + message_sdo[2]);            /* 索引     */
    subIndex=(uint8_t)(message_sdo[4]);                                     /* 子索引   */
    for(int i = 0; i < 4; i++) sendData[i] = (message_sdo[5 + i] & 0xFF);   //数据赋值
    if(message_sdo[1] == 0x23) count = 0x4;  //数据长度
      else if(message_sdo[1] == 0x27) count = 0x3;
      else if(message_sdo[1] == 0x2B) count = 0x2;
      else if(message_sdo[1] == 0x2F) count = 0x1;

    //d; nodeId; index; subIndex; count; dataType; data[4]; useBlockMode; 
     writeNetworkDict(&Master_Data, nodeID, index, subIndex, count, dataType, &sendData, 0);  //写入SDO数据 
         
        while(!result)
        {
            result = getWriteResultNetworkDict(&Master_Data, nodeID, &abortCode);  //等待写入完成
            if(result == SDO_FINISHED)
            {
                /* SDO 请求已完成 */
                break;
            }
            else if(result == SDO_ABORTED_INTERNAL)
            {
                    /* SDO 请求被中止 */ 
                    break;
            }
            else if(result == SDO_PROVIDED_BUFFER_TOO_SMALL)
            {
                    /* SDO 数据错误 */ 
                    break;
            }
            else if(result != 0x0) 
            {
                /*SDO 操作失败 SDO 中止代码*/ 
                break;
            }
        }
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值