查看: 7637|回复: 9

我理解的SerialApp

[复制链接]
ocean 发表于 2011-9-16 22:50:31 | 显示全部楼层 |阅读模式
新手,把自己的理解贴出来,希望大家指正。

      假设现在已经开启操作系统了,那要实现串口通信,第一步就是先把两个节点绑定。步骤就是某节点先触发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终于结束了。
a302042 发表于 2011-9-24 11:27:37 | 显示全部楼层
我今天刚按照步骤测试了,绑定成功了,LED1常亮,设置串口端口2和4(设备管理器里面是2和4),但是用其中一个串口发送数据,第二个接收不到
 楼主| ocean 发表于 2011-9-24 23:42:33 | 显示全部楼层
请问是其中一个发另一个接收不到还是无论哪个发送都接收不到?我用的不是飞比的板子但是程序基本都是TI原来的,所以应该是不会有问题的。
被赶的蜗牛 发表于 2011-10-5 11:17:53 | 显示全部楼层
新手受益了!谢谢LZ
cozypethanhan 发表于 2012-2-1 00:58:43 | 显示全部楼层
姐姐我苦苦试了1天 调来调去都没有messages  从 OSAL看到 HAl 看到DMA ,原来是没有开RS232enable; 我自己都很鄙视我自己
一月的萧邦 发表于 2012-2-15 11:18:59 | 显示全部楼层
楼主好文章,真的受益了,这几天正在为函数的注册和端点描述而困惑呢
天天向上 发表于 2012-2-16 19:18:28 | 显示全部楼层
想把这个点对点通讯改成星型,不知有什么好建议
truth 发表于 2012-3-22 15:43:23 | 显示全部楼层
表示不是很懂!!!
lizheng86312 发表于 2012-8-29 13:19:41 | 显示全部楼层
学到东西了。顶。。。
wolfcherished 发表于 2013-3-7 22:13:28 | 显示全部楼层
谢谢楼主,不错
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表