zstack串口应用总结
最近总是碰到很多人问我串口的问题,很多人会纠结于一些细节性的东西,刨根问底当然好,但在实际的开发过程中需要你会用,不可能给你那么的多的时间学那么多无关的东西,总之一句话:开发注重于框架的掌握,具体在开发中遇到的细节问题再拿出刨根问底的功夫出来,这样才会事半功倍。
(支持原创,如需转载,请注明地址:http://blog.sina.com.cn/litianping0709
其实zstack的串口应用起来相当简单,由于时间关系,我对串口的应用只做一个简单的讲解,给大家一个框架,实际应用中大家自己酌情掌握,当然有错的话希望大家指正,只是个人理解。
在zstack中,串口应用主要有三种方式:
(1)与zstack交互进行通信:需要考虑到系统通信的数据格式,这种应用一般更加侧重于与zstack交互。
举个例子,在协调器中我们需要利用PC给zstack发出命令需要其执行相应的命令时,这个时候我们只要在协调器的编译项加上ZTOOL_P1 MT_TASK两个选项即可,如果这个时候如果需要MT层和应用层进行交互处理用户数据(具体用户数据的格式在zstack中的串口文档中有定义,大家可以自行查看),就必须在应用层中加入
case MT_SYS_APP_MSG: // Z-Architect Messages
(具体为什么加这个如果还不清楚把zstack OSAL运行机制搞清楚之后再开发吧。)
这个时候才能串口发送的数据经过MT层处理后送到我们的应用层,这是接收过程,发送过程直接调用HalUARTWrite()函数即可。
(2)自己的串口应用,与zstack命令格式无关,但不想自己配置串口,想偷懒:这种情况下也很简单,与上述编译项不同的是,此时需要加入的编译项为:MT_TASK ZAPP_P1,当中的串口号根据实际情况而定,这个时候只要加入编译项其实就行了,在应用过程中如果想在应用层处理串口的数据,和上述情况类似,这时候需要在应用层中加入的东西有:
#include "SPIMgr.h"头文件 ....
#if defined (ZAPP_P1)
SPIMgr_RegisterTaskID(SampleApp_TaskID);//在MT层注册 SPIMgr_ZAppBufferLengthRegister(7); // BUFFER大小 #endif .....
case SPI_INCOMING_ZAPP_DATA:
Bindnode_SerialMSGCB(MSGpkt);//自己的串口数据处理函数 #if defined(ZAPP_P1)
SPIMgr_AppFlowControl ( SPI_MGR_ZAPP_RX_READY );//流控制 #endif break; ......
这是最主要的三步,完成上述添加,大家就可以使用串口了。
(需要主要注意的是一个串口不能同时实现上面的两个功能,一定要实现上述ZAPP_Px编译和ZTOOL_Px同时存在的话,那么x一定不能相同,即要使用两个不同的串口,否则会出现冲突。)
(3)可能瞧不起zstack定义好的串口,自己单独写一个玩玩,或者想另外加一个串口实现双串口功能,这个很简单,大家看看serialapp例子就行,我不细说。
最近总是碰到很多人问我串口的问题,很多人会纠结于一些细节性的东西,刨根问底当然好,但在实际的开发过程中需要你会用,不可能给你那么的多的时间学那么多无关的东西,总之一句话:开发注重于框架的掌握,具体在开发中遇到的细节问题再拿出刨根问底的功夫出来,这样才会事半功倍。
(支持原创,如需转载,请注明地址:http://blog.sina.com.cn/litianping0709
其实zstack的串口应用起来相当简单,由于时间关系,我对串口的应用只做一个简单的讲解,给大家一个框架,实际应用中大家自己酌情掌握,当然有错的话希望大家指正,只是个人理解。
在zstack中,串口应用主要有三种方式:
(1)与zstack交互进行通信:需要考虑到系统通信的数据格式,这种应用一般更加侧重于与zstack交互。
举个例子,在协调器中我们需要利用PC给zstack发出命令需要其执行相应的命令时,这个时候我们只要在协调器的编译项加上ZTOOL_P1 MT_TASK两个选项即可,如果这个时候如果需要MT层和应用层进行交互处理用户数据(具体用户数据的格式在zstack中的串口文档中有定义,大家可以自行查看),就必须在应用层中加入
case MT_SYS_APP_MSG: // Z-Architect Messages
(具体为什么加这个如果还不清楚把zstack OSAL运行机制搞清楚之后再开发吧。)
这个时候才能串口发送的数据经过MT层处理后送到我们的应用层,这是接收过程,发送过程直接调用HalUARTWrite()函数即可。
(2)自己的串口应用,与zstack命令格式无关,但不想自己配置串口,想偷懒:这种情况下也很简单,与上述编译项不同的是,此时需要加入的编译项为:MT_TASK ZAPP_P1,当中的串口号根据实际情况而定,这个时候只要加入编译项其实就行了,在应用过程中如果想在应用层处理串口的数据,和上述情况类似,这时候需要在应用层中加入的东西有:
#include "SPIMgr.h"头文件 ....
#if defined (ZAPP_P1)
SPIMgr_RegisterTaskID(SampleApp_TaskID);//在MT层注册 SPIMgr_ZAppBufferLengthRegister(7); // BUFFER大小 #endif .....
case SPI_INCOMING_ZAPP_DATA:
Bindnode_SerialMSGCB(MSGpkt);//自己的串口数据处理函数 #if defined(ZAPP_P1)
SPIMgr_AppFlowControl ( SPI_MGR_ZAPP_RX_READY );//流控制 #endif break; ......
这是最主要的三步,完成上述添加,大家就可以使用串口了。
(需要主要注意的是一个串口不能同时实现上面的两个功能,一定要实现上述ZAPP_Px编译和ZTOOL_Px同时存在的话,那么x一定不能相同,即要使用两个不同的串口,否则会出现冲突。)
(3)可能瞧不起zstack定义好的串口,自己单独写一个玩玩,或者想另外加一个串口实现双串口功能,这个很简单,大家看看serialapp例子就行,我不细说。