TinyOS 2.x 入门教程 - 图文 下载本文

TinyOS Programming

Received packet sequence number 6 Sending packet 4 Received packet sequence number 7 Received packet sequence number 8 Sending packet 5 Received packet sequence number 9 6.2 串口助手:PC上显示从串口读取的数据

我们可以直接用TinyOS自带的一些工具查看串口收到的数据,也可以下载一些第三方串口软件读写软件,甚至自己编写。

1)用TinyOS自带的工具,首先要知道你的Telosb节点所占用的端口,要知道所占用的端口,打开Cygwin,输入motelist命令即可,例如:COM17。然后,输入:java net.tinyos.sf.SerialForwarder –comm serial@COM17:57600,如图6.1所示,注意这个COM17,即可启动TinyOS自带的串口数据查看工具之一。其中7D之前(包括7D)是一些协议或其它数据,真正发送的数据只有7D后面的数据而已!

图6.1 使用TinyOS自带串口工具

2)用第三方软件,在此我们使用一个叫做“串口助手”(打开后标题栏为“串口助手”)的串口读写工具,该工具可以在windows平台运行,下载地址在附录一有说明。串口助手使用也很简单,首先进行“串口配置”,单击“串口配置”按钮,弹出一个对话框,如图6.2所示,选择相应的端口 (port) 和波特率 (Baud rate),单击“OK”即可。注意:波特率为57600!

图6.2 配置串口

Page 38 of 94

TinyOS Programming

然后选择16进制显示,即“HEX显示”。就可以以16进制的形式查看从串口接收到的数据了。如图6.3所示:

图6.3 第三方串口工具接收数据

在第三方串口读写软件“接收区”可以看到,接收Telosb节点发送过来的一个数据包,数据量似乎要比TinyOS自带的串口读写工具的数据量多很多。其实,TinyOS自带的工具跟第三方软件读取到的数据是一样的!都是第三方软件显示的那些数据,只不过TinyOS自带的工具是熟悉TinyOS串口数据的人员编写的,去掉了一些协议数据而已,例如:前面的7E 42及后面的93 01 7E等数据。真正的数据是5D后面的某些数据(备注:最后面三个数据不是),即红色方框圈住的数据,具体的数据量跟你发送的数据量一致。

6.3 Telosb从串口读取数据

一般来说,只有跟PC连接的Telosb节点才需要读取串口的数据。这些数据不会太多,也不会太复杂,所以笔者使用Telosb读取串口数据时,使用HPLUART接口,或者使用笔者自己编写的串口组件读取串口数据。HPLUART接口每次接收或发送一个字节的数据至串口。

现在来看看HPLUART接口,其定义如下,大家可以在tinyos-2.x\\tos\\interfaces 目录下找到该接口的定义文件:

interface HPLUART { /*初始化串口*/ async command result_t init(); /*停止串口*/ async command result_t stop(); /*发送一个8bit的数据*/ async command result_t put(uint8_t data); /*若串口接收到一个字节的数据则触发此事件*/ async event result_t get(uint8_t data); /*发送一个字节数据完毕触发此事件*/ async event result_t putDone(); } 从上面代码大家可以看到,该接口相当简单,使用很方便,尤其是数据量不多时是最好的选择!该接口由HPLUARTC组件提供,大家可以在此目录找到此文件:tinyos-2.x\\tos\\platform\\telos。

Page 39 of 94

TinyOS Programming

下面让我们看一个使用HPLUART接口读取串口数据的非常简单的示范程序:testHPLUART。该程序在tinyos-2.x目录下是找不到的,是笔者自己编写的简单程序。

首先,看看testHPLUARTM模块的代码: module testHPLUARTM { uses { interface HPLUART; interface Leds; } provides interface StdControl; }

implementation { command result_t StdControl.init() { call Leds.init(); call Leds.redOff(); call Leds.greenOff(); call Leds.yellowOff(); return SUCCESS; } command result_t StdControl.start() { call HPLUART.init(); return SUCCESS; } command result_t StdControl.stop() { call Leds.set(0); call HPLUART.stop(); return SUCCESS; } async event result_t HPLUART.putDone() { return SUCCESS; }

async event result_t HPLUART.get(uint8_t data) { uint8_t tmp; atomic tmp = data; if(1 == tmp) { call Leds.redToggle(); }

Page 40 of 94

TinyOS Programming

} } else if(2 == tmp) { call Leds.greenToggle(); } else if(3 == tmp) { call Leds.yellowToggle(); } return SUCCESS; 这个模块使用HPLUART接口中的get事件获取串口的数据,大家略为注意一下加粗的部分就行了,不过值得指出的是:使用HPLUART接口接发数据之前要初始化串口。

接下来看看testHPLUART配件的代码: configuration testHPLUART { } implementation { components Main ,LedsC ,HPLUARTC ,testHPLUARTM ; Main.StdControl -> testHPLUARTM; testHPLUARTM.Leds -> LedsC; testHPLUARTM.HPLUART ->HPLUARTC; } 上述代码中,需要注意的同样是字体加粗的语句。

6.4 Oscilloscope应用程序——数据感知

节点上的程序在文件夹:tinyos-2.x\\apps\\Oscilloscope。此程序从内部温度传感器每读10个数据就把采集到的数据广播出去。即Oscilloscope周期性的将传感器读取的数据发送到基站节点。

程序使用的是默认的传感模块,我们可以用如下语句对其进行编译: SENSORBOARD= make 同时,我们可以通过修改OscilloscopeAppC.nc配置文件对程序所调用的默认的探测模块,如温度探测、光强探测等。

首先,让我们略为浏览一下OscolloscopeC模块的代码:

#include \#include \ module OscilloscopeC @safe()

Page 41 of 94