zigbee保姆级教程:CC2530通讯【串口打印传感器信息】操作步骤讲解+IAR具体流程

1.创建工程文件

工程文件需要嵌套式创建(提高文件的归一性)创建完后如下所示:

zigbee5.6sensor-->CC2530_lib和project

CC2530_lib里包含

project里包含

2.环境配置

三步走

3.创建Group

Group的创建需要和CC2530_lib的内容一致。不添加moudle文件,需多添加一个app文件。创建完的结果如下所示:

4.添加files

添加内容均与CC2530_lib里的文件夹中的.c文件相互对应。添加完的结果如下所示:

5.添加相对路径

6.添加main.c文件

在app里添加两个文件分别为collect.c和sensor.c文件。以collect.c文件添加为例,sensor.c同理

Rebuild All工程。出现两个报错(此报错为main文件中未添加代码,属于正常现象)

7.实现文件collect.c和sensor.c文件的切换

点击Workspace中的collect时,将文件app中的sensor.c文件进行隐藏(将文件app中的collect.c文件进行隐藏同理)

8.代码的编写

collect.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" 


#define MAX_SEND_BUF_LEN  128
#define MAX_RECV_BUF_LEN  128
static uint8 pTxData[MAX_SEND_BUF_LEN]; //定义无线发送缓冲区的大小
static uint8 pRxData[MAX_RECV_BUF_LEN]; //定义无线接收缓冲区的大小

#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]; //定义串口接收缓冲区的大小
uint16 uTxlen = 0;
uint16 uRxlen = 0;

 
/*****点对点通讯地址设置******/
#define RF_CHANNEL                      21      // 1频道 11~26
#define PAN_ID                         0x1378   //2网络id 
#define MY_ADDR                        0x1234   //3本机模块地址
#define SEND_ADDR                      0x5678   //4发送地址
/**************************************************/
static basicRfCfg_t basicRfConfig;
/******************************************/
void MyByteCopy(uint8 *dst, int dststart, uint8 *src, int srcstart, int len)
{
    int i;
    for(i=0; i<len; i++)
    {
        *(dst+dststart+i)=*(src+srcstart+i);
    }
}
/****************************************************/
uint16 RecvUartData(void)
{   
    uint16 r_UartLen = 0;
    uint8 r_UartBuf[128]; 
    uRxlen=0; 
    r_UartLen = halUartRxLen();
    while(r_UartLen > 0)
    {
        r_UartLen = halUartRead(r_UartBuf, sizeof(r_UartBuf));
        MyByteCopy(uRxData, uRxlen, r_UartBuf, 0, r_UartLen);
        uRxlen += r_UartLen;
        halMcuWaitMs(5);   //这里的延迟非常重要,因为这是串口连续读取数据时候需要有一定的时间间隔
        r_UartLen = halUartRxLen();       
    }   
    return uRxlen;
}
/**************************************************/
// 无线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
}

/********************MAIN START************************/
void main(void)
{
   uint16 len = 0;
   halBoardInit();
   ConfigRf_Init();
   halLedSet(1);
   halLedSet(2);
   while(1){
     if(basicRfPacketIsReady()){
      halLedToggle(4);
      len = basicRfReceive(pRxData,MAX_RECV_BUF_LEN,NULL);
      halUartWrite(pRxData,len);
     }
   }
}
/************************MAIN END ****************************/

sensor.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 "UART_PRINT.h" 
#include "TIMER.h"
#include "get_adc.h"
#include "sh10.h"
#include <string.h>

#define MAX_SEND_BUF_LEN  128  
#define MAX_RECV_BUF_LEN  128
static uint8 pTxData[MAX_SEND_BUF_LEN]; //定义无线发送缓冲区的大小
static uint8 pRxData[MAX_RECV_BUF_LEN]; //定义无线接收缓冲区的大小

#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]; //定义串口接收缓冲区的大小
uint16 uTxlen = 0;
uint16 uRxlen = 0;


/*****点对点通讯地址设置******/
#define RF_CHANNEL                      21      // 1频道 11~26
#define PAN_ID                         0x1378   //2网络id 
#define MY_ADDR                        0x5678   //3本机模块地址
#define SEND_ADDR                      0x1234   //4发送地址
/**************************************************/
static basicRfCfg_t basicRfConfig;
uint8   APP_SEND_DATA_FLAG;
/******************************************/

/**************************************************/
// 无线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
}

/********************MAIN************************/
void main(void)    
{  
  
  uint16 sensor_val;
  uint16 len = 0;
  halBoardInit();
  ConfigRf_Init();
  halLedSet(1);
  halLedSet(2);
  Timer4_Init();
  Timer4_On();
  while(1){
    APP_SEND_DATA_FLAG = GetSendDataFlag();
    if(APP_SEND_DATA_FLAG == 1){
#if defined (GM_SENSOR)
          sensor_val = get_adc();
          printf_str(pTxData,"光照传感器电压:%d.%02dV\r\n",sensor_val/100,sensor_val%100);
#endif
#if defined (QT_SENSOR)
         sensor_val = get_adc();
         printf_str(pTxData,"气体传感器电压:%d.%02dV\r\n",sensor_val/100,sensor_val%100);
#endif          
          halLedToggle(3);
          basicRfSendPacket(SEND_ADDR,pTxData,strlen(pTxData));
          Timer4_On();
    }
  }
}
/************************main end ****************************/

9.进行代码编译

均未出现代码的报错

10.标志位的添加

切换到sensor.c文件中,进行Defined symbols的添加,添加内容为GM_SENSOR。

11.打印串口信息

将collect.c文件烧录的zigbee板,连接到串口。打印信息为 "光照传感器电压"。


当修改代码为如下所示时

#if defined(TEM_SENSOR)
      call_sht11(&sensor_tem,&sensor_val);
      printf_str(pTxData,"温湿度传感器,温度:%d.%d,湿度:%d.%d\r\n",
                sensor_tem/10,sensor_tem%10,sensor_val/10,sensor_val%10);
#endif

打印信息为如下所示(zigbee未接入传感器所打印的数据)

感谢各位读者的阅读!希望大家给出一键三连,多多支持原创。有错误和不解的地方,欢迎各位读者在评论区讨论,我也会不断学习不断改进,做出更加优质的作品!!!

最后相关代码已传入资源中,可根据需求自行获取。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花开月满西楼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值