zigbee点对点串口收发

#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                22         // 频道 11~26
#define PAN_ID                    0x8888     //网络id 
#define MY_ADDR                   0x1015     //本机模块地址
#define SEND_ADDR                 0xAC3A     //发送地址
/**************************************************/  
#define D3 P1_0
#define SW1 P1_2

void init(void)
{
  P1SEL &=~0X01;
  P1DIR |=0X01;
  D3=0;
}

uint8 scankey()
{
  if(SW1==0)
  {
    if(SW1==0)
    {
      while(!SW1);
      return 1;
    }
  }
  return 0;
}

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();
}



void main(void)
{
    halBoardInit();//选手不得在此函数内添加代码
    ConfigRf_Init();//选手不得在此函数内添加代码
    init();

    uint8 i=0;
    while(1)
    {
      /* user code start */

      uint8 rxdata_z2[2]={4,3};//切换状态--按键

      uint8 rxdata_zchar[10]={0};
      uint8 rxdata_zint[2];


      if(halUartRead(rxdata_zchar,3)==1)
      {

        rxdata_zint[i++]=rxdata_zchar[0]-0x30;
       }
      if(i==2)
      {
        i=0;
        D3=!D3;
        basicRfSendPacket(SEND_ADDR,rxdata_zint,2);
      }
      if(scankey()==1)
      {
        basicRfSendPacket(SEND_ADDR,rxdata_z2,2);
      }
    /* user code end */
    }
}

上面这道题是利用点对点简单通讯写的串口收发实验。

这样写的接收函数就会显示从串口一个字节找一个字节读取,这样在后面的与利用adc检测光电传感器的实验会造成实验现象延迟,或者没反应,所以我在接下来的实验中我测试了新的串口读取函数。

#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                22         // 频道 11~26
#define PAN_ID                    0x8888     //网络id 
#define MY_ADDR                   0x0001     //本机模块地址
#define SEND_ADDR1                 0x0002     //发送地址1--led报警
#define SEND_ADDR2                 0x0003     //发送地址2--led1
#define SEND_ADDR3                 0x0004     //发送地址3--led2
/**************************************************/  
#define D3 P1_0

uint16 gz;
uint8 gz0[1]={0};
uint8 gz1[1]={1};
uint8 flag1=0;//实时变化的
uint8 flag2=0;//用来检测变化的

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();
}

void init(void)
{
  P1SEL &=~0X01;
  P1DIR |=0X01;
  D3=1;
}

void guangzhao(void)
{
      gz=get_guangdian_ad();
      if(gz<=30)
        flag1=1;
      else
        flag1=0;
      if(flag1!=flag2)
      {
        flag2=flag1;
        if(flag2==1)
          basicRfSendPacket(SEND_ADDR1,gz1,1);
        if(flag2==0)
          basicRfSendPacket(SEND_ADDR1,gz0,1);
      }
}


void main(void)
{
    halBoardInit();//选手不得在此函数内添加代码
    ConfigRf_Init();//选手不得在此函数内添加代码
    init();

    uint8 txdata_uchar[10]={0};
    uint8 txdata_int[2];
    uint16 nLen=0;
    while(1)
    {
      /* user code start */
      nLen=halUartRxLen();
     if(halUartRead(txdata_uchar,nLen))
     {
     halUartWrite(txdata_uchar,2);
     txdata_int[0]=txdata_uchar[0]-0x30;
     txdata_int[1]=txdata_uchar[1]-0x30;
     if(txdata_int[0]==1)//也就是向节点2发送10 / 11
       basicRfSendPacket(SEND_ADDR2,txdata_int,2);
     else if(txdata_int[0]==2)也就是向节点3发送 20 /21
       basicRfSendPacket(SEND_ADDR3,txdata_int,2);
     }
     halMcuWaitMs(500);
     guangzhao();
    /* user code end */
    }
}

原来我们在halUartRead(uint8* array,uint16 len);
函数中后面加入一个延迟函数HalMcuWaitMs(100);就可以完全接受这个数组,这种操作我也不知道怎么造成的,如果有大佬知道,请告知。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值