当前位置:文档之家› Zstack协议栈对串口进行操作

Zstack协议栈对串口进行操作

Zstack协议栈中如何对串口进行操作

想要使用串口功能,首先要进行初始化操作:

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\Sampl e

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。

相关主题