canopen协议|canFestival移植(3)-----SDO快速收发函数应用分析

前序 通过前2篇文章后,我相信大家对系统有了比较深入的理解,并且能够理解移植后,系统是怎么工作的,SDO报文是使用比较经常的一种报文,本篇文章分析一下怎么使用SDO收发报文,进一步理解canFestival。本文只讲解快速SDO报文,也是使用最多的报文,普通SDO报文用户大数据传输,交互次数较多。
canFestival使用总结 上一节通过历程可知canFestival的使用步骤,这一节再总结一把,为下面分析SDO报文收发打下坚实的基础:
(1)调用定时器初始化函数,编写定时器中断函数,同时再定时器中断函数中调用TimeDispatch()用来确定超时的软定时器,并且调用超时软定时器的超时函数。
(2)初始化CAN硬件通信,设置can硬件发送函数canSend(),并且设计can硬件中断,在硬件中断函数中,把接收到的报文组织成,Message 结构体,然后调用canDispatch()进行报文解析处理。
(3)你需要调用如下函数,这是协议规定的,必须调用这些函数,否则,状态不对,在使用canFestival提供的API的时候,就会失败。
canopen协议|canFestival移植(3)-----SDO快速收发函数应用分析
文章图片

简单补充一下,各种状态可以进行的操作,如图所示,在不同的状态能够进行的操作是不同的,源码是按照协议来的。
canopen协议|canFestival移植(3)-----SDO快速收发函数应用分析
文章图片

(4)编写用户应用canopen的逻辑,下面讨论的收发SDO报文就是逻辑设计的时候怎么调用发送SDO报文的函数。
发送读取对象字典SDO报文请求 (1)调用函数readNetworkDictCallback()就可以发起读取节点对象字典。readNetworkDictCallback()原型,不再进行源码详细分析了,参数再注释里面了:
canopen协议|canFestival移植(3)-----SDO快速收发函数应用分析
文章图片

简单总结一下这个函数的主要作用:
canopen协议|canFestival移植(3)-----SDO快速收发函数应用分析
文章图片

注意:
a)由于第一步要跟进nodeid从资源结构体进行查找,那么这个SDO_CLI什么时候设置呢?
答:如果是主站可以在从站bootup的时候进行设置,也可以直接初始化结构体的时候设置,这样节点介入总线的时候,要跟进主站初始化的值进行设置。如果是从站,直接初始化结构体设置好就行了。
b)SDO_CLI对应的是那个成员变量?
上一节其实已经说过了这个资源结构体,下图是SDO_CLT对应的开始和结束的位置,开始结束都是9,说明只存储了一个nodeid的成员,
canopen协议|canFestival移植(3)-----SDO快速收发函数应用分析
文章图片

nodeid成员对应的位置,前两个值要根据第3个的nodeid进行设置。
canopen协议|canFestival移植(3)-----SDO快速收发函数应用分析
文章图片

SDO报文发生之后,此报文会启动一个软定时器,如果成功接收到响应,那么会删除软定时器并且调用用户的回调函数,如果超时没响应,仍然会调用用户的回调函数。
(2)成功发送并且成功收到响应。
成功收到响应,此时在can中断接收函数中会把接收到的报文输送给canDispatch()进行解析,之后,我们调用getReadResultNetworkDict()函数,可以把值读取出来。
canopen协议|canFestival移植(3)-----SDO快速收发函数应用分析
文章图片

(3)发送之后响应超时。
响应超时,也调用与(2)相同的函数,不过此时,返回值不是SDO_FINISHED。
(4)处理技巧。
在回调函数设置标志变量,用户通过判定变量的值就知道本次SDO报文是否收发完成。
发送写对象字典SDO报文请求 写对象字典SDO报文的处理与读取处理的过程完全相同,只是调用函数不同:
(1)调用写SDO报文函数writeNetworkDictCallBack()。
canopen协议|canFestival移植(3)-----SDO快速收发函数应用分析
文章图片

(2)调用getWriteResultNetworkDict()函数读取回应结果。
canopen协议|canFestival移植(3)-----SDO快速收发函数应用分析
文章图片

(3)判断返回值,进行判定是否成功写入。
核心思想总结 【canopen协议|canFestival移植(3)-----SDO快速收发函数应用分析】调用对应的函数进行收发SDO报文,等待回调,最后调用对应的读取结果函数进行读取结果。

    推荐阅读