首页  /  新游首发  /  zigbee点对点对点操作 From zigbee菜鸟笔记(九)

zigbee点对点对点操作 From zigbee菜鸟笔记(九)

新游首发 9311

一.cc2530无线通信

(一):BasciRF如何学习

在前面我们学习到了zigbee的基础裸机知识,算是对cc2530的芯片有了一定的了解,今天我们讲的是关于BasciRF通信,BasciRF是基于zigbee通信的一个简单的协议通信,今天讲的BasciRF并非是TI公司原BasciRF工程,是新大陆公司用于物联网教学自己设计的,难度其实没啥区别,都一样,在后面的学习中,我们主要学习的是如何调用函数,学会自己去看函数的注释,最好具有好一点C语言的功底。

(二).通信知识

zigbee通信方式主要有三种:点播,广播。组播。点播,就是点对点通信,也是这一节要讲述的东西,点播只在二个设备间进行通讯,不允许第三方设备接收到消息。组播,就是把网络节点中的设备进行小组划分,只允许同组号的设备接收到消息。广播,就是由一个设备发出消息,允许所有设备接受到。

二.了解BasciRF的结构框架

(1)app是存放主程序的Group 我们在这个框架里开发就只需要再这里写代码 (2)basicrf 是存放无线接受发送与初始化有关的内容, (3)board存放硬件外设的代码,例如LED等等初始化都可以在这里找到; (4)commom里面存放一些 通用的操作,例如时钟 GPIO 还有一些最底层的都在这里 (5)mycode是我自己自己调试代码建立的Group可以忽略。 (6)util 存放的是通用的库 这里我没研究过 基本用不到

三.点对点知识了解

要想要二个cc2530开发板进行通信,就必须要吧rf无线通信设置好,在给定的框架中,我们只需要设置几个简单的参数,就可以让完成RF的初始化工作

(一)channel:zigbee的信道号 一共十六个11~26 必须要二个在同一个channel才可以通信 (二)panId:zigbee的网络id 范围在0-0xFFFF之间; (三)本端地址:要有本端ID 这个ID在以后的组网中唯一, (四)发送地址:发送方发送消息时必须要知道接受方的ID才可以发送到对端。

四.BasciRF函数了解

(1)串口内容长度检测

//-------------------------------------------------------------------

// @fn halUartRxLen()

// @brief Calculate Rx Buffer length - the number of bytes in the buffer.

// @param none

// @return length of current Rx Buffer

//-------------------------------------------------------------------

uint16 halUartRxLen(void)

{

return HAL_UART_ISR_RX_AVAIL();

}

解释:返回的值为串口消息的字节长度

(2)串口接收函数

//-------------------------------------------------------------------

// @fn halUartRead

// @brief Read a buffer from the UART

// @param buf - valid data buffer at least 'len' bytes in size

// len - max length number of bytes to copy to 'buf'

// @return length of buffer that was read

//-------------------------------------------------------------------

uint16 halUartRead(uint8 *buf, uint16 len)

{

uint16 cnt = 0;

while ((uartCfg.rxHead != uartCfg.rxTail) && (cnt < len))

{

*buf++ = uartCfg.rxBuf[uartCfg.rxHead++];

if (uartCfg.rxHead >= HAL_UART_ISR_RX_MAX)

{

uartCfg.rxHead = 0;

}

cnt++;

}

return cnt;

}

上面有注释:函数作用是从串口接受到len个字节的内容存储到buf中

(三)BasciRF发送函数

//-------------------------------------------------------------------

// @fn basicRfSendPacket

// @brief Send packet

// @param destAddr - destination short address

// pPayload - pointer to payload buffer. This buffer must be

// allocated by higher layer.

// length - length of payload

// txState - file scope variable that keeps tx state info

// mpdu - file scope variable. Buffer for the frame to send

// @return basicRFStatus_t - SUCCESS or FAILED

//-------------------------------------------------------------------

uint8 basicRfSendPacket(uint16 destAddr, uint8 *pPayload, uint8 length)

{

uint8 mpduLength;

uint8 status;

// Turn on receiver if its not on

if (!txState.receiveOn)

{

halRfReceiveOn();

}

// Check packet length

length = MIN(length, BASIC_RF_MAX_PAYLOAD_SIZE);

// Wait until the transceiver is idle

return status;

}

函数作用:将length字节长度的内容的pPayload发送到destAddr地址处

(4)初始化RF

void ConfigRf_Init(void)

{

basicRfConfig.panId = PAN_ID; //zigbee的ID号设置

basicRfConfig.channel = RF_CHANNEL; //zigbee的频道设置

basicRfConfig.myAddr = MY_ADDR; //设置本机地址

basicRfConfig.ackRequest = TRUE; //应答信号

while(basicRfInit(&basicRfConfig) == FAILED); //检测zigbee的参数是否配置成功

basicRfReceiveOn(); // 打开RF

}

函数功能:初始化RF 这里这个结构体就不举例说明了,

同样的下面还有RF接受等等我就不一 一说明了 照着注释来 ,有手就行 哈哈哈。

(五)代码演示

功能要求 串口发送内容到A A RF 到B B接受到消息打印到串口,同理B可以到A;

TIP :如果出现接受问题,加上delay延时函数 延时几毫秒即可

#include "hal_defs.h"

#include "hal_cc8051.h"

#include "hal_int.h"

#include "hal_mcu.h"

#include "hal_board.h"

#include "hal_led.h"

#include "hal_rf.h"

#include "basic_rf.h"

#include "hal_uart.h"

#include

#include

#include

#include "TIMER.h"

#include "hal_uart.h"

#define MAX_SEND_BUF_LEN 128

#define MAX_RECV_BUF_LEN 128

unsigned char len = 0; //串口数据接收长度

#define MAX_UART_SEND_BUF_LEN 128

#define MAX_UART_RECV_BUF_LEN 128

uint8 uTxData[MAX_UART_SEND_BUF_LEN];

uint8 uRxData[MAX_UART_RECV_BUF_LEN];

//uRxData[0]={'1'};

uint16 uTxlen = 0;

uint16 uRxlen = 0;

#define RF_CHANNEL 24

#define PAN_ID 0x11

#define MY_ADDR 0x1015

#define SEND_ADDR 0xAC3A

static basicRfCfg_t basicRfConfig;

// 无线RF初始化

void ConfigRf_Init(void)

{

basicRfConfig.panId = PAN_ID; //zigbee的ID号设置

basicRfConfig.channel = RF_CHANNEL; //zigbee的频道设置

basicRfConfig.myAddr = MY_ADDR; //设置本机地址

basicRfConfig.ackRequest = TRUE; //应答信号

while(basicRfInit(&basicRfConfig) == FAILED); //检测zigbee的参数是否配置成功

basicRfReceiveOn(); // 打开RF

}

void Recv_UR_Data()

{

len = halUartRxLen();

if(len != 0)

{

len = 0;

halUartRead(uTxData, len);

basicRfSendPacket(SEND_ADDR, uTxData, len);

}

}

void Recv_RF_Data()

{

if(TRUE == basicRfPacketIsReady()) //接收到新的无线数据

{

basicRfReceive(uRxData, 32, NULL);

halUartWrite(uRxData,sizeof(uRxData)/sizeof(uRxData[0]));

}

}

void main(void)

{

halUartInit(38400); //串口初始化下面要用

halBoardInit(); //模块相关资源的初始化

ConfigRf_Init(); //无线收发参数的配置初始化

HAL_LED_SET_1(); //点亮LED1这里是属于直接调用如果设备不符合可以改引脚

HAL_LED_SET_2();

while(1)

{

Recv_UR_Data(); //串口数据接收处理

Recv_RF_Data(); //无线数据接收处理

}

}

zigbee菜鸟笔记(十)无线通信.RSSI链路质量监测 点击进入

联系方式 468078841@qq.com