开发者学堂课程【嵌入式之RFID开发与应用2020版:zigbee无线遥控代码实现】学习笔记与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/665/detail/11135
zigbee无线遥控代码实现
本节课浏览zigbee主网的例子。
点对点通信的例子
把文件中03导出,将project关闭,删除untitled project si4project。重新创建一个工程。因为代码的量比较大,做起来不是很方便。选择install下的debug下的zigbee下的wireless点击确定。
此代码主要作用于遥控器,第一没有OSAL系统,第二不能组网。主要是一对多、一对一或者多对一的通讯。
首先找到main.c,官方提供了函数。点击scr选择components。components中提供的组件是简单的通讯组件。只需要创建main.c,(将编码方式改为UTF-8)在main.c中需要注意:发送数据的时候发给谁;发送目标的PANID和信道是什么;如果对方正在接收数据也正好开启,能够检测到信息的发射,通讯就是成功的。
init uart();
// Config basicRF
basicfConfig.panId = PAN-ID;
basicRfConfig.channel= RF CHANNEL;
basicfConfig.ackRequest=TRUE;
halBoardInit();
halLedset (1);|
halLedSet(2);
halMcuWaitMs(1000);
halLedClear(1):
halLedClear(2);
整个代码一开始的时候就是初始化串口,里面都是针对计算器的操作。
点对点遥控收发数据主要针对填充一个结构体:basicRfCfg-t。只要将这个结构器填正确,不论是收还是发,都没有问题的。
结构体中的成员:
typedef struct {
uint16 myAddr;(地址)
uint16 panId;(网络ID)
uint8 channel;(所使用的信道)
uint8 ackRequest;(是否允许请求应答)
#ifdef SECURITY-CCM
Uint8* securityKey;(安全的key)
Uint8* securityNonce;
所以它的内容填充的很少。那么ID是多少?从0-65535都是可以的。这里给2007,满足16位的范围。
信道的范围是0-26,总共有27个信道。我们这里给的是25,因为0是800多兆,1-10是900多兆,11-24是2.4G,所以这里选的是2.4G.应答设置为真。下面是对键盘的初始化、LED灯的设置,这里设了2个灯,这些都是官方给的,就不去考虑了,而且都是存单片机的操作,很容易看明白的。代码中也有存按键的操作,在文件02.key中的scr中。
POSEL S= ~0X01 ;//设置P00为普通IO口
PODIR S= ~0X01;//按键在P00口,设置为输入模式
POINP &= ~0x0;//打开P00上拉电阻,不影响
按键就是设置输入,然后不断的判断l口的值是否和按下的键是一致的。下去之后看看参考代码即可。
这里是系统帮助完成按键和灯的设置。
halMcuWaitMs(1000);
延时函数,毫秒为单位。后面几个的接口都不是很重要,关键的是下面的内容:
if (appMode == SWITCH)// Transmitter application
appSwitch(&basicRfConfig);
else if (appMode==LIGHT)// Receiver application
appLight(&basicRfConfig);
这个程序有两个功能:1、作为接收方和发射方,如果模式选择的是switch表示属于发射方;如何发射?将结构体构造好之后,直接调到下面的代码中:
uint8 pTxData[APP PAYLOAD_ LENGTH];
// Initialize BasicRF
basicfConfig-›myAddr= SWITCH-ADDR;
if (basicRfInit (bäsicfConfig) ==FAILED) {
HAL ASSERT (FALSE) ;
}
pTxData[0]=LIGHT TOGGLE CMD;
//Keep Receiver off when not needed to save power
basicRfReceiveOff();
首先明确接收方的地址,这里写的是myAddr= SWITCH-ADDR,其实这是对方的地址。将对方的地址明确,并且对数据结构做初始化。初始化的工作主要是设置通信、地址、参数等内容,而且如果设置失败的话,就会再次回到这个函数内。
接下来就是真正的数据:
Ptxdata[APP-PAYLOAD-LENGTH]这里定义的简单,就是1,就是1个字节。这一个字节给的是0。就是发送的长度只有一个字节。现在需要发送,因此就要将接受能力off掉。Basicreceiveoff();这样可以降低功耗,如果是接收方,就把这个设置改为on。让接受方一直在监听信标。在这个循环里面就是判断有没有按下一个按键:
If(halbuttonpushed()==HAL-BUTTON-1)如果按下了这个按键,就把自身口对应的led灯反转一下ha1ledtoggle(1);
最关键的部分:basicRfsendPacke:LIGHT-ADDR
,PTXDATA,APP-PAYLOAD-LENGTH)(上面提到的地址确实是自己的地址,因为发送的时候需要单独填一个地址)这里的地址是destaddr就是目标地址。第二个参数是发送的地址,第三个参数是发的数据多长。所以发送数据就是三要素:目标、源、长度用上面的函数就可以发送了。
那么这个函数basicRfsendPacke是如何发出去的?
这个是企业占位提供的接口,就不用去看了。将后面降低功耗的接口去掉,暂时用不到。只保留这一个 basicRfsendPacke:LIGHT-ADDR
,PTXDATA,APP-PAYLOAD-LENGTH)
接口数据就可以发送出去了。
发出去之后另一方需要用另一个程序,就是light。作为一个接收方,如何做?和上面的代码几乎是一样的,设置接收到的数据方到哪里,设置自己的地址并且初始化,然后使能接收信号。
uint8 pTxData[APP PAYLOAD_ LENGTH];
// Initialize BasicRF
basicfConfig-›myAddr= LIGHT-ADDR;
if (basicRfInit (bäsicfConfig) ==FAILED) {
HAL ASSERT (FALSE) ;
}
basicRfReceiveON();
// Main loop
while (TRUE){
while (!basicRfpacketIsReady());
if (basicRfReceive (pRxData, APP _PAYLOAD_LENGTH, NULL)>0) {
If (oRaDatate) == LIGHi_TOGGLE_ CMO) {
Ha1LedToggle(1);
Ha1LedToggle(2);
接口basicRfpacketIsReady是判断有没有接收到数据。如果接收到数据,返回值为1。取反边0,0刚好退出while循环,进入到下面处理这个数据。怎么处理?
While(TRUE){
While(!basicRfPacketIsReady());
If(basicRfReceive(pRxData,APP_PAYLOAD_LENGTH,NULL)>0)
If(pRxData[0] == LIGHT_TOGGLE_CMD){
halLedToggle(1);
halLedToggle(2);
首先提取数据到APP里面,这个APP _PAYLOAD_LENGTH是提取的数据有多长。在提取参数的时候顺便可以prssl看一下信号的强度。如果不考虑信号的强度的话,就可以忽略这个参数。接下来判断接收到的数据是什么。如果接收到的数据是发送的0,那就可以让灯反转一下,亮的变灭,灭的变亮。
下面将这个程序写一些,首先发射端模式改成SWITCH。LIGHT表示先收接收方的代码。将前面打开的关闭,重新开一个新的工程。
打开之后第一步先编一下,将摄像头打开。编译通过。
这个是接收,先把这个程序先稍进去。
一闪一闪的是LED灯,由于刚刚已经编写过了,现在直接稍就可以了。这是接收的代码。
如何稍发送的代码?
需要将代码light改成switch。
上图是刚刚稍好的一个板子,是接收方。发射方上面有两个按键,按一下就会发射一个信号。
代码很简单,只需要构建一个结构体并且将里面的地址都填好,发给谁,数据是多少,对方就可以收到。
上面提到的一对多,就是上面有多个接收器,他们都设置成相同的信道、网络包括地址的话,是可以进行群发的甚至广播的。也可以一对一的发,也可以多对一的发送,这些发送的过程完全取决于地址怎么设置。
以上就是zigbee点对点通讯的应用。