新大陆zigbee点对点工程库函数解析
摘要:
新大陆为了方便开发者使用他们的zigbee进行点对点开发提供了一个工程文件,在这里你可以使用工程文件进行zigbee的点对点通信的开发
其中也包含了许多函数例如:ADC采样,温湿度传感器!!所以下面我们来对其中一些比赛经常会使用到的函数进行详细的解答!!!
一、首先分析库函数当中的main.c 样
#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 "sensor_drv/sensor.h"
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
/*****点对点通讯地址设置******/
#define RF_CHANNEL xx // 频道 11~26
#define PAN_ID 0xXXXX //网络id
#define MY_ADDR 0xXXXX //本机模块地址
#define SEND_ADDR 0xXXXX //发送地址
/**************************************************/
static basicRfCfg_t basicRfConfig;
// 无线RF初始化
void ConfigRf_Init(void)
{
basicRfConfig.panId = PAN_ID;
basicRfConfig.channel = RF_CHANNEL;
basicRfConfig.myAddr = MY_ADDR;
basicRfConfig.ackRequest = TRUE;
while(basicRfInit(&basicRfConfig) == FAILED);
basicRfReceiveOn();
}
/********************MAIN************************/
void main(void)
{
halBoardInit();//选手不得在此函数内添加代码
ConfigRf_Init();//选手不得在此函数内添加代码
while(1)
{
/* user code start */
/* user code end */
}
}
这就是工程文件上面的main.c文件(习惯性的叫法)我们都是在这个文件上面进行开发的,他们也帮我们分好了模块,其中可以看出
在进行zigbee点对点通信时要设置:
1:同一个RF_CHANNEL频道
2:同一个PAN_ID网络ID
3:不同的MY_ADDR本机地址和SEND_ADDR接收地址
/*****点对点通讯地址设置******/
#define RF_CHANNEL xx // 频道 11~26
#define PAN_ID 0xXXXX //网络id
#define MY_ADDR 0xXXXX //本机模块地址
#define SEND_ADDR 0xXXXX //发送地址
/**************************************************/
注:设置好我们的参数才是我们可以完成点对点通信的基础!!!
二、在通信当中常用到的函数解析
1:无线发送函数
zigbee的无线发送函数
uint8 basicRfSendPacket(uint16 destAddr, uint8 *pPayload, uint8 length)
位于工程文件basicrf的basicrf.c文件中(通信函数都是在这个文件下的)
无线发送函数
>本模块向另一个模块(destAdr)发送特定长度(length)的uint8 *的数据(pPayload),返回成功或失败
例如:
unsigned char dat_send;
dat_send=0;
basicRfSendPacket(SEND_ADDR,&dat_send,1);
2:无线接收函数
zigbee的无线接收函数
判断是否接收到无线数据的函数
uint8 basicRfPacketIsReady(void)
位于工程文件basicrf的basicrf.c文件中
>判断是否接收到数据包,返回值是true或者false如果为true表示接收到数据包可以被下一个更高层读取,false则相反
无线接收函数
uint8 basicRfReceive(uint8 *pRxData, uint16 len, int16 *pRssi)
位于工程文件basicrf的basicrf.c文件中
>定义一个uint8 *类型的变量去接收len长度的数据,pRssi参数表示保存最后一个数据包文件的范围,可以为NULL
例如:
unsigned char dat_recv;
if(basicRfPacketIsReady()) //判断是否接收到数据包
{
basicRfReceive(&dat_recv,1,NULL);
if(dat_recv==0) //为0的时候D3亮
{
D3=1;
}
}
3:延时函数
库当中提供了两种延时函数(位于工程文件common的hal_mcu.c文件中)
分别是微秒级延时函数,毫秒级延时函数因为微秒级在开发中极少用到所以我们以毫秒级延时函数举例
void halMcuWaitMs(uint16 msec)
毫秒级延时函数
例如:
halMcuWaitMs(10);
void halMcuWaitUs(uint16 usec)
微秒级延时函数
例如:
与毫秒级延时函数同理
4:串口函数
串口函数(位于工程文件common的hal_uart.c)
默认情况下当你使用库中的串口收发函数,串口波特率默认情况下都是115200
如果你要串口通信的设备例如新大陆的RGB控制盒的波特率是9600
这个时候你可以使用:
void halUartInit(uint32 baud)
对其进行波特率的设置
例如:
halUartInit(9600);
串口发送函数
uint16 halUartWrite(uint8 *buf, uint16 len)
>需要发送特定长度(len)的uint8 *类型的数据(buf)
例如:
字符:
halUartWrite("helloworld",10);
中文:
halUartWrite("你好",4);
串口接收函数
uint16 halUartRead(uint8 *buf, uint16 len)
>定义一个uint8 *类型的变量去接受长度为(len)的数据
例如:
unsigned char dat_Recv[1];
if(halUartRead(dat_Recv,sizeof(dat_Recv)))
{
halMcuWaitMs(100);
if(dat_Recv[0]=='a')
{
P1=0x02;
}
memset(dat_Recv,0,sizeof(dat_Recv)); //判断完之后需要清空数组
}
5:hal库函数
对引脚进行电平翻转
#define MCU_IO_TGL(port, pin) MCU_IO_TGL_PREP(port, pin)
例如
MCU_IO_TGL(1,0) //对引脚P1_0进行电平翻转
注:此处我只拿一项进行举例 如果需要了解更多可以去工程文件当中查看hal_cc8051.h文件
6:串口输出
按照printf格式打印输出字符串至串口中
函数位于UART_PRINT.c文件当中
原码展示
void uart_printf(char *fmt,...)
{
va_list ap;
char str[256];
va_start(ap,fmt);
vsprintf(str,fmt,ap);
UartWrite((uint8 *)str,strlen(str));
va_end(ap);
}
例如:
uart_printf("你好"); //与printf用法一致只不过这里是重定向到串口输出而不是控制台
三、关于使用库当中的ADC转换函数进行开发
工程文件通过ADC转换获取电压值源码
uint16 get_adc(void)
{
int32 value;
hal_adc_Init(); // ADC初始化
ADCIF = 0; //清ADC 中断标志
//采用基准电压avdd5:3.3V,通道0,启动AD转化
ADCCON3 = (0x80 | 0x10 | 0x00);
while ( !ADCIF )
{
; //等待AD转化结束
}
value = ADCH;
value = value<< 8;
value |= ADCL;
if(value&0x8000)
value=0;
// AD值转化成电压值
// 0 表示 0V ,32768 表示 3.3V
// 电压值 = (value*3.3)/32768 (V)
value = (value * 330);
value = value >> 15; // 除以32768
// 返回分辨率为0.01V的电压值
return (uint16)value;
}
>关于ADC的详细转换后期会详细说明
>在这里我们只要会使用get_adc()获取到电压值即可!!
例如:
uint16 value
value=(double)get_adc()/100*250; //获取光照值
补:光照转换公式
获取光照是使用ADC协议的!!
光照值 = (5/2.0)*(电压值)*100.0)
四、关于使用库函数获取温湿度光照三合一传感器温湿度数据
在sensor_drv文件目录下你会发现sht.c(.c文件当中含有两种系列的初始化和采集函数)sh1x.c、sht3x.c
库文件支持两种类型的温湿度传感器分别SHT1x列和SHT3x列的温湿度传感器
这边我们的温湿度三合一传感器我们是使用的SHT3x系列的所以我们需要在主函数当中调用sht3x.c
(详细源码在sht.c文件当中)
温湿度传感器初始化函数
> void SHT_Init(void)
(详细源码在sht.c文件当中)
获取温湿度函数
> void call_sht11(float *tem, float *hum) //注:此函数会返回两个浮点型的数据分别是温度和湿度
使用案例:
float temp,humi; //用于接收温湿度
SHT_Init();
while(1)
{
call_sht11(&temp,&humi);
uart_printf("温度:%.2f ℃,湿度:%.2f RH,temp,humi);
halMcuWaitMs(1000);
}
最后:
这些也只是本人平时训练比较常用的函数,如果大家有补充或者发现漏洞欢迎各位在评论区下指点一二!!!我们互相学习!!!
如果需要库文件也可以私聊!