zigbee z-stack 同时使用两个串口
2016-02-01 00:30
363 查看
夜晚,写此篇博客,晚间调代码已经成为习惯,似乎只有进入黑夜,一切都安静下来,才能进入写代码的状态,耳机里循环放着《悟空》、《yesterday once more》,代码越写越多,思路也越来越清晰。好了,不矫情了,进入正题。
如何在z-stack中同时使用两个串口,zstack较新的版本支持同时使用两个串行口,不过要求一个是DMA方式另一个是ISR方式,具体操作方法如下:
1)找到workspace中项目名称,点击右键,在弹出的下拉菜单中点击options..c/c++compiler->preprocessor选项卡,找到define symbols: 查看是否有ZTOOL_P1,如果没有添加一个,OK确定。
2)在IAR的编译选项中定义宏,HAL_DMA=TRUE,HAL_UART=TRUE,HAL_UART_DMA=1,HAL_UART_ISR=2。
具体操作:在HAL层,hal_board_cfg.h文件中修改
#if HAL_UART
#ifndef HAL_UART_DMA
#if HAL_DMA
#if (defined ZAPP_P2) || (defined ZTOOL_P2)
#define HAL_UART_DMA 1
#else
#define HAL_UART_DMA 1
#endif
#else
#define HAL_UART_DMA 0
#endif
#endif
#ifndef HAL_UART_ISR
#if HAL_UART_DMA // Default preference for DMA over ISR.
#define HAL_UART_ISR 2
#elif (defined ZAPP_P2) || (defined ZTOOL_P2)
#define HAL_UART_ISR 2
#else
#define HAL_UART_ISR 1
#endif
#endif
红色为修改的地方,总归的目的就是HAL_DMA=TRUE,HAL_UART=TRUE,HAL_UART_DMA=1,HAL_UART_ISR=2。具体实现方式有很多,上面我写的只是一种,如果你懂源代码的意思就很容易修改。注意我这种修改方法编译选项不能加ZTOOL_P2。
此处还有一个重要的修改,LCD会影响串口初始化。
#ifndef HAL_LCD
#define HAL_LCD FALSE
#endif
这儿修改过之后,hal_lcd.c可能出现编译错误一类的情况,请自行想办法解决,这是因为本身z-stack源代码缺陷造成的,相信你是可以解决的。
3)在程序初始化时,HalUARTOpen()打开串行口。
具体方法:除了正常的MT层void MT_UartInit ()函数以外,我另加加个一个初始化函数void MT_Uart1Init ()
void MT_Uart1Init ()
{
halUARTCfg_t uartConfig;
/* UART Configuration */
uartConfig.configured = TRUE;
uartConfig.baudRate = MT_UART_DEFAULT_BAUDRATE;
uartConfig.flowControl = MT_UART_DEFAULT_OVERFLOW;
uartConfig.flowControlThreshold = MT_UART_DEFAULT_THRESHOLD;
uartConfig.rx.maxBufSize = MT_UART_DEFAULT_MAX_RX_BUFF;
uartConfig.tx.maxBufSize = MT_UART_DEFAULT_MAX_TX_BUFF;
uartConfig.idleTimeout = MT_UART_DEFAULT_IDLE_TIMEOUT;
uartConfig.intEnable = TRUE;
uartConfig.callBackFunc = MT_UartProcessZToolData; //回调函数可以自己编写
HalUARTOpen (HAL_UART_PORT_1, &uartConfig);
}
也就是说串口使用之前要调用这两个串口初始化函数,两个串口的初始化分别对应。
4)正常串行口读写。
HalUARTWrite(HAL_UART_PORT_1,"Hello World\n",12);
想自己区分回调函数,请参考http://blog.csdn.net/shiwaxinbin/article/details/9004256 的回调函数
5)关于硬件的说明,如果你去看cc2530的用户指南,你会发现
如果你深入研究z-stack的文件hal_uart_isr.c就能知道,上面设置的#define HAL_UART_DMA 1 实际上就是说用alt.1模式,也就是说UART0 的IO口是P0.2和P0.3,我们设置HAL_UART_ISR=2
,也就是说UART1用的是alt.2模式,即P1.6和P1.7。
历时两天才解决这个难题,走了不少弯路,不过很多也是因为基础不扎实的原因,以此向大家共享经验,如有错误,请见谅,联系我修改。转发请注明出处。
如何在z-stack中同时使用两个串口,zstack较新的版本支持同时使用两个串行口,不过要求一个是DMA方式另一个是ISR方式,具体操作方法如下:
1)找到workspace中项目名称,点击右键,在弹出的下拉菜单中点击options..c/c++compiler->preprocessor选项卡,找到define symbols: 查看是否有ZTOOL_P1,如果没有添加一个,OK确定。
2)在IAR的编译选项中定义宏,HAL_DMA=TRUE,HAL_UART=TRUE,HAL_UART_DMA=1,HAL_UART_ISR=2。
具体操作:在HAL层,hal_board_cfg.h文件中修改
#if HAL_UART
#ifndef HAL_UART_DMA
#if HAL_DMA
#if (defined ZAPP_P2) || (defined ZTOOL_P2)
#define HAL_UART_DMA 1
#else
#define HAL_UART_DMA 1
#endif
#else
#define HAL_UART_DMA 0
#endif
#endif
#ifndef HAL_UART_ISR
#if HAL_UART_DMA // Default preference for DMA over ISR.
#define HAL_UART_ISR 2
#elif (defined ZAPP_P2) || (defined ZTOOL_P2)
#define HAL_UART_ISR 2
#else
#define HAL_UART_ISR 1
#endif
#endif
红色为修改的地方,总归的目的就是HAL_DMA=TRUE,HAL_UART=TRUE,HAL_UART_DMA=1,HAL_UART_ISR=2。具体实现方式有很多,上面我写的只是一种,如果你懂源代码的意思就很容易修改。注意我这种修改方法编译选项不能加ZTOOL_P2。
此处还有一个重要的修改,LCD会影响串口初始化。
#ifndef HAL_LCD
#define HAL_LCD FALSE
#endif
这儿修改过之后,hal_lcd.c可能出现编译错误一类的情况,请自行想办法解决,这是因为本身z-stack源代码缺陷造成的,相信你是可以解决的。
3)在程序初始化时,HalUARTOpen()打开串行口。
具体方法:除了正常的MT层void MT_UartInit ()函数以外,我另加加个一个初始化函数void MT_Uart1Init ()
void MT_Uart1Init ()
{
halUARTCfg_t uartConfig;
/* UART Configuration */
uartConfig.configured = TRUE;
uartConfig.baudRate = MT_UART_DEFAULT_BAUDRATE;
uartConfig.flowControl = MT_UART_DEFAULT_OVERFLOW;
uartConfig.flowControlThreshold = MT_UART_DEFAULT_THRESHOLD;
uartConfig.rx.maxBufSize = MT_UART_DEFAULT_MAX_RX_BUFF;
uartConfig.tx.maxBufSize = MT_UART_DEFAULT_MAX_TX_BUFF;
uartConfig.idleTimeout = MT_UART_DEFAULT_IDLE_TIMEOUT;
uartConfig.intEnable = TRUE;
uartConfig.callBackFunc = MT_UartProcessZToolData; //回调函数可以自己编写
HalUARTOpen (HAL_UART_PORT_1, &uartConfig);
}
也就是说串口使用之前要调用这两个串口初始化函数,两个串口的初始化分别对应。
4)正常串行口读写。
HalUARTWrite(HAL_UART_PORT_1,"Hello World\n",12);
想自己区分回调函数,请参考http://blog.csdn.net/shiwaxinbin/article/details/9004256 的回调函数
5)关于硬件的说明,如果你去看cc2530的用户指南,你会发现
如果你深入研究z-stack的文件hal_uart_isr.c就能知道,上面设置的#define HAL_UART_DMA 1 实际上就是说用alt.1模式,也就是说UART0 的IO口是P0.2和P0.3,我们设置HAL_UART_ISR=2
,也就是说UART1用的是alt.2模式,即P1.6和P1.7。
历时两天才解决这个难题,走了不少弯路,不过很多也是因为基础不扎实的原因,以此向大家共享经验,如有错误,请见谅,联系我修改。转发请注明出处。
相关文章推荐
- Linux串口通信
- PHP通过串口实现发送短信
- python简单程序读取串口信息的方法
- Python操作串口的方法
- python调用Moxa PCOMM Lite通过串口Ymodem协议实现发送文件
- 51单片机的中断整理
- linux串口编程(termios)相关的使用问题
- QT 串口的监控
- linux下tty,控制台,虚拟终端,串口,console(控制台终端)详解
- 电脑串口及并口连接线大全
- RS232C串口通信接线方法(三线制)
- [Unity3D]Unity3D使用串口的设置
- STM32串口操作相关事项
- 串口与并口的区别
- windows cc2530 6lowpan(contiki)报文监控
- Linux串口编程
- 将LINUX的控制台定向到串口终端
- zigbee网蜂cc2530组播实验,基于SampleApp例程
- v虚拟机Linux(Fedora10)下USB转串口的使用, minicom: cannot open /dev/ttyUSB0的解决
- Python 调用 GSM A6