最近用到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;
}
}
}