SerialApp_Init函数有两句话:
uartConfig.callBackFunc = SerialApp_CallBack; HalUARTOpen (SERIAL_APP_PORT, &uartConfig);
此处将dmaCfg.uartCB这个函数注册成为SerialApp_CallBack,也就是说
SerialApp_CallBack函数每次循环中被调用一次,对串口的内容进行查询,如果DMA中接收到了数据,则调用HalUARTRead,将DMA数据读至数据buffer并通过AF_DataRequest函数发送出去,注意:送出去的信息的CLUSTERID(信息簇ID)号为SERIALAPP_CLUSTERID1。
总结一下这个过程:串口数据==>DMA接收==>主循环中通过SerialApp_CallBack查询==>从DMA获取并发送到空中。
2. 节点2在收到空中的信号后,如何传递给与其相连的串口终端?
节点2从空中捕获到信号后,在应用层上首先收到信息的就是SerialApp_ProcessEvent这个函数了,它收到一个AF_INCOMING_MSG_CMD的事件,并通知SerialApp_ProcessMSGCmd,执行以下代码
switch ( pkt->clusterId ) {
// A message with a serial data block to be transmitted on the serial port. case SERIALAPP_CLUSTERID1: ... ...
// Transmit the data on the serial port.
if ( HalUARTWrite( SERIAL_APP_PORT, pkt->cmd.Data+1, (pkt->cmd.DataLength-1) ) ) {
// Save for next incoming message SerialApp_RxSeq = seqnb; stat = OTA_SUCCESS; } ... ...
这样就将从空中获取到的信息,传给了串口终端2--美国MM,第一句话终于传到美国了~至于后面的事情嘛,我们就不关注了,看小伙自己的造化了~~~
另外,此例程中还有一种模式,就是这个中国小伙可以按条件搜索(Joystick左键,profileID与clusterID相同者响应),但这种条件找出的MM都比较有个性--只接受你的信息,但不给你发。想想也是,明显没诚意嘛~ 这种模式的细节,本教程不再涉及,有兴趣的读者可自行了解。
声明一点,要真想泡美国MM,只用我们所谈的Zigbee是暂时搞不定的,它最大的传输距离能有几公里就相当不易了,不过隔壁办公室的MM,倒是可以考虑送她一个~~~
[四]网络结构及协议解析
本例程的重点是串口的应用,其中涉及的组网及绑定等网络层细节,暂不详细阐述,将在后续的“奥特曼Zigbee读书日记”中进行深入分析。