|
很多学习Zstack的朋友非常关心串口的使用方法,希望能够通过串口进行数据透明传输或者能够通过串口发送无线控制指令,来实现对设备的远程控制。这个功能其实实现起来并不是很难,这期我们就来说一下Zstack协议栈中如何来对串口进行操作。
想要使用串口功能,首先要进行初始化操作,Zstack中已经给出了一个串口操作的DEMO:X:\Texas Instruments\ZStack-CC2530-2.5.1a\Projects\zstack\Utilities\SerialApp\CC2530DB\Serial
App,在SerialApp.c文件中的SerialApp_Init函数中,可以找到以下代码:
halUARTCfg_t uartConfig;
uartConfig.configured = TRUE; // 2x30 don't care - see uart driver.
uartConfig.baudRate = SERIAL_APP_BAUD;
uartConfig.flowControl = TRUE;
uartConfig.flowControlThreshold = SERIAL_APP_THRESH; // 2x30 don't care - see uart driver.
uartConfig.rx.maxBufSize = SERIAL_APP_RX_SZ; // 2x30 don't care - see uart driver. uartConfig.tx.maxBufSize = SERIAL_APP_TX_SZ; // 2x30 don't care - see uart driver.
uartConfig.idleTimeout = SERIAL_APP_IDLE; // 2x30 don't care - see uart driver.
uartConfig.intEnable = TRUE; // 2x30 don't care - see uart driver.
uartConfig.callBackFunc = SerialApp_CallBack;
HalUARTOpen (SERIAL_APP_PORT, &uartConfig);
程序首先定义了halUARTCfg类型的变量uartConfig,用来配置跟串口功能相关的波特率、流控制等等,其中最重要的是uartConfig.callBackFunc=SerialApp_CallBack。Zstack协议栈中大量使用了回调函数(如消息响应函数),这样做就可以让系统在合适的时候自动调用来执行一些后续工作。在这里SerialApp_CallBack就是串口消息响应函数,它将负责处理我们通过串口发送给CC2530的数据。SerialApp中的SerialApp_CallBack函数比较简单,我们不打算在这个工程的基础上实现灯的远程控制。
打开X:\Texas Instruments\ZStack-CC2530-2.5.1a\Projects\zstack\HomeAutomation\Sample
Switch\CC2530DB\SampleSwitch,仿照SerialApp的串口初始化配置,我们在zcl_samplesw.c的zclSampleSw_Init函数中添加如下代码:
halUARTCfg_t uartConfig;
uartConfig.configured = TRUE; // 2x30 don't care - see uart driver.
uartConfig.baudRate = HAL_UART_BR_9600;
uartConfig.flowControl = FALSE;
uartConfig.flowControlThreshold = 256; // 2x30 don't care - see uart driver.
uartConfig.rx.maxBufSize = 256; // 2x30 don't care - see uart driver.
uartConfig.tx.maxBufSize = 256; // 2x30 don't care - see uart driver.
uartConfig.idleTimeout = 6; // 2x30 don't care - see uart driver.
uartConfig.intEnable = TRUE; // 2x30 don't care - see uart driver.
uartConfig.callBackFunc = sw_SerialCallBack;
HalUARTOpen (HAL_UART_PORT_0, &uartConfig);
在zcl_samplesw.c中还要添加sw_SerialCallBack函数:
static void sw_SerialCallBack(uint8 port, uint8 event)
{
if ((event & (HAL_UART_RX_FULL | HAL_UART_RX_ABOUT_FULL | HAL_UART_RX_TIMEOUT)) &&!SerialApp_TxLen)
{
if(!SerialApp_TxLen)
SerialApp_TxLen=HalUARTRead(HAL_UART_PORT_0,SerialApp_RxBuf, SERIAL_APP_RX_MAX);
if(SerialApp_TxLen>2)
{
if(SerialApp_RxBuf[0]==1)
{
zclSampleSw_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
zclSampleSw_DstAddr.endPoint = SAMPLELIGHT_ENDPOINT;
zclSampleSw_DstAddr.addr.shortAddr = SerialApp_RxBuf[1]*256+SerialApp_RxBuf[2];
zclGeneral_SendOnOff_CmdToggle( SAMPLESW_ENDPOINT, &zclSampleSw_DstAddr, false, 0 );
}
}
SerialApp_TxLen=0;
}
}
该回调函数在CC2530串口接收到数据时被自动调用,判断接收到数据长度并检查第一个数据是否为“1”。如果是“1”,那么程序将发送Toggle命令,实现灯光的远程开关控制,数据的第二和第三组数据代表着目标设备的地址。说到无线指令发送函数,大家也许对zclGeneral_SendOnOff_CmdToggle非常陌生,更多的接触到的可能是AF_DataRequest。其实如果我们深入查看zclGeneral_SendOnOff_CmdToggle就会发现它最终也是调用了AF_DataRequest。
有发送程序,自然也需要有接收程序,我们打开X:\Texas Instruments\ZStack-CC2530-2.5.1a\Projects\zstack\HomeAutomation\ SampleLight\CC2530DB\ SampleLight,在zcl_samplelight.c中已经有了开关处理函数zclSampleLight_OnOffCB,该函数的最后一段代码是:
// In this sample app, we use LED4 to simulate the Light
if ( zclSampleLight_OnOff == LIGHT_ON )
HalLedSet( HAL_LED_4, HAL_LED_MODE_ON );
else
HalLedSet( HAL_LED_4, HAL_LED_MODE_OFF );
函数首先会判断当前LED4的亮灭情况,如果LED4处于点亮状态,程序就熄灭该灯,否则将点亮LED4。我们也可以根据实际使用情况进行修改,选择合适的LED进行开关操作。
本文为与非网月光码头原创,未经允许谢绝转载。
更多内容请见:【深度分析Zigbee】Zigbee技术知多少?资深大牛对对碰
----------------------------
主讲嘉宾简 介:网名:月光码头。毕业于中国科学院电子学研究所,主要从事zigbee物联网方向的应用研究,尤其擅长TI RF芯片、和Silicon Lab MCU芯片的使用。现就职于上海理滋芯片设计公司,任研发部门经理,主要从事智能家居产品的设计开发,拥有5年多的zigbee软硬件开发经验。
------------------
推荐技术讲座:
听东北人讲天线:每周一个实例,个个经典!(CST仿真实践全包括)
【ADS学习小组】课程汇总(火烽主讲)
【HFSS学习小组】课程汇总(木木主讲)
|
|