ZigBee组网学习笔记(三 )--协议栈串口实验
串口通訊的流控提供了由于某種原因不能進行通訊時阻塞通訊的一種機制。流控可以使數據接收設備在不能接收數據時通知數據發送設備,使其停止發送。串口的流控經常采用硬件流控和軟件流控兩種方式。開發串口通訊程序的過程中,可根據實際需要決定是否采用流控,采用硬件流控還是軟件流控。使用控件Mscomm32開發串口通訊程序簡單直接,若需要計算機協調與外設的數據傳數時,這種方法不能滿足要求;直接調用WIN32API函數的開發串口通訊程序,可以靈活的對串口進行設置,但需要較多的Windows編程背景知識。
1、串口初始化
以前,配置串口號、波特率、流控、校驗位,配置好寄存器,然后使用。?
現在,在workspace下找到HAL\Target\CC2530EB\drivers的hal_uart.c文件,可以看到里面已經包括了串口初始化、發送、接收等函數。
workspace上的MT層,發覺有很多基本函數,前面帶MT。包括MT_UART.C,我們打開這個文件。看到MT_UartInit()函數,這里也有一個串口初始化函數,沒錯Z-stack上有一個MT層,用戶可以選用MT層配置和調用其他驅動。進一步簡化了操作流程。
***************************************************
SampApp.c
SampApp_Init()
SampApp_TransID() = 0;
MT_UartInit();
***************************************************
進入MT_UartInit()修改相應初始化配置
void MT_UartInit ()
{
? halUARTCfg_t uartConfig;
? /* Initialize APP ID */
? App_TaskID = 0;
? /* 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;
#if defined (ZTOOL_P1) || defined (ZTOOL_P2)//P1和P2則是串口0和串口1
? uartConfig.callBackFunc ? ? ? ? = MT_UartProcessZToolData;
#elif defined (ZAPP_P1) || defined (ZAPP_P2)
? uartConfig.callBackFunc ? ? ? ? = MT_UartProcessZAppData;
#else
? uartConfig.callBackFunc ? ? ? ? = NULL;
#endif
? /* Start UART */
#if defined (MT_UART_DEFAULT_PORT)
? HalUARTOpen (MT_UART_DEFAULT_PORT, &uartConfig);
#else
? /* Silence IAR compiler warning */
? (void)uartConfig;
#endif
? /* Initialize for ZApp */
#if defined (ZAPP_P1) || defined (ZAPP_P2)
? /* Default max bytes that ZAPP can take */
? MT_UartMaxZAppBufLen ?= 1;
? MT_UartZAppRxStatus ? = MT_UART_ZAPP_RX_READY;
#endif
}
#define??MT_UART_DEFAULT_OVERFLOW? FALSE
注意:?2?根線的通訊連接務必關流控,不然是永遠收發不了?信息的。
***************************************************
***************************************************
2、登記任務號
void SampleApp_Init( uint8 task_id )
MT_UartInit();
MT_UartRegisterTaskID(task_id);//登記任務號
把串口事件通過 task_id 登記在 SampleApp_Init();
3、串口發送
void SampleApp_Init( uint8 task_id )
MT_UartInit();
MT_UartRegisterTaskID(task_id);//登記任務號
? ? ? ?HalUARTWrite(0, "Hello,world\n", 12); //(串口, 字符, 字符個數)
***************************************************
SampleApp.c
#include ?"MT_UART.h" //串口頭文件引用?
***************************************************
選擇 CoordinatorEB, 點解下載并調試,全速運行。可以看到串口助手收到信息。 發現?Hello?World?后面有一小段亂碼。這是?Z-stack ?MT?層定義的串口發送格式,還有液晶提示信息。如果不想要的可以在預編譯地方Project--Options--C/C++ Compiler--Preproce--Defined symbols 把?MT?和?LCD?相關內容注釋。如:ZTOOL_P1
xMT_TASK
xMT_SYS_FUNC
xMT_ZDO_FUNC
xLCD_SUPPORTED=DEBUG
xMT_TASK:?表示沒有定義?MT_TASK,也就是不定義了。? 改好的重新編譯再下載,按復位鍵,觀察串口已經沒有亂碼了。
拓展:
我們在協議棧里再做一個測試,在?osal_start_system()函數里?for(;;)里加入:? HalUARTWrite(0,”Hello,World\n”,12);? 下載運行后發現串口不停地接收到?Hello,World。 這就證明了前一節的協議棧運行后會在這個函數里不停地循環查詢任務、執行任務。
這只是一個演示用的方法,實際應用中你可 千萬不能有把串口發送函數弄到這個位置,然后給?PC?發信息。 因為這 破壞了協議棧任務輪詢的工作原則,相當于我們普通單片機不停用?Delay?延時函數一樣,是極其低效的。
總結
以上是生活随笔為你收集整理的ZigBee组网学习笔记(三 )--协议栈串口实验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: xilinx A7芯片介绍
- 下一篇: 计算机组装总结及心得50字,员工自我评价