萌新的Zigbee学习日记(3.4) 协议栈串口

原来是要昨天发的,结果写了一半去做拟真了,今天补上。

流程大致为:

1、串口初始化

2、登记任务号

3、串口发送

第一步:串口初始化串口初始化大家很熟悉,就是配置串口号、波特率、流控、校验位等等。 以前我们都是配置好寄存器然后使用。现在我们在 workspace下找到HAL\Target\CC2530EB\drivers的hal_uart.c 文件,我们可以看到里面已经包括了串口初始化、发送、接收等函数。

之后有一个MT层(Monitor and Test)

进入 MT_UartInit();,修改自己想要的初始化配置,进入函数后,发现代码如下。
1. void MT_UartInit ()
2. {
3. halUARTCfg_t uartConfig;
4. /* Initialize APP ID */
5. App_TaskID = 0;
6. /* UART Configuration */
7. uartConfig.configured = TRUE;
8. uartConfig.baudRate = MT_UART_DEFAULT_BAUDRATE;
9. uartConfig.flowControl = MT_UART_DEFAULT_OVERFLOW;
10. uartConfig.flowControlThreshold = MT_UART_DEFAULT_THRESHOLD;
11. uartConfig.rx.maxBufSize = MT_UART_DEFAULT_MAX_RX_BUFF;
12. uartConfig.tx.maxBufSize = MT_UART_DEFAULT_MAX_TX_BUFF;
13. uartConfig.idleTimeout = MT_UART_DEFAULT_IDLE_TIMEOUT;
14. uartConfig.intEnable = TRUE;
15.
16. #if defined (ZTOOL_P1) || defined (ZTOOL_P2)
17. uartConfig.callBackFunc = MT_UartProcessZToolData;
18. #elif defined (ZAPP_P1) || defined (ZAPP_P2)
19. uartConfig.callBackFunc = MT_UartProcessZAppData;
20. #else
21. uartConfig.callBackFunc = NULL;
22. #endif
23. /* Start UART */
24. #if defined (MT_UART_DEFAULT_PORT)
25. HalUARTOpen (MT_UART_DEFAULT_PORT, &uartConfig);
26. #else
27. /* Silence IAR compiler warning */
28. (void)uartConfig;
29. #endif
30. /* Initialize for ZApp */
31. #if defined (ZAPP_P1) || defined (ZAPP_P2)
32. /* Default max bytes that ZAPP can take */
33. MT_UartMaxZAppBufLen = 1;
34. MT_UartZAppRxStatus = MT_UART_ZAPP_RX_READY;
35. #endif
36. }
第 8 行:uartConfig.baudRate = MT_UART_DEFAULT_BAUDRATE;是配置波特率,
我们 go to definition of MT_UART_DEFAULT_BAUDRATE,
 可以看到:
#define MT_UART_DEFAULT_BAUDRATE HAL_UART_BR_38400
默认的波特率是 38400bps,现在我们修改成 115200bps,修改如下:
#define MT_UART_DEFAULT_BAUDRATE HAL_UART_BR_115200
第 9 行:uartConfig.flowControl = MT_UART_DEFAULT_OVERFLOW;语句是配置流控的,我们进入定义可以看到:
#define MT_UART_DEFAULT_OVERFLOW TRUE
默认是打开串口流控的,如果你是只连了 TX/RX 2 根线的方式务必关流控,像我们功能底板一样。
#define MT_UART_DEFAULT_OVERFLOW FALSE
注意:2 根线的通讯连接务必关流控,不然是永远收发不了信息的。
第 16~22 行:这个是预编译,根据预先定义的 ZTOOL 或者 ZAPP 选择不同的数据处理函数。后面的P1和 P2则是串口 0和串口1。我们用 ZTOOL,串口 0。我们可以在 option——C/C++ 的 CompilerPreprocessor 地
方加入。

第二步:登记任务号

在 SampleApp_Init();刚添加的串口初始化语句下面加入语句: MT_UartRegisterTaskID(task_id);//登记任务号

意思就是把串口事件通过 task_id 登记在 SampleApp_Init();里面。具体作用以后会提及。

第三步:串口发送

经过前面两个步骤,现在串口已经可以发送信息了。

我们在刚刚添加初始 化代码后面加入一条上电提示 Hello World 的语句。 HalUARTWrite(0,"Hello World\n",12); (串口 0,‘字符’,字符个数。)

再在预编译加入以下一些内容:

ZIGBEEPRO

ZTOOL_P1

MT_TASK

MT_SYS_FUNC

MT_ZDO_FUNC

提示:需要在 SampleApp.c 这个文件里加入头文件语句:#include "MT_UART.h"

连接 CC DEBUGGER 和 USB 转串口线,选择 CoordinatorEB-Pro,点解下载并 调试。全速运行,可以看到串口助手收到信息。

显示可以接收代码了,但是我们发现 Hello World 前面有一小段乱码。用十六进制显示,看到是 FE .. .. .. 这是 Z-stack MT 层 定义的串口发送格式,以 FE 开头。详细的以后内容会讲述。如果不想要的可以 在预编译地方把 MT 相关内容注释。

ZIGBEEPRO

ZTOOL_P1

xMT_TASK//xMT_TASK:表示没有定义 MT_TASK,也就是不定义了

xMT_SYS_FUNC

xMT_ZDO_FUNC

我们在协议栈里再做一个测试,在 osal_start_system()函数里 for(;;) 里加入:

HalUARTWrite(0,"Hello,WeBee\n",12);

下载运行后发现串口 不停地接收到 Hello WeBee。

这就证明了前一节的协议栈运行后 会在这个函数里不停地循环查询任务、执行任务。

实际应用中可千万不能有把串口发送函数弄到这个位置然后给 PC 发信息的想法,因为这破坏了协议栈任务轮 询的工作原则,相当于我们普通单片机不停用 Delay 延时函数一样,是极其低 的。

在协议栈串口初始化后

我们打开 SampleApp.C 文件,搜索找到函数:

void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )

 在 case SAMPLEAPP_PERIODIC_CLUSTERID:下面加入

HalUARTWrite(0,"I get data\n",11);//记得添加串口初始化等设置<
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值