上一期我们讲了一下实现无线聊天的简要步骤,我们运用之前实现的收发数据的效果加上无线控灯的运用就可以达到聊天的效果,就是ZigBee和串口的结合使用,那么我们怎么实现的呢?先创建一个函数来设置我们想要使用的名称,在函数里面我们通过串口询问的方式得到用户想要设置的名称:

//3.3 设置名字
void setName(void)
{Delay(5000);UartSend("请输入名字:",15);while(1){ //控制其一个一个发以便于判断len = UartRcv(TestTxBuf + TestRxPos,1);if( len > 255 ){len = 0;}//4.2 接收数据if(len > 0){//从串口接收数据并且拷贝到Myname数组中if(TestTxBuf[TestRxPos] == '\n'){memcpy(Myname,TestTxBuf,TestRxPos);MynameLen = TestRxPos;UartSend("名字设置成功!",14);TestRxPos = 0;break;}else{TestRxPos += len;}}}
}

这个步骤也很简单,其实就是通过串口发送:请输入名字:,长度是15个字节,然后进入死循环

循环里面就等着用户输入回车,输入回车之后就将串口发送过来的数据存储到数组里面,这里要注意数组的长度和设置完成的时候将数据滚动(TestRxPos )清零,数组是必须要设置长度的,不然的话发不了:


//创建一个存储单个数据的数组
static unsigned char TestTxBuf[255];//3.2 创建一个拼接名字后的存储的数组
static unsigned char SwapBuf[255];
//创建一个接收数据的数组
static unsigned char TestRxBuf[255];
//3.4 创建一个滚动的位置用于数据接收判断
static unsigned char TestRxPos = 0;
unsigned char juge = 0;
//3.1 创建一个存储名字的数组
static unsigned char Myname[20];
static unsigned char MynameLen;

这里我就用到了这些变量,四个数组,很明显,有接收数据的数组,发送数据的数组,存放名字的数组,存放临时消息的数组;

如果拿到了存放有我们名称和数据的数组是不是就可以通过ZigBee的收发数据将数据通过串口实现一个聊天效果呢?那么思路有了,咱们就开始吧:

1、初始化

//定义一个强度unsigned short pRssi = 0;//2.3 定义通讯的结构体basicRfCfg_t pRfConfig;LEDInit();KeyInit();//初始化一下时钟SysClkInit();TimerInit();UartInit(9600,'n');pRfConfig.myAddr = 0x0002;pRfConfig.panId = 0x1000;pRfConfig.channel = 11;pRfConfig.ackRequest = 1;//2.1 初始化函数basicRfInit(&pRfConfig);//2.5 保持接收的打开basicRfReceiveOn();setName();Delay(1000);

一些基础的初始化,串口必须的,时钟,led 、按键什么的不需要其实,当然大家加上也没什么影响,然后就是我们的无线模块的初始化,有一个结构体,这个结构体大家自行设置即可,然后需要打开接收,设置名字,最好延时一下,毕竟单片机运行速度还是蛮快的;

2、发送数据,因为前面我们讲解了如何设置名称,这里就直接重发送数据开始:

    while(1){len = 0;//控制其一个一个发以便于判断len = UartRcv(TestTxBuf + TestRxPos,1);if( len > sizeof(TestTxBuf) ){len = 0;}//4.1 接收数据if(len > 0){if(TestTxBuf[TestRxPos] == '\n'){//将数组拷贝到带有名称的数组中memcpy(SwapBuf,Myname,MynameLen - 1);memcpy(SwapBuf +MynameLen - 1,TestTxBuf,TestRxPos);basicRfSendPacket(0xffff,SwapBuf,TestRxPos  + MynameLen - 1);TestRxPos = 0;}else{TestRxPos += len;}}

首先我们拿到串口里面用户输入的数据,这个串口函数的意思是一个一个接收,len的话就是接收到数据的长度,这个函数前面我们有讲过,后面就不在讲解的,有需要的去翻前面的;这里接收到的数据会一个一个的存到发送数据的数组中;

len的长度不可以超过数组的最大值255,越界之后就发送不了了;当检测到len的值大于0,也就是接收到了用户的数据之后,是一个一个接的,所以len其实就是1,然后判断一下,如果检测到换行我们就可以发送准备了,如果没有检测到TestRxPos就会滚动,那么这个值到检测到了换行的时候就是发送数据的长度,所以在检测到换行之后,我们就可以将我们的名称数组和发送数据数组一同拷贝到临时数据数组里面,这里我拷贝的时候减掉了1,目的是去掉名字数据最后的换行;

拷贝到临时数据数组里面之后我们就可以通过无线发送函数发送,发送完成之后将我们滚动的位置清零,准备下一次发送;

3、接收数据:

    if(basicRfPacketIsReady()){//收到之后我们接收到数组中,然后判断亮灯//接收函数的第三个参数是信号的强度UartSend(TestRxBuf,basicRfReceive(TestRxBuf,sizeof(TestRxBuf),(unsigned short *)&pRssi));}

这个很简单,就是判断是否做好接收准备然后通过串口将数据显示到pc上,用的是接收数据数组,长度就是接收到数据的长度;

好了,总之,不要将程序想的太难,这里我将整体代码贴出来:

#include "LED.h"
#include "KEY.h"
#include "Timer.h"
#include "UART.h"
#include "ADC.h"
#include "basic_rf.h"static void SysClkInit(void)
{//由16MHZ时钟切换到32MHZ时钟CLKCONCMD &= ~0x40;            for(;CLKCONSTA & 0x40;);     CLKCONCMD &= ~0X7F;
}
void KeyControlLedShow(unsigned char n)
{if(n & 0x01){LEDOn(1);}else{LEDOff(1);}if(n & 0x02){LEDOn(2);}else{LEDOff(2);}if(n & 0x04){LEDOn(3);}else{LEDOff(3);}if(n & 0x08){LEDOn(4);}else{      LEDOff(4);}
}void ShowNumber(void)
{unsigned static char i = 0;KeyControlLedShow(i++); if(i > 15){i = 0;}
}void TimeLed(void)
{LEDToggle(0);
}//创建一个存储单个数据的数组
static unsigned char TestTxBuf[255];//3.2 创建一个拼接名字后的存储的数组
static unsigned char SwapBuf[255];
//创建一个接收数据的数组
static unsigned char TestRxBuf[255];
//3.4 创建一个滚动的位置用于数据接收判断
static unsigned char TestRxPos = 0;
unsigned char juge = 0;
//3.1 创建一个存储名字的数组
static unsigned char Myname[20];
static unsigned char MynameLen;//1.3定义一个需要发送数据的长度和采集数据的存储变量
unsigned int len = 0;
//3.3 设置名字
void setName(void)
{Delay(5000);UartSend("请输入名字:",15);while(1){ //控制其一个一个发以便于判断len = UartRcv(TestTxBuf + TestRxPos,1);if( len > 255 ){len = 0;}//4.2 接收数据if(len > 0){//从串口接收数据并且拷贝到Myname数组中if(TestTxBuf[TestRxPos] == '\n'){memcpy(Myname,TestTxBuf,TestRxPos);MynameLen = TestRxPos;UartSend("名字设置成功!",14);TestRxPos = 0;break;}else{TestRxPos += len;}}}
}void main(void)
{//2.6 我们需要一个判断来确定按钮的状态unsigned char switchstate = 0;float ret = 0;//定义一个强度unsigned short pRssi = 0;//1.1 通过传感器产生的数据,发送到pc端显示,unsigned int length = 0;//2.3 定义通讯的结构体basicRfCfg_t pRfConfig;LEDInit();KeyInit();//初始化一下时钟SysClkInit();//KeyCallBackRegister(&ShowNumber);TimerInit();
//    static unsigned long ledtime = 0;
//    TimeSetCallBack(500,TimeLed,1);UartInit(9600,'n');
//    AdcInit();pRfConfig.myAddr = 0x0002;pRfConfig.panId = 0x1000;pRfConfig.channel = 11;pRfConfig.ackRequest = 1;//2.1 初始化函数basicRfInit(&pRfConfig);//2.5 保持接收的打开basicRfReceiveOn();setName();Delay(1000);while(1){len = 0;//控制其一个一个发以便于判断len = UartRcv(TestTxBuf + TestRxPos,1);if( len > sizeof(TestTxBuf) ){len = 0;}//4.1 接收数据if(len > 0){if(TestTxBuf[TestRxPos] == '\n'){//将数组拷贝到带有名称的数组中memcpy(SwapBuf,Myname,MynameLen - 1);memcpy(SwapBuf +MynameLen - 1,TestTxBuf,TestRxPos);basicRfSendPacket(0xffff,SwapBuf,TestRxPos  + MynameLen - 1);TestRxPos = 0;}else{
//          length = sizeof(Myname);
//          memcpy(SwapBuf+length+TestRxPos,TestTxBuf,len);TestRxPos += len;}}//4.2 发送数据//      //2.8 判断是否收到数据if(basicRfPacketIsReady()){//收到之后我们接收到数组中,然后判断亮灯//接收函数的第三个参数是信号的强度UartSend(TestRxBuf,basicRfReceive(TestRxBuf,sizeof(TestRxBuf),(unsigned short *)&pRssi));}//#ifdef SWITCH
//    //2.4 发送逻辑
//      //每次按下按钮我们将switchstate取反
//      if(Key1Getstate()|| Key2Getstate())
//      {
//        switchstate  = !switchstate;
//      }
//      //将数据检测出来之后我们要存入数组
//      TestTxBuf[0] = switchstate;
//
//      //2.7 我们按照地址发送数据,一次第一个
//      basicRfSendPacket(0x0002,TestTxBuf,1);
//#else
//      //2.8 判断是否收到数据
//    if(basicRfPacketIsReady())
//    {
//      //收到之后我们接收到数组中,然后判断亮灯
//      //接收函数的第三个参数是信号的强度
//      len = basicRfReceive(TestRxBuf,sizeof(TestRxBuf),(unsigned short *)&pRssi);
//      if(TestRxBuf[0])
//      {
//        LEDOn(0);
//      }
//      else
//      {
//        LEDOff(0);
//      }
//    }
//#endif//      //1.2 我们利用定时器1s中采集一次显示即可
//       if(TimerCheck(ledtime))
//       {
//        ledtime = TimerSet(1000);
//        //1.5 通过adc模块拿到采集到的数据
//        ret = AdcGetValue();
//        //1.4 进行数据的格式化处理
//        len = sprintf(TestBuf,"The value of ADC is %f",ret);
//        UartSend((char *)TestBuf,len);
//       }/*unsigned char i = 1;Delay(2000);len = UartRcv(TestTxBuf,1);if(len > 0){UartSend("你的名字是小白",16);}LEDToggle(i++);Delay(100);if(i > 4){i = 1;}*/}
}

注释的地方是以前的代码;

好了,那么这一期就到这里了,快去试试吧。

cc2530:<6>ZigBee无线聊天室实现相关推荐

  1. 【IoT】基于 CC2530 的 ZigBee 物联网系统设计

    1.1设计背景 无线传感器网络是目前研究的热门领域,它集成 了多门学科的知识,应用领域广泛,因此深受国际社会 的关注. 在 21 世纪里,无线传感器网络技术是具有 较大影响力技术中的一个热门技术,也是 ...

  2. 【Zigbee精华教程01】Zigbee无线组网技术入门建议与学习路线

    1. 引言 在物联网技术应用的知识体系中,Zigbee无线组网技术是非常重要的一环,也是大家感觉比较难以掌握的一个部分.Zigbee无线组网技术之所以让你感有学习难度,不是因为它真的复杂,仅仅是它看起 ...

  3. ZigBee无线温度传感网络设计

    0 引言 随着信息化时代的到来,ZigBee无线模块广泛应用在军事.智能家居.医疗监护环境监测和远程工业控制领域.事实证明,无论是工厂.办公楼还是家居都需要无线传感网络的支持.为了满足社会对无线传感器 ...

  4. 高级API快速入门之群聊天室【09】

    一.控制台版本的群聊天室                     其原理就是:通过死循环进行保存连接服务器的客户端,并创建一个容器来保存所有连接服务器的客户端              服务器: pa ...

  5. Android 蓝牙开发(一) -- 传统蓝牙聊天室

    Android 蓝牙开发(一) – 传统蓝牙聊天室 Android 蓝牙开发(三) – 低功耗蓝牙开发 项目工程BluetoothDemo 一.蓝牙概览 以下是蓝牙的介绍,来自维基百科: 蓝牙(英语: ...

  6. [NUAA]Python用UDP协议建立带有私聊功能的网络聊天室-建立聊天工具

    文章目录 前言 1.网络聊天室的基本架构是什么? 1.1 客户端和服务器的架构 1.2 通信协议的选择以及多线程通信 1.2.1 多线程通信 1.2.2 通信协议选择 1.3 前后端功能设计思路 1. ...

  7. ZigBee无线网络技术在小区路灯照明系统的应用

    小区路灯照明系统是楼宇智能的一部分,但受制于布线.成本等的问题,难以得以实施.随着 计算机技术的迅猛发展, 无线网络技术越来越成熟,ZigBee无线网络成本低.功耗低.传输距离远等的特点,非常适合在无 ...

  8. ZigBee无线气压测量模块的实现

    在集装箱运输中,对冷藏集装箱可靠性要求很高,除进行强度实验外,还需按要求完成热工性能实验.热工性能实验中需要测量集装箱的气密性,漏热性,制冷性等. 为提高测量的自动化程度,控制测量过程的人为因素,需要 ...

  9. ZigBee无线网络的温湿度测量系统

    目前,随着工业生产自动化程度不断提升,温湿度等生产环境要素监控智能化程度也在不断发展.传统测量设备功能单一,采用线缆连接各测量节点,测量系统架设复杂,数据处理实时性不高.随着短距离无线通信技术.嵌入式 ...

最新文章

  1. 百万人学AI:CSDN重磅共建人工智能技术新生态
  2. IntelliJ IDEA中Maven插件无法更新索引之解决办法
  3. 【转】ubuntu UltraEdit 反复试用的办法
  4. [BZOJ 1070][SCOI2007]修车(费用流)
  5. 二叉树的基本操作及哈夫曼编码/译码系统的实现
  6. OpenCV 中文wiki
  7. 无服务器安全性:将其置于自动驾驶仪上
  8. ●洛谷P3687 [ZJOI2017]仙人掌
  9. proc文件系统探索 之 以数字命名的目录
  10. 蓝桥杯 BASIC-27 基础练习 2n皇后问题
  11. 利用计算机系统辅助设计人员,计算机基础知识:计算机辅助设计
  12. python整型变量化ascii_Python基础之基本数据类型
  13. 如何使用火狐下的两款接口测试工具RESTClient和HttpRequester发送post请求
  14. 基于51单片机+ESP-01WIFI模块LED灯的控制
  15. 社交礼仪之握手礼仪(转)
  16. 华为HCNA实验操作之常用操作命令1-10
  17. 当时我就哭了!中国首个火星探测器天问一号发射成功!
  18. 基于51单片机智能大棚智能花盆浇水浇花灌溉补光散热原理图Proteus仿真
  19. conda create出现连接问题_处理conda安装工具的动态库缺失问题
  20. 有苦有乐的算法 --- 自定义一个栈,实现压栈(push)、弹栈(pop)、获取站内最小值(getmin)

热门文章

  1. 记微信小程序成功对接教务处
  2. Java成品网站推荐 毕设从这起步就够了
  3. 人工智能核心技术,主要可以分为哪几类?
  4. (1)前言——(15)勘误表(Errata)
  5. 地统计插值(二):经验贝叶斯克里金法
  6. NetworkInfo已过时
  7. 图说ISO三体系认证流程及周期
  8. MySQL常用图形管理工具 | 黑马程序员
  9. HBuilder打包H5成mp-weixin文件到微信开发者工具运行
  10. 调用阿里云语音转文本