实验4 节点-PC串口通信实验_第1页
实验4 节点-PC串口通信实验_第2页
实验4 节点-PC串口通信实验_第3页
实验4 节点-PC串口通信实验_第4页
实验4 节点-PC串口通信实验_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验四 节点-PC串口通信实验 实验目的 本实验的目的是实现节点和PC间的串口双向通讯,通过串口连接,PC可以从网络收集其他节点的数据,也可以发送数据或者命令到节点,因此,串口通信编程是无线传感器网络中的重要内容。 实验要求 根据例子提供的例子程序,详细了解程序结构,并尝试进行程序的修改运行。具体实验要求如下:1.了解掌握串口双向通信的方法,学会使用mig工具以及SerialForwarder;2.修改BlinkToRadio程序,使用mig创建BlinkToRadioMsg的java对象发送至BaseStation,然后使用MsgReader读取该对象内容。 实验内容 1、TestSeria

2、l例子程序 节点与PC之间的通信在TinyOS中被抽象为数据包源(packet source)。一个数据包源就是一种与节点双向通信的介质,可以是串口,也可以是TCP socket,或是SerialForwarder工具(该工具后面介绍)。先看以下示例程序,将一个节点连接到PC,进入TestSerial例子程序目录,编译并烧录程序。 $ make telosb install运行TestSerial程序 $java TestSerial -comm serial/dev/ttyUSB0:telos输出类似以下内容: Sending packet 1Received packet sequence

3、 number 4Sending packet 2Received packet sequence number 5Sending packet 3Received packet sequence number 6Sending packet 4Received packet sequence number 7Received packet sequence number 8Sending packet 5Received packet sequence number 9Sending packet 6这时节点的LED灯会闪烁。此时表明节点与串口双向通信正常。 2、基站程序示例 基站节点是无线

4、传感器网络的重要组成部分,它负责与后台服务器进行串口通信以及与网络中的其他节点进行无线通信,是一个桥梁的作用。取两个节点,一个节点烧录BlinkToRadio程序,一个烧录BaseStation程序,将两个节点都通电。可以看到BaseStation的LED1等闪烁,按住BlinkToRadio节点的RESET,LED1不闪烁。BaseStation节点的LED0闪烁表示它收到了网络包,LED1闪烁表示将网络包发送到串口,LED2闪烁表示网络包被丢弃,丢弃的原因可能是串口的带宽小于节点的无线带宽。再将BaseStation节点连接到PC,使用Listen命令读取串口的内容。 $java Test

5、Serial -comm serial/dev/ttyUSB0:telosListen命令的功能是创建数据包源,然后打印出每一个监听到的包。输出的内容类似以下: 00 FF FF 00 00 04 22 06 00 02 00 0100 FF FF 00 00 04 22 06 00 02 00 0200 FF FF 00 00 04 22 06 00 02 00 0300 FF FF 00 00 04 22 06 00 02 00 0400 FF FF 00 00 04 22 06 00 02 00 0500 FF FF 00 00 04 22 06 00 02 00 0600 FF FF

6、00 00 04 22 06 00 02 00 0700 FF FF 00 00 04 22 06 00 02 00 0800 FF FF 00 00 04 22 06 00 02 00 0900 FF FF 00 00 04 22 06 00 02 00 0A00 FF FF 00 00 04 22 06 00 02 00 0BBlinkToRadioC应用的消息格式如下(忽略开始的00字节): 目标地址Destination address(2 bytes) 连接源地址Link source address(2 bytes) 消息长度Message length(1 bytes) 组号 G

7、roup ID(1 byte) Active Message handler类型Active Message handler type(1 byte) Payload(最大28 bytes) 源节点ID Source mote ID(2 bytes)示例计数值Sample counter(2 bytes) 3、MIG及数据包对象 Listen程序是与节点通讯最基础的方式。但是它只打印了二进制的包。显然这种方式不是十分易读。在实际中,往往需要读取这些二进制数据后,再根据二进制的内容分析其字段。TinyOS提供了一种方便解析二进制数据包内容的工具-MIG(Message InterFace Gen

8、erator)。MIG可以为用户指定的消息结构建立一个Java,Python或C的接口,免除了解析二进制的麻烦。进入到TestSerial目录下,输入make clean清除上次的编译结果。然后输入make telosb,可以看到类似以下: rm -rf build *.class TestSerialMsg.javarm -rf _TOSSIMmodule.so TOSSIM.pyc TOSSIM.pymkdir -p build/telosbmig java -target=telosb -I%T/lib/oski -java-classname=TestSerialMsg TestSer

9、ial.h TestSerialMsg -o TestSerialMsg.javajavac *.java compiling TestSerialAppC to a telosb binaryncc -o build/telosb/main.exe -Os -O -mdisable-hwmul -Wall -Wshadow -DDEF_TOS_AM_GROUP=0x66 -Wnesc-all -DCC2420_DEF_CHANNEL=19 -target=telosb -fnesc-cfile=build/telosb/app.c-board= -I%T/lib/oski TestSeria

10、lAppC.nc -lm compiled TestSerialAppC to build/telosb/main.exe 6300 bytes in ROM 281 bytes in RAMmsp430-objcoy -output-target=ihex build/telosb/main.exe build/telosb/main.ihex writing TOS image这个输出表示在编译TinyOS应用程序之前,Makefile中要求先生成TestSerialMsg.java文件,然后将TestSerialMsg.java和TestSerial.java进行编译,最后再编译Tiny

11、OS应用程序。打开TestSerial目录下的Makefile文件,如下: COMPONENT=TestSerialAppCBUILD_EXTRA_DEPS += TestSerial.classCLEAN_EXTRA = *.class TestSerialMsg.javaTestSerial.class: $(wildcard *.java) TestSerialMsg.java javac *.javaTestSerialMsg.java: mig java -target=null -java-classname=TestSerialMsg TestSerial.h test_seri

12、al_msg -o $BUILD_EXTRA_DEPS这行说明TinyOS应用生成以前要先编译TestSerial.class。下面这行 TestSerial.class: $(wildcard *.java) TestSerialMsg.java javac *.java说明TestSerialMsg.java是TestSerial.class的依赖文件,在编译生成TestSerial.class之前需要生成TestSerialMsg.java。TestSerialMsg.java的生成是利用mig工具。 TestSerialMsg.java: mig java -target=null -

13、java-classname=TestSerialMsg TestSerial.h test_serial_msg -o $这行命令的相关参数的含义如下: mig 调用mig命令 java 生成class文件 -target=null 无特定平台 -java-classname=TestSerialMsg 生成的java类的名字 TestSerial.h 数据包的定义头文件 test_serial_msg 头文件的中的结构名称 -o $ 输出 4、SerialForwarder和其他数据包源 直接监听串口的问题就是只能与一个程序进行读取,因为这是一个硬件资源。并且需要监听程序物理连接到串口才可

14、以进行读取。为解决以上限制,TinyOS中的SerialForwarder工具提供了一个解决方案。一般来说,SerialForwarder工具连接一个真实的物理串口,然后在此之上创建一个虚拟数据包源,然后允许同时多个程序通过TCO/IP连接来访问这个数据包源。可以看出,SerialForwarder相当于物理串口的读写包的代理。一个SerialForwarder数据包源的语法如下: sfHOST:PORTHOST和PORT是可选的。默认状态是localhost和9002端口的。运行SerialForwarder命令 会弹出一个窗口。这表示已经成功创建了一个数据包源sf,它的地址是本地的9001

15、端口。还可以在这个sf上再次创建sf数据包源,如下: java net.tinyos.sf.SerialForwarder -port 9003 -comm sflocalhost:9001这条命令创建了第2个sf,它的源是工作在9001端口上的第1个sf,第一个sf的引用数会增加1。这里仅仅是演示需要,将第2个sf(9003)关闭。使用MsgReader工具来读取第一个sf的内容: java net.tinyos.tools.MsgReader -comm sflocalhost:9001 BlinkToRadioMsg可以观察到第一个sf的引用数加1,并且使用MsgReader开始打印内容

16、,与上一节结果类似。除了串口和SerialForwarder以外,TinyOS还支持Crossbow MIB 600类型的以太网卡,缺省端口是10002。总结一下数据包源的语法格式如下: 语法 源 serialPORT:SPEED 串口 sfHOST:PORT SerialForwarder networkHOST:PORT MIB 600 5、向串口发送数据包 在TinyOS中向串口发送一个AM类型的数据包与通过radio发送是非常相似的。可以使用AMSend接口,调用AMSend.send发送数据包,然后处理AMSend.sendDone事件,不用设置AM地址字段。以下是一个对比图: Se

17、rial Radio SerialActiveMessageC ActiveMessageC SerialAMSenderC AMSenderC SerialAMReceiverC AMReceiverC 其中SerialActiveMessageC用来打开和关闭栈,其余两个分别为收发组件。组件接口上的相似,也带来了实现上的相似。如下所示: Radio Serial components ActiveMessageC; components new AMSenderC(AM_BLINKTORADIOMSG); BlinkToRadioC.Packet - AMSenderC; BlinkToR

18、adioC.AMPacket - AMSenderC; BlinkToRadioC.AMSend - AMSenderC; BlinkToRadioC.AMControl - ActiveMessageC;components SerialActiveMessageC; components new SerialAMSenderC(AM_BLINKTORADIOMSG); BlinkToRadioC.Packet - SerialAMSenderC; BlinkToRadioC.AMPacket - SerialAMSenderC; BlinkToRadioC.AMSend - SerialA

19、MSenderC; BlinkToRadioC.AMControl - SerialActiveMessageC;实验要求说明 实验具体要求,修改BlinkToRadio程序,使用mig创建BlinkToRadioMsg的java对象,BaseStation(该程序不改动)将BlinkToRadio发送的消息转发到串口,然后使用MsgReader读取BlinkToRadioMsg对象。提示步骤:1.按照TestSerial例子修改makefile。注意,javac后面应该接一个tab字符而不是空格。2.然后输入make telosb命令生成BlinkToRadioMsg的java类。 如果遇见

20、以下类似信息 warning: Cannot determine AM type for BlinkToRadioMsg (Looking for definition of AM_BLINKTORADIOMSG)就需要将AM类型从AM_BLINKTORADIO改为AM_BLINKTORADIOMSG,这是mig命名规则的需要。然后再次编译烧录。 3.BaseStation节点与修改后的BlinkToRadio节点都通电。然后在BlinkToRadio目录输入:java net.tinyos.tools.MsgReader BlinkToRadioMsg结果应该类似以下: nodeid=0x2

21、 counter=0x1049 nodeid=0x2 counter=0x104a nodeid=0x2 counter=0x104b nodeid=0x2 counter=0x104c实验过程说明首先需要修改节点通信的相关信道,选择26信道,在Makefile文件中进行修改,PFLAGS+=-DCC2420_DEF_CHANNEL=26。对BlinkToRadio程序中的Makefile文件进行修改,使用mig创建BlinkToRadioMsg的java对象 :BlinkToRadioMsg.java:mig java -target=null $(CFLAGS) -java-classna

22、me=BlinkToRadioMsg BlinkToRadio.h BlinkToRadioMsg -o $申请节点,自动分配为3号和4号节点,将3号节点作为普通节点,烧录BlinkToRadio程序,4号节点作为基站节点,烧录BaseStation程序,可以看到4号节点的LED1灯在不停的闪烁,说明基站节点不停的收到网络包并将其发送至串口。由于缺少MsgReader 命令,实验中使用Listen命令进行代替,对4号节点即基站节点进行读数,结果如下图所示:图中每一行代表基站节点收到的一个网络包,最后二个字节代表的是计数值,可以看到为递增数。修改后的核心程序清单BlinkToRadioC.nci

23、mplementation uint16_t counter; message_t pkt; bool busy = FALSE; void setLeds(uint16_t val) if (val & 0x01) call Leds.led0On(); else call Leds.led0Off(); if (val & 0x02) call Leds.led1On(); else call Leds.led1Off(); if (val & 0x04) call Leds.led2On(); else call Leds.led2Off(); event void Boot.booted() call AMControl.start(); event void AMControl.startDone(error_t err) if (err = SUCCESS) call Timer0.startPeriodic(TIMER_PERIOD_MILLI); el

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论