新手,把自己的理解贴出来,希望大家指正。
假设现在已经开启操作系统了,那要实现串口通信,第一步就是先把两个节点绑定。步骤就是某节点先触发Joystick右键,同时另一节点也触发Joystick右键。这里又有问题了,咱们按键之后操作系统怎么知道这个东西代表什么呢?
咱给出参考资料,里面有详细解答:http://www.feibit.com/?action-viewthread-tid-280 。
结论就是,按下按键之后,taskEvent里咱们的标志是SYS_EVENT_MSG,之后就调用咱的按键处理函数了,里面还有一些细节,包括即使是SYS_EVENT_MSG也还分了几种,咱就不深入讨论了,直接套用吧。好,咱的按键处理函数会调用这个函数:ZDP_EndDeviceBindReq(),这个是已经有的,专门用于终端绑定请求,然后另一边也发一个绑定请求。协调器收到绑定请求后进行处理,并且返回绑定结果信息。这时两个节点探测到有信息,调用static void SerialApp_ProcessZDOMsgs( zdoIncomingMsg_t *inMsg )处理绑定信息,绑定成功灯常亮。这里又有一个问题,当信息来的时候,为什么是调用咱们的任务。这里咱看一下SerialApp_init()里:
ZDO_RegisterForZDOMsg( SerialApp_TaskID, End_Device_Bind_rsp );
ZDO_RegisterForZDOMsg( SerialApp_TaskID, Match_Desc_rsp );
这样,绑定的无线信号就注册到我们的任务SerialApp里了,同样是SYS_EVENT_MSG标志。
好,那咱们现在已经绑定了,接下来就是通信的事情了,这个程序实现的功能是这样的:电脑串口发给节点A数据,节点A无线发给节点B,节点B再串口发给和节点B相连的电脑。那么第一步就是电脑串口发数据给节点A了,咱看一下。串口接收到数据,操作系统就会去处理。参考资料: http://www.feibit.com/bbs/viewth ... p;extra=&page=1
也就是说最终会调用那个static void SerialApp_CallBack(uint8 port, uint8 event)来调用static void SerialApp_Send(void); 将串口的信息无线发出去。而接收的节点则调用这个函数进行处理:static void SerialApp_ProcessMSGCmd( afIncomingMSGPacket_t *pkt );/*用于处理接收到的信息包的,如果收到数据,就发给串口,并且OTA发送应答;如果接收到应答,就先看是不是自己发的,然后判断是否需要重发,要重发就重发*/
但是这里有个问题,这个消息又是怎么注册的?
给个参考:
extern void afIncomingData( aps_FrameFormat_t *aff, zAddrType_t *SrcAddress,
uint8 LinkQuality, byte SecurityUse, uint32 timestamp );
作用:在APS层接收到数据后,会调用这个函数,函数内部调用afBuildMSGIncoming(),
如果项目中定义了MT_AF_CB_FUNC,则向MT注册SPI_CB_AF_DATA_IND事件,否则向应用层注册
AF_INCOMING_MSG_CMD事件,两者只取其一
在afBuildMSGIncoming()中,调用了osal_set_event将SerialApp标志了,这下明白了吧。而这一切的关键就是SerialApp_Init()中的afRegister( (endPointDesc_t *)&SerialApp_epDesc );
因为这个端点描述符里是带有task_id的,所以到时候可以通过描述符进行任务的置位。
不知道大家发现没有,其实咱们的Serial_App置位的都是SYS_EVENT_MSG,并没有咱们自己定义的那两个事件,SERIALAPP_SEND_EVT和 SERIALAPP_RESP_EVT ,其实这两个事件置位的时候是在static void SerialApp_Send(void) 和 static void SerialApp_Resp(void)里,当发送不成功时就osal_set_event()进行重发。
这样,咱们的SerialApp终于结束了。 |