STM32
直播中

话多显蠢

9年用户 819经验值
擅长:479461
私信 关注
[问答]

CANopen协议移植编译,一直编译不过的原因?

CO_Data ObjDict_Data = CANOPEN_NODE_DATA_INItiALIZER(ObjDict);
IAR编译提示Error[Pe253]: expected a "," 错误指向CO_Data
Error[Pe253]: expected a "," 错误指向CO_Data
Error[Pe253]: expected a "," 错误指向CANOPEN_NODE_DATA_INITIALIZER(ObjDict)

自己比对发现并没有什么问题,但一直编译不过,希望可以指出来什么问题!什么感谢!

其中CO_Data 为如下结构体:
struct struct_CO_Data {

    //* Object dictionary
    UNS8             *bDeviceNodeId;    //节点地址
    const            indextable *objdict;  
    s_PDO_status     *PDO_status;       //PDO传输类型
    INTEGER16        *RxPDO_EventTimers;
    void (*RxPDO_EventTimers_Handler)(CO_Data*, UNS32);
    const quick_index *firstIndex;//起始索引
    const quick_index *lastIndex;//终止索引
    const UNS16       *ObjdictSize;
    const UNS8        *iam_a_slave;
    valueRangeTest_t valueRangeTest;

    // SDO
    s_transfer         transfers[SDO_MAX_SIMULTANEOUS_TRANSFERTS];
   
    // State machine
    e_nodeState        nodeState;
    s_state_communication CurrentCommunicationState;
    initialisation_t initialisation;
    preOperational_t preOperational;
    operational_t operational;
    stopped_t stopped;
    void (*NMT_Slave_Node_Reset_Callback)(CO_Data*);
    void (*NMT_Slave_Communications_Reset_Callback)(CO_Data*);
   

    // NMT-heartbeat
    UNS8        *ConsumerHeartbeatCount;
    UNS32       *ConsumerHeartbeatEntries;
    INTEGER16   *ConsumerHeartBeatTimers;
    UNS16       *ProducerHeartBeatTime;
    INTEGER16   ProducerHeartBeatTimer;
    heartbeatError_t heartbeatError;
    e_nodeState NMTable[NMT_MAX_NODE_ID];
   
//    /* NMT-nodeguarding */
    INTEGER16 GuardTimeTimer;
    INTEGER16 LifeTimeTimer;
    nodeguardError_t nodeguardError;
    UNS16 *GuardTime;
    UNS8 *LifeTimeFactor;
    UNS8 nodeGuardStatus[NMT_MAX_NODE_ID];
   
    // SYNC
    INTEGER16   syncTimer;
    UNS32       *COB_ID_Sync;//只可写入0x80(同步器不工作)与0x40000080(激活同步发生器)
    UNS32       *Sync_Cycle_Period;//同步周期
    post_sync_t post_sync;
    post_TPDO_t post_TPDO;
    post_SlaveBootup_t post_SlaveBootup;
    post_SlaveStateChange_t post_SlaveStateChange;

    //General
    UNS8           toggle;
    CAN_PORT       canHandle;   //选择CAN1或者CAN2
    scanIndexOD_t scanIndexOD;  //
    storeODSubIndex_t storeODSubIndex;
        
    // DCF concise
    const indextable* dcf_odentry;
    UNS8*           dcf_cursor;
    UNS32           dcf_entries_count;
    UNS8            dcf_status;
    UNS32           dcf_size;
    UNS8*           dcf_data;

    // EMCY
    e_errorState    error_state;
    UNS8            error_history_size;
    UNS8*           error_number;
    UNS32*          error_first_element;
    UNS8*           error_register;
    UNS32*          error_cobid;
    s_errors        error_data[EMCY_MAX_ERRORS];
    post_emcy_t     post_emcy;
   
};
CANOPEN_NODE_DATA_INITIALIZER(ObjDict);为如下宏定义
#define CANOPEN_NODE_DATA_INITIALIZER(NODE_PREFIX){
    /* Object dictionary*/
      NODE_PREFIX ## _bDeviceNodeId,     /* bDeviceNodeId */
    NODE_PREFIX ## _objdict,             /* objdict  */
    NODE_PREFIX ## _PDO_status,          /* PDO_status */
    NULL,                                /* RxPDO_EventTimers */
    _RxPDO_EventTimers_Handler,          /* RxPDO_EventTimers_Handler */
      NODE_PREFIX ## _firstIndex,        /* firstIndex */
      NODE_PREFIX ## _lastIndex,         /* lastIndex */
      NODE_PREFIX ## _ObjdictSize,       /* ObjdictSize */
      NODE_PREFIX ## _iam_a_slave,       /* iam_a_slave */
    NODE_PREFIX ## _valueRangeTest,      /* valueRangeTest */
   
    /* SDO, structure s_transfer */
    {
          REPEAT_SDO_MAX_SIMULTANEOUS_TRANSFERS_TIMES(s_transfer_Initializer)
    },
   
    /* State machine*/
    Unknown_state,      /* nodeState */
    /* structure s_state_communication */
    {
        0,          /* csBoot_Up */
        0,          /* csSDO */
        0,          /* csEmergency */
        0,          /* csSYNC */
        0,          /* csHeartbeat */
        0,           /* csPDO */
        0           /* csLSS */
    },
    _initialisation,     /* initialisation */
    _preOperational,     /* preOperational */
    _operational,        /* operational */
    _stopped,            /* stopped */
    NULL,                /* NMT node reset callback */
    NULL,                /* NMT communications reset callback */
   
    /* NMT-heartbeat */
      NODE_PREFIX ## _highestSubIndex_obj1016, /* ConsumerHeartbeatCount */
    NODE_PREFIX ## _obj1016,                   /* ConsumerHeartbeatEntries */
    NODE_PREFIX ## _heartBeatTimers,           /* ConsumerHeartBeatTimers  */
      NODE_PREFIX ## _obj1017,                 /* ProducerHeartBeatTime */
    TIMER_NONE,                                /* ProducerHeartBeatTimer */
    _heartbeatError,           /* heartbeatError */
   
    {REPEAT_NMT_MAX_NODE_ID_TIMES(NMTable_Initializer)},
                                                   /* is  well initialized at "Unknown_state". Is it ok ? (FD)*/
   
    /* NMT-nodeguarding */
    TIMER_NONE,                                /* GuardTimeTimer */
    TIMER_NONE,                                /* LifeTimeTimer */
    _nodeguardError,           /* nodeguardError */
      NODE_PREFIX ## _obj100C,                 /* GuardTime */
      NODE_PREFIX ## _obj100D,                 /* LifeTimeFactor */
    {REPEAT_NMT_MAX_NODE_ID_TIMES(nodeGuardStatus_Initializer)},
   
    /* SYNC */
    TIMER_NONE,                                /* syncTimer */
      NODE_PREFIX ## _obj1005,                 /* COB_ID_Sync */
      NODE_PREFIX ## _obj1006,                 /* Sync_Cycle_Period */
    /*  NODE_PREFIX ## _obj1007, */            /* Sync_window_length */
    _post_sync,                 /* post_sync */
    _post_TPDO,                 /* post_TPDO */
    _post_SlaveBootup,            /* post_SlaveBootup */
        _post_SlaveStateChange,            /* post_SlaveStateChange */
   
    /* General */
    0,                                         /* toggle */
    NULL,                   /* canSend */
    NODE_PREFIX ## _scanIndexOD,                /* scanIndexOD */
    _storeODSubIndex,                /* storeODSubIndex */
    /* DCF concise */
        NULL,       /*dcf_odentry*/
    NULL,        /*dcf_cursor*/
    1,        /*dcf_entries_count*/
    0,        /* dcf_status*/
        0,      /* dcf_size */
        NULL,   /* dcf_data */
   
    /* EMCY */
    Error_free,                      /* error_state */
    sizeof(NODE_PREFIX ## _obj1003) / sizeof(NODE_PREFIX ## _obj1003[0]),      /* error_history_size */
      NODE_PREFIX ## _highestSubIndex_obj1003,    /* error_number */
      NODE_PREFIX ## _obj1003[0],    /* error_first_element */
      NODE_PREFIX ## _obj1001,       /* error_register */
          NODE_PREFIX ## _obj1014,       /* error_cobid */
    /* error_data: structure s_errors */
    {
    REPEAT_EMCY_MAX_ERRORS_TIMES(ERROR_DATA_INITIALIZER)
    },
    _post_emcy,              /* post_emcy */
}



回帖(1)

木頭瓶子

2024-4-26 17:05:57
根据您提供的信息,您在尝试移植CANopen协议时遇到了编译错误。错误提示是关于逗号的,这通常是由于语法错误导致的。以下是一些建议,以帮助您解决这个问题:

1. 检查您的代码中的逗号是否正确。确保在结构体初始化列表中,每个成员后面都有一个逗号,除了最后一个成员。

2. 检查您的CANopen协议库是否与您的项目兼容。确保您使用的库版本与您的项目设置相匹配。

3. 检查您的项目设置,确保编译器和链接器设置正确。这可能包括检查编译器选项、包含路径、库路径等。

4. 检查您的代码中是否有其他语法错误。有时候,编译器可能会在错误的地方报告错误,但实际上问题可能在其他地方。

5. 如果您使用的是第三方CANopen协议库,请查阅相关文档,以确保您正确地使用了库中的宏和函数。

6. 如果问题仍然存在,您可以尝试在其他IDE或编译器中编译您的项目,以确定问题是否与IAR编译器有关。


举报

更多回帖

发帖
×
20
完善资料,
赚取积分