将canfestival移植至stm32在使用过程中发现canDispatch存在已接收到正确的数据
void canDispatch(CO_Data* d, Message *m)
但getWriteResultNetworkDict()与getReadResultNetworkDict()偶尔会发生读取不到报文的情况
经调试排查,发现是由于在can接收中断中调用canDispatch导致的。
修改canfestival源代码后问题解决
在文件sdo.c 函数getWriteResultNetworkDict()与getReadResultNetworkDict()
if (d->transfers[line].state != SDO_FINISHED)
{
// 原代码
// return d->transfers[line].state; // 因为是在中断中解包,该值可能会变
// 修改后的代码
return SDO_DOWNLOAD_IN_PROGRESS;
}
/* If transfer not finished just return, but if aborted set abort code and size to 0 */
if (d->transfers[line].state != SDO_FINISHED) {
if((d->transfers[line].state == SDO_ABORTED_RCV) || (d->transfers[line].state == SDO_ABORTED_INTERNAL)) {
*abortCode = d->transfers[line].abortCode;
*size = 0;
}
// 源代码
// return d->transfers[line].state; // 2023-5-12 15:49:17 此处有会被改写为SDO_FINISHED,因为是在中断中处理
// 修改后的代码
return SDO_UPLOAD_IN_PROGRESS;
}