实验4 节点PC串口通信实验Word文件下载.docx
- 文档编号:17112914
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:11
- 大小:34.92KB
实验4 节点PC串口通信实验Word文件下载.docx
《实验4 节点PC串口通信实验Word文件下载.docx》由会员分享,可在线阅读,更多相关《实验4 节点PC串口通信实验Word文件下载.docx(11页珍藏版)》请在冰豆网上搜索。
Sendingpacket3
Receivedpacketsequencenumber6
Sendingpacket4
Receivedpacketsequencenumber7
Receivedpacketsequencenumber8
Sendingpacket5
Receivedpacketsequencenumber9
Sendingpacket6
这时节点的LED灯会闪烁。
此时表明节点与串口双向通信正常。
2、基站程序示例
基站节点是无线传感器网络的重要组成部分,它负责与后台服务器进行串口通信以及与网络中的其他节点进行无线通信,是一个桥梁的作用。
取两个节点,一个节点烧录BlinkToRadio程序,一个烧录BaseStation程序,将两个节点都通电。
可以看到BaseStation的LED1等闪烁,按住BlinkToRadio节点的RESET,LED1不闪烁。
BaseStation节点的LED0闪烁表示它收到了网络包,LED1闪烁表示将网络包发送到串口,LED2闪烁表示网络包被丢弃,丢弃的原因可能是串口的带宽小于节点的无线带宽。
再将BaseStation节点连接到PC,使用Listen命令读取串口的内容。
Listen命令的功能是创建数据包源,然后打印出每一个监听到的包。
输出的内容类似以下:
00FFFF000004220600020001
00FFFF000004220600020002
00FFFF000004220600020003
00FFFF000004220600020004
00FFFF000004220600020005
00FFFF000004220600020006
00FFFF000004220600020007
00FFFF000004220600020008
00FFFF000004220600020009
00FFFF00000422060002000A
00FFFF00000422060002000B
BlinkToRadioC应用的消息格式如下(忽略开始的00字节):
∙目标地址Destinationaddress(2bytes)
∙连接源地址Linksourceaddress(2bytes)
∙消息长度Messagelength(1bytes)
∙组号GroupID(1byte)
∙ActiveMessagehandler类型ActiveMessagehandlertype(1byte)
∙Payload(最大28bytes)
源节点IDSourcemoteID(2bytes)
示例计数值Samplecounter(2bytes)
3、MIG及数据包对象
Listen程序是与节点通讯最基础的方式。
但是它只打印了二进制的包。
显然这种方式不是十分易读。
在实际中,往往需要读取这些二进制数据后,再根据二进制的内容分析其字段。
TinyOS提供了一种方便解析二进制数据包内容的工具-MIG(MessageInterFaceGenerator)。
MIG可以为用户指定的消息结构建立一个Java,Python或C的接口,免除了解析二进制的麻烦。
进入到TestSerial目录下,输入makeclean清除上次的编译结果。
然后输入maketelosb,可以看到类似以下:
rm-rfbuild*.classTestSerialMsg.java
rm-rf_TOSSIMmodule.soTOSSIM.pycTOSSIM.py
mkdir-pbuild/telosb
migjava-target=telosb-I%T/lib/oski
-java-classname=TestSerialMsgTestSerial.hTestSerialMsg
-oTestSerialMsg.java
javac*.java
compilingTestSerialAppCtoatelosbbinary
ncc-obuild/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/oskiTestSerialAppC.nc-lm
compiledTestSerialAppCtobuild/telosb/main.exe
6300bytesinROM
281bytesinRAM
msp430-objcoy--output-target=ihexbuild/telosb/main.exebuild/telosb/main.ihex
writingTOSimage
这个输出表示在编译TinyOS应用程序之前,Makefile中要求先生成TestSerialMsg.java文件,然后将TestSerialMsg.java和TestSerial.java进行编译,最后再编译TinyOS应用程序。
打开TestSerial目录下的Makefile文件,如下:
COMPONENT=TestSerialAppC
BUILD_EXTRA_DEPS+=TestSerial.class
CLEAN_EXTRA=*.classTestSerialMsg.java
TestSerial.class:
$(wildcard*.java)TestSerialMsg.java
javac*.java
TestSerialMsg.java:
migjava-target=null-java-classname=TestSerialMsgTestSerial.htest_serial_msg-o$@
BUILD_EXTRA_DEPS这行说明TinyOS应用生成以前要先编译TestSerial.class。
下面这行
说明TestSerialMsg.java是TestSerial.class的依赖文件,在编译生成TestSerial.class之前需要生成TestSerialMsg.java。
TestSerialMsg.java的生成是利用mig工具。
这行命令的相关参数的含义如下:
mig
调用mig命令
java
生成class文件
-target=null
无特定平台
-java-classname=TestSerialMsg
生成的java类的名字
TestSerial.h
数据包的定义头文件
test_serial_msg
头文件的中的结构名称
-o$@
输出
4、SerialForwarder和其他数据包源
直接监听串口的问题就是只能与一个程序进行读取,因为这是一个硬件资源。
并且需要监听程序物理连接到串口才可以进行读取。
为解决以上限制,TinyOS中的SerialForwarder工具提供了一个解决方案。
一般来说,SerialForwarder工具连接一个真实的物理串口,然后在此之上创建一个虚拟数据包源,然后允许同时多个程序通过TCO/IP连接来访问这个数据包源。
可以看出,SerialForwarder相当于物理串口的读写包的代理。
一个SerialForwarder数据包源的语法如下:
sf@HOST:
PORT
HOST和PORT是可选的。
默认状态是localhost和9002端口的。
运行SerialForwarder命令
javanet.tinyos.sf.SerialForwarder
会弹出一个窗口。
这表示已经成功创建了一个数据包源sf,它的地址是本地的9001端口。
还可以在这个sf上再次创建sf数据包源,如下:
javanet.tinyos.sf.SerialForwarder-port9003-commsf@localhost:
9001
这条命令创建了第2个sf,它的源是工作在9001端口上的第1个sf,第一个sf的引用数会增加1。
这里仅仅是演示需要,将第2个sf(9003)关闭。
使用MsgReader工具来读取第一个sf的内容:
javanet.tinyos.tools.MsgReader-commsf@localhost:
9001BlinkToRadioMsg
可以观察到第一个sf的引用数加1,并且使用MsgReader开始打印内容,与上一节结果类似。
除了串口和SerialForwarder以外,TinyOS还支持CrossbowMIB600类型的以太网卡,缺省端口是10002。
总结一下数据包源的语法格式如下:
语法
源
serial@PORT:
SPEED
串口
PORT
SerialForwarder
network@HOST:
MIB600
5、向串口发送数据包
在TinyOS中向串口发送一个AM类型的数据包与通过radio发送是非常相似的。
可以使用AMSend接口,调用AMSend.send发送数据包,然后处理AMSend.sendDone事件,不用设置AM地址字段。
以下是一个对比图:
Serial
Radio
SerialActiveMessageC
ActiveMessageC
SerialAMSenderC
AMSenderC
SerialAMReceiverC
AMReceiverC
其中SerialActiveMessageC用来打开和关闭栈,其余两个分别为收发组件。
组件接口上的相似,也带来了实现上的相似。
如下所示:
componentsActiveMessageC;
componentsnewAMSenderC(AM_BLINKTORADIOMSG);
BlinkToRadioC.Packet->
AMSenderC;
BlinkToRadioC.AMPacket->
BlinkToRadioC.AMSend->
BlinkToRadioC.AMControl->
ActiveMessageC;
componentsSerialActiveMessageC;
componentsnewSerialAMSenderC(AM_BLINKTORADIOMSG);
SerialAMSenderC;
SerialActiveMessageC;
实验要求说明
实验具体要求,修改BlinkToRadio程序,使用mig创建BlinkToRadioMsg的java对象,BaseStation(该程序不改动)将BlinkToRadio发送的消息转发到串口,然后使用MsgReader读取BlinkToRadioMsg对象。
提示步骤:
1.按照TestSerial例子修改makefile。
注意,javac后面应该接一个tab字符而不是空格。
2.然后输入maketelosb命令生成BlinkToRadioMsg的java类。
如果遇见以下类似信息
warning:
CannotdetermineAMtypeforBlinkToRadioMsg
(LookingfordefinitionofAM_BLINKTORADIOMSG)
就需要将AM类型从AM_BLINKTORADIO改为AM_BLINKTORADIOMSG,这是mig命名规则的需要。
然后再次编译烧录。
3.BaseStation节点与修改后的BlinkToRadio节点都通电。
然后在BlinkToRadio目录输入:
javanet.tinyos.tools.MsgReaderBlinkToRadioMsg
结果应该类似以下:
1152232617609:
Message
[nodeid=0x2]
[counter=0x1049]
[counter=0x104a]
[counter=0x104b]
1152232617621:
[counter=0x104c]
实验过程说明
首先需要修改节点通信的相关信道,选择26信道,在Makefile文件中进行修改,PFLAGS+=-DCC2420_DEF_CHANNEL=26。
对BlinkToRadio程序中的Makefile文件进行修改,使用mig创建BlinkToRadioMsg的java对象:
BlinkToRadioMsg.java:
migjava-target=null$(CFLAGS)-java-classname=BlinkToRadioMsgBlinkToRadio.hBlinkToRadioMsg-o$@
申请节点,自动分配为3号和4号节点,将3号节点作为普通节点,烧录BlinkToRadio程序,4号节点作为基站节点,烧录BaseStation程序,可以看到4号节点的LED1灯在不停的闪烁,说明基站节点不停的收到网络包并将其发送至串口。
由于缺少MsgReader命令,实验中使用Listen命令进行代替,对4号节点即基站节点进行读数,结果如下图所示:
图中每一行代表基站节点收到的一个网络包,最后二个字节代表的是计数值,可以看到为递增数。
修改后的核心程序清单
BlinkToRadioC.nc
implementation{
uint16_tcounter;
message_tpkt;
boolbusy=FALSE;
voidsetLeds(uint16_tval){
if(val&
0x01)
callLeds.led0On();
else
callLeds.led0Off();
0x02)
callLeds.led1On();
else
callLeds.led1Off();
0x04)
callLeds.led2On();
callLeds.led2Off();
}
eventvoidBoot.booted(){
callAMControl.start();
eventvoidAMControl.startDone(error_terr){
if(err==SUCCESS){
callTimer0.startPeriodic(TIMER_PERIOD_MILLI);
else{
eventvoidAMControl.stopDone(error_terr){
eventvoidTimer0.fired(){
counter++;
if(!
busy){
BlinkToRadioMsg*btrpkt=
(BlinkToRadioMsg*)(callPacket.getPayload(&
pkt,sizeof(BlinkToRadioMsg)));
if(btrpkt==NULL){
return;
btrpkt->
nodeid=TOS_NODE_ID;
counter=counter;
if(callAMSend.send(AM_BROADCAST_ADDR,
&
pkt,sizeof(BlinkToRadioMsg))==SUCCESS){
busy=TRUE;
eventvoidAMSend.sendDone(message_t*msg,error_terr){
if(&
pkt==msg){
busy=FALSE;
eventmessage_t*Receive.receive(message_t*msg,void*payload,uint8_tlen){
if(len==sizeof(BlinkToRadioMsg)){
BlinkToRadioMsg*btrpkt=(BlinkToRadioMsg*)payload;
setLeds(btrpkt->
counter);
returnmsg;
}
实验感想
节点与PC之间的通信是无线传感网里获取数据的最后一步,Sink节点即使获取到很多数据,如果不能传送给后方数据库,那么一切都没有意义。
通过阅读代码,明白了节点与PC串口之间收发数据大致是怎么一个流程。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验4 节点PC串口通信实验 实验 节点 PC 串口 通信