wsn实验
【记录一下关键步骤】
【实验一LED】
下面两个.nc文件在分别Notepad++中新建,并保存到同一个文件夹中
【LED_C.nc】
configuration LED_C { } implementation { components LED_M as App; components MainC; App.Boot->MainC.Boot; components LedsC; App.Leds -> LedsC.Leds; //CC2530 GPIO组件 components HplCC2530GeneralIOC as GPIO; App.Key->GPIO.P2_Port[0]; //定时器组件 components new TimerMilliC() as Timer1; App.Timer1->Timer1; //ADC 组件 components new AdcC() as Ad; App.AdControl->Ad; App.AdRead->Ad; }
【LED_M.nc】
/*********************************************** * 文 件 名 : LED_M.nc * 功能描述 : 当按下上、下、左键中一个按键时 * 分别反转红、黄、绿颜色的LED状态。 * 日 期 : 2019/12/4 ***********************************************/ #include "ADC.H" module LED_M { uses interface Boot; uses interface Leds; uses interface AdcControl as AdControl; uses interface Read<int16_t> as AdRead; uses interface Timer<TMilli> as Timer1; uses interface GeneralIO as Key; } implementation { uint8_t keyValue; enum {NoKey,KeyDown,KeyHold}; //按键状态 uint8_t keyState; task void NopTask() //空任务 { } event void Boot.booted() { // 使能ADC采样,采样端口 P0.6 call AdControl.enable(ADC_REF_AVDD,ADC_12_BIT,ADC_AIN6); //设置ADC采样时间 1s钟采样一次 call Timer1.startPeriodic(100); } event void AdRead.readDone(error_t result, int16_t val) { unsigned char s[16]; //读取高8位的ADC采样寄存器的值 uint8_t adc_value=val>>5; if((adc_value>20) && (adc_value<40))//最初(10,20) call Leds.led1Toggle();//up键按下红灯状态翻转 else if((adc_value>80) && (adc_value<100)) call Leds.led2Toggle();//down键按下黄灯状态翻转 else if((adc_value>110) && (adc_value<140)) call Leds.led0Toggle();//left键按下绿灯状态翻转 DbgOut(9,"adc_value is:%d\n",adc_value); } event void Timer1.fired() { keyValue=call Key.get(); switch(keyState) { //没有键按下的状态 case NoKey: if(keyValue==0) //无键按下 keyState=NoKey; else //有键按下 keyState=KeyDown; break; //有键按下的状态 case KeyDown: if(keyValue==1) { //转按下键保持状态 keyState=KeyHold; } //调用ADC采样读取命令 call AdRead.read(); break; case KeyHold: if(keyValue==1) { //按键保持 keyState=KeyHold; } else { //按键松开 keyState=NoKey; } break; } } }
【新建makefile文件(要求无后缀名!)】
新建一个txt文件,文件内容如下,保存后关闭,再重命名去掉后缀,把文件放到之前的同一个文件夹中
COMPONENT=LED_M
include $(MAKERULES)
【编译】
打开cygwin
使用目录切换命令:cd
切换至刚才文件夹下
然后输入命令:make enmote
回车进行编译
此处可能会出现以下错误:
问题原因:makefile文件按下图修改
【编译成功后如下界面】
【烧录】
除了下面的方法也可以在cygwin中使用 make enmote install 命令进行快速的编译下载
打开桌面的SmartRF Flash Program and verify 软件,按下图操作
如果没有显示上图中的写节点地址的那一块那么原因可能是USB接口的问题,换成USB2.0即可
烧录成功,观察现象是否符合预期
【二次多次烧录时无法烧录的解决办法】
问题:Chip is locked! Not able to read IEEE address. (Uncheck the "Retain IEEE address" option.)
解决办法:
然后选择第三个 Erase,program and verify,再次单击 Perform actions 可下载成功
【实验二】
代码文件中需要做更改
文件目录C:\emotenet\cygwin\opt\tinyos-2.x\apps\CC2530\TestP2M...
按下图更改
先编译烧录node
按下图更改
换板子
再编译烧录sink节点
打开串口助手,观察数据接收情况
使用sniffer
操作步骤,双击桌面上的sniffer
下图是点对点的情况
更改目标地址destaddress为0xFFFF以进行广播通信,编译下载至node节点(不需要下载到sink节点)
使用sniffer观察广播的数据包
可见广播没有ack应答包
【实验三】
实验目的
熟悉 A/D 转换、串行通信和点对点通信相关的组件和接口,掌握 WSN 应用 系统软件的基本设计方法。
要求
系统由传感器节点和汇聚节点组成,传感器节点周期地采集光度数据,并将 数据发送给汇聚节点,采集周期为 5s. 汇聚节点接收到数据后,向传感器节点发 送应答消息,并将数据通过串口发送到 PC。如果传感器节点发送数据后,未接 收到应答,则重新发送数据,如果重发 3 次仍未成功,则丢弃当前数据。
先下载node,由于node代码中的目标地址是01所以这里node节点的ID设为02(区别于01)
设node节点id为02,编译下载
切换目录至sink
更换板子作为sink节点,
执行,id设为01
下载成功后打开sniffer
串口助手显示3号数据丢失,实验成功
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现