自学Zigbee
记录学习过程中的一些想法,硬件设备和学习资料均来自安联德(淘宝)一、IAR
- 在用高版本的IAR软件编译文件时,遇到一个问题:Error[e46]: Undefined external “?V1” referred in AF
解决方案是:https://blog.csdn.net/u010898680/article/details/104246020 - Error[e16]: Segment ISTACK (size: 0xc0 align: 0) is too long for segment def
解决方案是:将options中的16改成8,产生的原因也是软件版本高于源文件版本。
二、zigbee
需要做的事情:
- 数据从哪里来,怎么储存和处理
- 系统的设备之间的通讯顺序
- 调用组网函数组建网络
- 调用无线数据发送函数发送数据
- 调用睡眠函数
在workspace目录下最重要的两个文件夹是Zmain和App,开发主要在App文件夹进行,也是添加自己代码的地方,主要修改SampleApp.c和.h文件,增加传感器的话,要增加相应的驱动,在.c文件中调用即可。
1.串口
- 在SampleApp.c中串口初始化
MT_UartInit(); //串口初始化
- 跳转到MT_UART.C中
void MT_UartInit ()
{
halUARTCfg_t uartConfig;
/* Initialize APP ID */
App_TaskID = 0;
/* UART Configuration */
uartConfig.configured = TRUE;
uartConfig.baudRate = MT_UART_DEFAULT_BAUDRATE;//设置比特率,改成115200
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;
- 注册串口任务
MT_UartRegisterTaskID(task_id); //注册串口任务
2.广播
广播模式:将数据包发送给网络的每一个设备,地址模式为AddrBroadcast。
发送部分:设置发送内容,启动定时器,周期性发送!
当网络状态发生变化:
接受部分:
主要是两句命令,AF_INCOMING_MSG_CMD与ZDO_STATE_CHANGE。
case AF_INCOMING_MSG_CMD:
SampleApp_MessageMSGCB( MSGpkt );
break;
// Received whenever the device changes state in the network
case ZDO_STATE_CHANGE:
SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status);
if ( //(SampleApp_NwkState == DEV_ZB_COORD) ||
(SampleApp_NwkState == DEV_ROUTER)
|| (SampleApp_NwkState == DEV_END_DEVICE) )
{
// Start sending the periodic message in a regular interval.
osal_start_timerEx( SampleApp_TaskID,
SAMPLEAPP_SEND_PERIODIC_MSG_EVT,
SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT );
}
3.建网流程