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。