nesC编程迷你教程解读
nesc手册1
nesc手册1第一个程序摘要:1、一个接口声明了接口提供者必须执行的“命令”函数集;另一个则是接口使用者必须执行的“事件”函数集2、命令和事件都作为硬件时间处理器的一部分而执行,这里必须使用关键字async 来进行声明3、竞态条件下在编译时间内,nesC编译器的这个报告(数据竞态情况)可能包含并不可能发生的错误。
在这种情况下,必须使用关键字norace 来定义一个变量。
使用关键字norace时,一定要慎重。
4、Blink应用程序可以使传感器上红色的二极管以1Hz 的频率闪烁。
Blink.ncconfiguration Blink {}implementation {components Main, BlinkM, SingleTimer, LedsC;Main.StdControl -> BlinkM.StdControl;Main.StdControl -> SingleTimer.StdControl;BlinkM.Timer -> SingleTimer.Timer;BlinkM.Leds -> LedsC;}5、切记:配置可以使用和提供接口。
(由花括号后面的关键字implementation 来完成。
)6、StdControl 是一个普通接口,用来初始化和启动TinyOS 组件StdControl.ncinterface StdControl {command result_t init();command result_t start();command result_t stop();}Init()命令可能被多次调用,但是如果start()和stop()命令被调用,它就不会再被系统所调用StdControl 有效的调用模式是: init*( start | stop)*。
7、箭头(->)表示绑定关系。
组件在左侧使用接口,而接在右侧提供口(箭头总是绑定接口(左侧)和执行(右侧))8、BlinkM.nc模块module BlinkM {provides {interface StdControl;}uses {interface Timer;interface Leds;}}// Continued below...这段代码的第一部分,是一个叫BlinkMand 的模块,它声明了可以提供和使用的接口9、Leds 接口定义了一些像redOn(),redOff()之类的命令,可以在传感器上打开或者关闭不同的LEDs(红色,绿色,或者黄色)。
串口屏MINIC教程6-for循环和数组使用说明V1.0
4.1 准备工程素材
在实现教程 DEMO 前需要作以下三个准备: 1. 硬件平台, 2. UI 素材, 3. MINIC 编辑器。 4.1.1 硬件平台 该例程使用大彩基本型 7 寸串口屏 DC80480B070 为验证开发平台。如图 4- 1 所示
图 3- 1 MINIC 编辑器
MINIC 包括的功能有:算数运算、位运算、逻辑运算、比较运算、赋值、IF 选择语句、 系统功能调用等,具体语法与 C 语言一致。
算数运算:+加、-减、*乘、/除、%取模 ++自加 –自减 位运算:|位或、&位与、^按位异或、~按位取反 逻辑运算:||逻辑或、&&逻辑与、!逻辑非 比较运算:==、!=、<=、>=、<、> 赋值:= ;(同时“=”支持数值和字符串相互赋值) @操作符:符判定某个寄存器是否发送改变,例如 if(@ “温度”) 常量:包括整数(168)、 浮点数(3.14)、十六进制数(0xAABB)
图 2- 1 软件版本
(2) 打开 VisualTFT,在软件右下角可以查看软件版本图 2- 2 所示,最新版本可登录 大彩官网下载。
图 2- 2 软件版本
2. 串口屏固件版本: 基本型(经济型、商业型): MB 2.22.912.259 及以上的版本支持; 物联型:V3.0.301.0 及以上的版本支持; F 型:V4.1.66.0 及以上的版本支持。
4. 函数:on_timer(int timer_id) 功能:定时器超时通知 参数:timer_id,定时器 ID 注:要先启动定时器,才可以触发回调通知
5. 函数:on_variant_upate() 功能:通过串口读写寄存器导致变量更新时,执行此函数。使用“@”操作符判定 某个寄存器是否发送改变,例如 if(@“温度”)。
LEGO NXC 编程快速入门
用户操作界面看起来与标准的文本编辑器非常相似。除了有常用的菜单和功能按钮外, 还有一些进行机器人编程的特设功能菜单,比如将程序进行编译并下载给机器人的菜单,或 者从机器人中获取信息的菜单等。
现在我们开始编写一个新程序,点击 New File(新文件)按钮创建一个空白的新窗口。 然后输入如下 NXC 程序代码: Task main() {
更进一步,假设机器人碰撞到什么障碍物,我们让它后退一点,然后转弯,接下来继续 前进。程序代码如下所示:
Task main() {
SetSensor); // 前进 While(true)
{ if(SENSOR_1= =1) // 碰撞障碍物 { OnRev(OUT_AC, 60);Wait(200); // 后退 OnFwd(OUT_A, 60);Wait(200); // 转弯 OnFwd(OUT_AC, 60); // 继续前进 } }
项目 B 前进,转弯
我们将机器人的运动编程更进一步,下面的程序让机器人前进一段距离,然后利用停止 /倒退其中一个马达的方法,使机器人右转 90 度。
Task main() {
OnFwd(OUT_AC, 60); Wait(900); OnRev(OUT_C, 60); Wait(320); Off(OUT_AC); }
}
项目 G 我是 K 歌之王
不发出点声音,当我不存在呀,哼! LEGO NXT 使用了.rso 格式的声音文件。在 BricxCC 软件中有一个将.wav 文件转变为.rso 文件的工具,它位于 Tools 菜单下的 Sound conversion。 PlayFileEx(filename,volume, loop?) / 播放声音的命令 Filename 为指定的声音文件, Volume 音量大小,其数值从 0 到 4。 Loop 是否循环播放 PlayToneEx(frequency, duration, volume, loop?); / 播放音乐的命令 Frequency 声音频率,单位为赫兹。 Duration 持续时间。 使用 BricxCC 中的组件 Brick Piano,我们可以非常轻松地创建音乐。
串口屏MINIC教程3-各种运算使用说明V1.0
MINIC 教程-运算使用说明 V1.0
1. 适合范围
文档适合广州大彩基本型、经济型、商业型、F 型、物联型、86 盒、485 系列等所有 MODBUS 协议的串口屏产品。
1/ 19
MINIC 教程-运算使用说明 V1.0
2. 开发环境版本
1. VisualTFT 软件版本:V3.0.0.827 及以上的版本,版本查看方式: (1) 打开 VisualTFT 软件启动页面如图 2- 1 所示,右上角显示的软件版本号;
图 2- 1 软件版本
(2) 打开 VisualTFT,在软件右下角可以查看软件版本图 2- 2 所示,最新版本可登录 大彩官网下载。
图 2- 2 软件版本
2. 串口屏固件版本: 基本型(经济型、商业型): MB 2.22.912.259 及以上的版本支持; 物联型:V3.0.301.0 及以上的版本支持; F 型:V4.1.66.0 及以上的版本支持。
5. 完整程序清单.................................................................................................17 6. 免责声明.........................................................................................................19
5. 函数:on_variant_upate() 功能:通过串口读写寄存器导致变量更新时,执行此函数。使用“@”操作符判定 某个寄存器是否发送改变,例如 if(@“温度”)。
6. 函数:on_screen_change (int screen_id) 功能:画面切换通知,当前画面 ID 发生变化时执行此函数 参数:screen_id,当前画面 ID
《实验指导书_TinyOS系统与nesC程序设计》
TinyOS系统与nesC程序设计课内实验指导书一、课内实验项目一览表二、详细实验指导书实验一:编程环境建立一实验目的1、掌握Java基本开发环境(JDK)的安装和配置方法。
2、掌握cygwin程序的安装,在建立windows下类似Unix环境。
3、掌握Linux基本命令及cygwin下安装TinyOS的方法。
二实验原理无三实验环境1、运行Windows的PC机,能够连接Internet2、PC机配置要求:四实验内容和步骤1、java jdk安装首先,我们安装JA V A开发工具JA V A JDK 1.6官方下载地址:/javase/downloads/.安装过程只需下一步……下一步便可,默认安装路径是C:\Program Files\Java上图是TinyOS 2.0.2 安装时截取的JA V A JDK1.5的图,只供参考。
然后,我们需要设置电脑的环境变量,需要新建两个环境变量,以便使用JDK 具体过程如下:右击我的电脑——〉属性——〉高级——〉环境变量先新建或编辑系统变量:变量名(N):JA V A_HOME变量值(V):JDK安装的路径,其默认的路径为:C:\Program Files\Java\jdk1.6.0_10变量名(N):CLASSPATH变量值(V):.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;;%JAVA_HOME%\bin;%JAVA_HOME%\jr e\bin;在系统变量(S)栏选中变量为Path的选项,点编辑在变量值(V)的末尾添加:;%JAVA_HOME%\bin; ;%JAVA_HOME%\jre\bin;然后新建或编辑用户变量:同样再设置一个JAVA_HOME,变量值也一样。
在用户变量的PATH中添加:;%JAVA_HOME%\bin:$PATH;%JAVA_HOME%\jre\bin:$PATH;这样,我们的环境变量已经设置完毕了。
三星nx简易编程手册(全)
三星NX系列常用编程手册一.编程步骤1.开启编程2.输入程序代码3.修改相应的程序二.程序内容1、开启编程(MMC 20)按完TRANSFER键输入20后再输入程序密码(初始为4321),然后选择1(ENABLE)再按TRANSFER键就开启了系统编程。
例:操作步骤显示按TRANSFER PROGRAM CODE:代码20 PASSCODR:密码4321 DISABLE1 ENABLETRANSFER Tue,14 Oct 03:102、弹性编号(MMC 70)进入该项后,按MSG键选择修改项目:分机号码(STN:201-2XX)、分机组号(SGR:500-519)、中继线代码(TRK:701-7XX)、中继线组号(TGR:9,80-89)、功能代码。
再按音量键找到要修改的号码,输入新的数字。
例:把210分机修改成299操作步骤显示按TRANSFER PROGRAM CODE:代码70 STN09:201:+ STN22:210:分机号299 STN22:210:299存储MESSAGE SGR01:500:3、服务等级(MMC 30)进入该项后,按音量键选择分机,再输入两位数,第一位数代表白天服务等级,第二位数代表晚上服务等级。
等级A------没有限制等级B------根据B等级禁止/允许码表等级C------根据C等级禁止/允许码表等级D------根据D等级禁止/允许码表等级E------根据E等级禁止/允许码表等级F------只能打分机等级A.B.C.D.E对应按键1.2.3.4、例如;把202该成AC等级操作步骤显示按TRSF PROGRAM CODE代码30 201;AA4.等级限制码(MMC 60)进入该项后,按音量键,再输入新的限制码,然后按重拨键输入0或者1来选择限制的等级。
0:无限制,1:限制.例:限制B等级,只需将B下面的0改成1就行了。
5、设置外线振铃(MMC 43)进入该项后,用音量键选择外线,用MSG键选择振铃模式和白天晚上的振铃分机或分机组。
精品课件-TinyOS操作系统开发技术及实践-第2章
3
第2章 nesC语言基础
2.2 nesC和C的比较 按照TinyOS官方说法,nesC来源于C,是C语言的一种变种, 所有的C语言中的结构体、函数、甚至指针(建议少使用指针)、数 据类型以及注释格式在nesC中依然是合法的,对于C程序员来说, nesC提出了三个“新概念”: 组件:一组可重用的代码和数据组合,类似于C++中的类。 接口:一组可为其他组件服务的函数和事件集合,是组件之 间交互的界面。 并发执行模型:基于任务和中断的处理机制,定义了组件之 间如何调用,以及中断代码和非中断代码如何交互执行规则。 nesC与C语言的区别主要有程序组成主体、模块之间的调用、命名 空间、编程思想等几方面,下面将对这几个方面进行分析。
第2章 nesC语言基础 第2章 nesC语言基础
2.1 nesC概述 2.2 nesC和C的比较 2.3 nesC程序结构 2.4 接口 2.5 组件 2.6 nesC高级编程 2.7 并发模型 2.8 常用接口和组件 2.9 可视化组件关系图
1
第2章 nesC语言基础
2.1 nesC概述 nesC(Network Embedded System C)是专门为编写TinyOS以 及进行TinyOS编写应用程序而发明的一种语言,用nesC而不是C 语言编写TinyOS(TinyOS最初是由C和汇编编写的)主要基于以下 两点: nesC在语法上支持TinyOS需要的并发执行模型。 nesC编写的源码为编译器的优化提供了可能,最终可以缩小 可执行代码尺寸。 因此,使用nesC生成的程序,更加适合无线传感网络节点。 由于nesC的学习有点难度,建议从C和nesC的区别入手,辅之以 示例,逐渐掌握其编程规则。
*/
25
第2章 nesC语言基础
(完整word版)快思聪编程说明
快思聪中控编程方法一、关于快思聪Windows®快思聪SIMPL™软件提供了所有必要的工具来配置、程序、测试和调试一个集成控制系统的应用。
结合Windows®的拖放功能的编程能力的SIMPL(符号密集掌握编程语言),SIMPL Windows提供了系统的硬件组成之间的联系快思聪、用户界面和世界的设备控制.配置方面的SIMPL Windows允许你选择控制系统,用户接口、网络设备和控制设备所需的安装。
这些硬件组件可以指定端口地址,网络id和IP地址,集通信参数并指定哪些设备被连接到某个卡或网络控制模块。
您还可以指定什么VisionTools pro e™touchpanel项目所需的系统。
编程方面允许你选择逻辑符号系统将需要,分配给那些符号和连接信号的信号与其他符号或设备确定的程序逻辑。
SIMPL Windows包括的各种符号不断扩大到支持几乎所有可能的应用程序。
当你变得SIMPL能熟练地使用Windows,它将变得明显,有很多方法可以解决相同的控制问题。
这允许编程创造力和独立的灵活性。
最后,测试方面可以让你测试以及调试SIMPL Windows程序使用强大的诊断工具,包括测试经理,网络分析仪,快思聪视窗。
您可以调用这些工具直接从SIMPL Windows或启动工具独立。
对于更大的灵活性,SIMPL Windows安装包包括SIMPL +,是一个开发工具,允许高级程序员创建和编译自定义控制模块使用一种程序语言类似于c,你可以添加到你的SIMPL SIMPL +模块Windows程序或用户模块就像一个罗技二、系统需求需要以下SIMPL Windows系统最低配置:Windows 98 / NT / 2000 / XP操作系统Pentium II 333 MHz的处理器(1.3 GHz Pentium 4推荐)256 MB的RAM(512 MB推荐)256彩色设置(高色16位推荐)三、菜单说明四、快捷键SIMPL Windows提供了许多键盘快捷键,使你快速访问功能和命令.一般快捷键(项目经理和配置管理器)F1视图的上下文敏感的帮助Ctrl + T开始(打开SIMPL Windows选择屏幕)Ctrl + N创建新项目Ctrl + M创建新的项目/用户模块Ctrl + O打开现有的程序Ctrl + S保存项目CTRL + W项目经理之间的切换和配置管理器Alt + C指定通信设置F12转换/编译程序删除删除选定的信号或符号Alt + F4退出打印/视图快捷键(项目经理)新闻到Ctrl + P打印选择(符号库,程序详细视图或视图)Alt + Z集变焦为所选的符号的细节Alt + Shift + Z集变焦所有符号的细节Ctrl + E扩大所选文件夹或设备Ctrl + Shift + E关闭选定的文件夹或设备F5刷新所有视图和重建项目和用户红外数据库Alt + Y显示/隐藏的符号库窗格ALT + P显示/隐藏程序视图面板中ALT + B视图之间切换F8跳转到下一个面板Shift + F8跳转到前面的窗格CTRL + R查看/编辑装置或符号名称、说明和评论选项卡查看/编辑装置或符号名称、说明和评论(项目视图仅) F9查找和替换CTRL + D显示符号详细Ctrl + F4关闭符号详细F7大小适合高度象征的细节Shift + F7大小适合宽度象征的细节符号/信号快捷键(项目经理)新闻到Alt + D / Alt + A / Alt + S开关之间的数字,模拟和串行页的一个符号的细节。
nesC语言参考手册范本
nesC语言参考手册1 简介nesC 是对 C 的扩展,它基于体现 TinyOS 的结构化概念和执行模型而设计。
TinyOS 是为传感器网络节点而设计的一个事件驱动的操作系统,传感器网络节点拥有非常有限的资源( 举例来说., 8K 字节的程序储存器,512个字节的随机存取储存器) 。
TinyOS 用 nesC 重新编写。
本手册描述 nesC 的 1.1 版本, 在第 3 段中概述了它与1.0版的不同。
nesC 基本概念如下:结构和容的分离: 程序有组件构成, 它们装配在一起 (" 配线 ") 构成完整程序. 组件定义两类域, 一类用于它们的描述 ( 包含它们的接口请求名称) ,另一类用于它们的补充。
组件部存在作业形式的协作。
控制线程可以通过它的接口进入一个组件。
这些线程产生于一件作业或硬件中断。
根据接口的设置说明组件功能。
接口可以由组件提供或使用。
被提供的接口表现它为使用者提供的功能,被使用的接口表现使用者完成它的作业所需要的功能。
接口有双向性: 它们叙述一组接口供给者 (指令)提供的函数和一组被接口的使用者(事件)实现的函数。
这允许一个单一的接口能够表现组件之间复杂的交互作用 (举例来说.,当某一事件在一个回调之前发生时,对一些事件的兴趣登记)。
这是危险的,因为TinyOS 中所有的长指令 (举例来说. 发送包)是非中断的; 他们的完成由一个事件( 发送完成)标志。
通过叙述接口,一个组件不能调用发送指令除非它提供 sendDone 事件的实现。
通常指令向下调用,比如,从应用组件到那些比较靠近硬件的调用,而事件则向上调用。
特定的原始事件与硬件中断是关联的 (这种关联是由系统决定的,因此在本参考手册中不作进一步描述)。
组件通过接口彼此静态地相连。
这增加运行时效率,支持 rubust 设计, 而且允许更好的程序静态分析。
nesC基于由编译器生成完整程序代码的需求设计。
这考虑到较好的代码重用和分析。
Mini-Circuits USB RF Switch Matrices 编程指南说明书
Page20/5/2012 1Mini-Circuits ®Programming ManualFor theItem Description Page1 Overview (3)2 Operating in a Windows® Environment……….……………………………... 4 - 8 2.1 Software supported by ActiveX® and .NET Class Library……………… 5 - 6 2.2 DLL Structure (Functions & Properties)…………………………………..7 - 8 2.3 Samplecode (9)3 Operating in a Linux® Environment……….……………….………………….10 - 14 3.1 Samplecode (14)Page20/5/20122This programming Manual is intended for customers wishing to create their own interface for Mini-Circuits' USB RF Switch Matrices.Mini-Circuits offers support for USB Portable Test Equipment (PTE) in Windows® and Linux®Operating Systems, in a variety of programming environments including third-party applications such as LabVIEW® and MATLAB® through .NET assembly and ActiveX®Controls to write your own customized control applications.Mini-Circuits' CD package Includes: GUI program installation, DLL Objects 32/64 bit, Linux Support, project examples for 3RD party software and Documents. The latest CD version is available for download at /support/software_download.html , see Figure 1.Figure 1 – Download ScreenPage20/5/20123Page20/5/2012 4The DLL Object (D ynamic L ink L ibrary) - Concept:D ynamic L ink L ibrary is Microsoft's implementation of the shared library concept in the Microsoft Windows ® environment.DLLs provide a mechanism for shared code and data, allowing a developer of shared code/data to upgrade functionality without requiring applications to be re-linked or recompiled.Mini-Circuits' CD package provides DLL Objects in order to allow your own Software Application to interface with the functions of the Mini-Circuits' USB Portable Test Equipment hardware, see Figure 2.Figure 2 – DLL InterfaceMini-Circuits' provides two DLLs files:1. ActiveX ® com object - MCL_RF_Switch_Controller.dll Æ Click to download/support/software_download.htmlActiveX ®com object can be used in any programming environment that supports ActiveX ® objects - third party COM (C omponent O bject M odel) compliant application. The ActiveX ® DLL should be registered using RegSvr32 (see pages 5 and 6 - Register an ActiveX ® DLL).2. .NET Class Library - MCL_RF_Switch_Controller64.dll Æ Click to download /support/software_download.html.NET object – a logical unit of functionality that runs under the control of the .NETPage20/5/20125 MCL_RF_Switch_Controller.dll- ActiveX® com objectMCL_RF_Switch_Controller64.dll- .NET Class LibraryInstructionsFor 32bit Windows OS, copyMCL_RF_Switch_Controller.dll towindows\system32 folderFor 64bit Windows OS, copyMCL_RF_Switch_Controller.dll towindows\SysWOW64 folderRegister the DLL, see instructions belowInstructionsFor 32bit Windows OS copyMCL_RF_Switch_Controller64.dll towindows\system32 folderFor 64bit Windows OS copyMCL_RF_Switch_Controller64.dll towindows\SysWOW64 folderDLL Registry is not requiredVisual Studio 6 (VC++,VB®)NI LabVIEW® 8.0 or newerMATLAB® 7 or newerDelphi®Borland C++Agilent VEE®PythonNI CVINET (VC++, , C# 2003,2005,2008,2010)NI LabVIEW®_2009 or newerMATLAB® 2008 or newerDelphi®Borland C++* Additional 3RD party software are supported, contact Mini-Circuits for details.How to register MCL_RF_Switch_Controller.dll, 32-bit DLL, on a 32-bit Windows OS?Open the Run Command from the Start Menu and typeregsvr32 c:\windows\system32\mcl_RF_Switch_Controller.dllFigure 3 – Run CommandPage20/5/20126 How to register MCL_RF_Switch_Controller.dll, 32-bit DLL on a 64-bit Windows OS?Run the Command Prompt as Administrator, see figure 4Figure 4 – Command PromptType regsvr32 c:\windows\syswow64\mcl_RF_Switch_Controller.dll, see figure 5Figure 5 – Type commandClick Enter, see figure 6.Figure 6 – Registration succeededPage20/5/2012 7Functions Description:1. Int Connect(Optional String SN)SN parameter is needed when more than one Switch Box is connected to the computer. SN is the Serial Number of the Switch Box and can be ignored if using only one box.2. Int ConnectByAddress(Optional Short Address)Address parameter represents the Address of the Switch Box.The address can be any integer number from 1 to 255 and can be changed by the SetAddress function (function 9).Address parameter is needed if more than one Switch Box is connected to PC.In this case the connection to the Switch Box is by Address instead of SN.This is an alternative to Function 1 (connect by SN).3. Void Disconnect()Close connection to the Switch Box. It is strongly recommended to use this function to disconnect the device before ending the program.Shutting down the program without disconnecting the device may result in connection problem to the device. To resolve the issue shout down the program, then unplug the Switch Box from the computer and plug it back in before starting the program again.4. Int GetSwitchesStatus(Int StatusRet)StatusRet - Contains the status for each switch in the box. The LSB bit represents switch "A" then "B" etc...For example: if StatusRet=12 (B00001100) - Switch C and D are ENERGIZED, all others DE-ENERGIZED.The function returns a non-zero value upon success.5. Int Read_Model_Name(String ModelName)ModelName - Contains the Switch Box Model Name The function returns a non-zero value upon success.6. Int Read_SN(String SN)SN- Contains the Switch Box Serial NumberThe function returns a non-zero value upon success.DLLs Functions MCL_RF_Switch_Controller.dll and MCL_RF_Switch_Controller64.dll1. Int Connect(Optional String SN)2. Int ConnectByAddress(Optional Short Address)3. Void Disconnect()4. Int GetSwitchesStatus(Int StatusRet)5. Int Read_Model_Name(String ModelName)6. Int Read_SN(String SN)7. Int Set_Switch(String SwitchName, Int Val) 8. Int Set_SwitchesPort (Byte Val) 9. Int Set_Address(Int Address) 10. Int Get_Address()11. Int Get_Avaliable_SN_List(String SN_List)12. Int Get_Avaliable_Address_List(String Add_List) 13. Float GetDeviceTemperature(Short TSensor) 14. Int GetHeatAlarm()7. Int Set_Switch(String SwitchName, Int Val)SwitchName – Contains the switch letter can be "A","B","C" or "D" (model must have the switch designated)Val - Contains 0 for DE-ENERGIZED any other value (1 to 255) for ENERGIZED.The function returns a non-zero value upon success.8. Int Set_SwitchesPort (Byte Val)This function allows you to set all switches in the Matrix to the desired state with a singlecommand.Each bit in the "Val" parameter controls the state of a different switch ('0'=De-Energized,'1'=Energized). LSB controls Switch A.For example Set_Switches(5) will set switch A and C to Energized, and all others De-Energized.(Decimal 5 is Binary 00000101: bits A and C are set to "1"=Energized).The function returns a non-zero value upon success.9. Int Set_Address(Int Address)Set the address of the unit. The address can be any number in the 1 to 255 range.The function returns a non-zero value upon success.10. Int Get_Address()The function returns the device address.If fails - Returns 0.11. Int Get_Avaliable_SN_List(String SN_List)SN_List contains a list of all available Serial Numbers (separated by a single space character): [SN1] [SN2] [SN3] [SN4]....The function returns a non-zero value upon success.12. Int Get_Avaliable_Address_List(String Add_List)Add_List contains a list of all available addresses (separated by a single space character).The function returns a non-zero value upon success.13. Float GetDeviceTemperature(Short TSensor)Get the device temperature.The device may have 2 internal temperature sensors.Tsensor =1 for sensor number 1 or 2 for sensor no 2.The function returns the temperature value in Celsius.14. Int GetHeatAlarm()The function returns 1 if the temperature of either of the temperature sensors exceeds 50° Celsius, (usually the temperature should not exceeded this value), else return 0.Page20/5/20128The CD package also includes a number of sample programs developed to show you how to write your own programs. The sample programs were developed in Visual C++®, Visual Basic®, C# and LabVIEW®. The sample programs provide an excellent starting point to write your own applications. The complete project samples are available on the CD or at:/support/software_download.htmlPage20/5/20129To open a connection to the RF Switch Box, Vendor ID and Product ID are required: Mini-Circuits Vendor ID is: 0x20CEUSB RF Switch Box Product ID is: 0x22The communication with the sensor is done by USB Interrupt.The transmitted and received buffer sizes are 64 Bytes.Transmit Array should be 64 bytes [Byte 0][Byte1][Byte2]………[Byte 63] Receive Array contains 64 bytes [Byte 0][Byte1][Byte2]………[Byte 63] Commands List:# Description Command Code –Byte[0]Additional Transmitted Bytes1 Get device Model Name 40 --2 Get device Serial Number 41 --3 Set Switch A(ENERGIZED or DE-ENERGIZED1 Byte[1] – 0 DE-ENERGIZEDor 1 ENERGIZED4 Set Switch B(ENERGIZED or DE-ENERGIZED2 Byte[1] – 0 DE-ENERGIZEDor 1 ENERGIZED5 Set Switch C(ENERGIZED or DE-ENERGIZED3 Byte[1] – 0 DE-ENERGIZEDor 1 ENERGIZED6 Set Switch D(ENERGIZED or DE-ENERGIZED4 Byte[1] – 0 DE-ENERGIZEDor 1 ENERGIZED7 Set all switches 9 Byte[1] – see description8 Get Switches Status 15* See detailed description on pages 11 - 13Page20/5/201210Page20/5/2012 111. Get Device Model NameTransmit ArrayTo get the Device Model Name, code number 40 should be sent.Byte[0]=40Bytes[1] through [63] are NC - Not CareReceived ArrayThe model name will be returned in the receive array of ASCII characters. End of model name is signified by a 0 value.Byte[0]=40Byte[1] to the byte before the 0 value = Model NameAll bytes after the 0 value up to byte [63] contain random values2. Get Device Serial Number:Transmit ArrayTo get the Device Serial Number, code number 41 should be sentByte[0]=41Bytes[1] through [63] are NC - Not CareReceived ArrayThe Serial Number will be returned in the receive array of ASCII characters. End of SerialNumber is signified by a 0 value.Byte[0]=41Byte[1] to the byte before the 0 value= Serial NumberAll bytes after the 0 value up to byte [63] contain random values3. Set Switch A: Available for all modelsTransmit ArrayTo set Switch A, code number 1 should be sent in Byte[0], and Byte[1] should be 0 for DE-ENERGIZED or 1 for ENERGIZEDByte[0]=1Byte[1] = 0 for DE-ENERGIZED or 1 for ENERGIZEDBytes[2] through [63] are NC - Not CareReceived ArrayThe returned array of 64 bytes will be as follows:Byte[0]=1Byte[1] through [63] contain random values4. Set Switch B:NOT Available for the USB-1SPDT-A18Transmit ArrayTo set Switch B, code number 2 should be sent in Byte[0], and Byte[1] should be 0 for DE-ENERGIZED or 1 for ENERGIZEDByte[0]=2Byte[1] = 0 for DE-ENERGIZED or 1 for ENERGIZEDBytes[2] through [63] are NC - Not CareReceived ArrayThe returned array of 64 bytes will be as follows:Byte[0]=2Byte[1] through [63] contain random values5. Set Switch C:NOT Available for the USB-1SPDT-A18 or USB-2SPDT-A8Transmit ArrayTo set Switch C, code number 3 should be sent in Byte[0], and Byte[1] should be 0 for DE-ENERGIZED or 1 for ENERGIZEDByte[0]=3Byte[1] = 0 for DE-ENERGIZED or 1 for ENERGIZEDBytes[2] through [63] are NC - Not CareReceived ArrayThe returned array of 64 bytes will be as follows:Byte[0]=3Byte[1] through [63] contain random valuesPage20/5/2012126. Set Switch D:Available for the USB-4SPDT-A18 ONLYTransmit ArrayTo set Switch D, code number 4 should be sent in Byte[0], and Byte[1] should be 0 for DE-ENERGIZED or 1 for ENERGIZEDByte[0]=4Byte[1] = 0 for DE-ENERGIZED or 1 for ENERGIZEDBytes[2] through [63] are NC - Not CareReceived ArrayThe returned array of 64 bytes will be as follows:Byte[0]=4Byte[1] through [63] contain random values7. Set all switches:Handles all switches in one commandTransmit ArrayByte[0]=9Byte[1]= Set Switches state(Switch A- is LSB)Bytes[2] through [63] are NC - Not CareBits used in Byte[1]:The USB-1SPDT-A18 contains one Switch – bit LSB (0)The USB-2SPDT-A18 contains two Switches – Bits: LSB (0) =A, 1=BThe USB-3SPDT-A18 contains three Switches – Bits: LSB (0) =A, 1=B, 2=CThe USB-4SPDT-A18 contains four Switches – Bits: LSB (0) =A, 1=B, 2=C, 3=DFor example, to set Switches A, B and C to Energized (1) and Switch D to DE-Energized (0) the following code should be sent:Byte[0]=9Byte[1]=7Byte[1] Æ 00000111=7Bit 7 (MSB)Bit 6 Bit 5 Bit 4 Bit 3SwitchDBit 2SwitchCBit 1SwitchBBit 0SwitchA(LSB)0 0 0 0 0 1 1 1Received ArrayByte[0]=9Bytes[1] through [63] contain random valuesPage20/5/2012138. Get Switches StatusTransmit ArrayByte[0]=15Bytes[1] through [63] are NC - Not CareReceived ArrayByte[0]=15Bytes[1]= Switches Status (LSB is for Switch A)Bytes[2] through [63] contain random valuesThe Linux Folder in the CD package contains the following:switch.c example source code using the libhid & libusb libraries to open the USB HID device. Linux Project Examples are also available on the CD package or can be downloaded at:/support/software_download.htmlWindows, Visual Basic and Visual C++ are registered trademarks of Microsoft Corporation. LabVIEW is a registered trademark of National Instruments Corp. Delphi is a registered trademark of Codegear LLC. MATLAB is a registered trademark of MathWorks, Inc. Agilent VEE is a registered trademark of Agilent. Neither Mini-Circuits nor the Mini-Circuits USB RF Switch Matrices are affiliated with or endorsed by the owners of the above referenced trademarks.Mini-Circuits and the Mini-Circuits logo are registered trademarks of Scientific Components Corporation.Page20/5/201214。
第11章 nesC语言与TinyOS操作系统
nesC-file: includes-listopt interface //包含列表 … Interface: Interface identifier {declaration-list} // 接口类型标识符的声明 Storage-class-specifier:also one of command event async//命令或事件的存储类型
规范元素
(specification of elements)
范围(extent)
命令(command) 事件(event)
组件(component) 绑定/连接(wiring)
模块(module)
具体描述实现逻辑功能的组件源自11.1.1 nesC语言规范——nesC语言术语
术 语
终点/端点(endpoint) 内部的(internal)规范 元素
提供给外部组件/被外部组件 使用的接口
本组件中使用的/被提供 的接口
组 件 ( 模 块 )
提供给外部的命令
使用的外部事件
1. 接口
接口是一系列声明的有名函数集合,接口是连接不同组件的纽带。 接口是双向的,这种接口实际上是提供者( provider)和使用者(user) 组件间的一个多功能交互通道。 接口的提供者实现了接口的一组功能函数,称为命令(command);使 用者需要实现一组功能函数,称为事件(event)。 命令的调用都是向下的,即由应用组件调用那些与硬件结合紧密的组件, 但是事件触发却正好相反。
6、nesC编程
nesC编程基本概念
• 3、接口有双向性:它们描述一组接口供给 者 (指令)提供的函数和一组被接口的使用者 (事件)实现的函数。 • 4、组件通过接口彼此静态地相连。这增加 运行时效率,而且允许更好的程序静态分 析。
接口(interface)
• nesC 的接口有双向性:它们描述一个多功 能的两组件(供给者和使用者)之间的交 互渠道,即描述了两组件的调用关系。 • 接口可以理解为函数原型的集合。
模块(module)
• 模块是接口的实现者和使用者 • 模块包含两部分内容:
– 模块使用和提供的接口描述 – 模块内部的实现代码
• 模块名也必须与文件名同名
模块(module)
• • 例如:M1.nc module M1 { /*声明部分*/ provides interface A1; uses interface B1; } implementation { /* 实现部分,C代码 */ command void A1.cmd1() { call B1.cmd2(); } event void A1.event1() { …. } }
事件(event)
• 也是在接口中的一种函数,这种函数要求 接口的提供者调用,而接口的使用者则会 实现这种函数。形象的称为event,即为接 口使用者所实现的事件处理函数。 • 语法结构类C语言,只是在最前面增加 event关键字。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
nesC编程迷你教程寿颜波@Universitéde Franche-Comté,France内容目录1引子 (1)2基础概念 (1)2.1接口(interface) (1)2.2命令与事件(Command and Event) (3)2.3模块与配置(Model and Configuration) (3)2.3.1模块 (3)2.3.2配置 (6)2.3.3可以提供接口的配置组件 (7)2.3.4任务和事件 (10)3工作环境 (12)4编程开发 (13)4.1Blink (13)4.2 TempRadio (15)4.2.1数据的采集与发送 (16)4.2.2数据的接收 (23)5 TOSSIM仿真 (29)5.1使用TOSSIM编译nesC程序 (29)5.2捕捉、生成运行记录 (30)5.3仿真 (30)5.4运行中的变量值 (32)6结束语 (33)1引子目前在研究领域有多款针对无线传感器网络开发的操作系统,其中最为著名的项目之一便是TinyOS。
它最早由美国Berkeley大学负责开发和维护,并且支持多种传感器平台,例如在研究领域广泛使用的mica系列传感器节点和telos 系列。
在本教程的编写过程当中,我们统一使用Crossbow公司开发的telosb节点。
TinyOS完全由nesC编写,nesC全名Network Embedded System C,它可以被看作是C语言的近亲,在语法上和C语言有非常多的相似之处,如果你有C语言的编写基础,那么针对nesC的学习就会变得轻松很多。
nesC主要是为事件驱动编程而设计的,它也是我们开发TinyOS应用程序的主要编程语言。
本文档的目的在于向读者展示TinyOS的基本运作模式,并且让读者可以在最短的时间掌握TinyOS下程序开发的要领。
而且在编写过程当中,作者假设读者已经具备了基本的编程经验。
如果你需要更为详细的nesC参考资料,可以查阅TinyOS官方网站上面的教程,或者阅读Philip Levis编写的TinyOS Programming Manual。
因为已经很久没用使用中文编写文档,所以文档中的一些语句可能显得生硬。
而且因为时间关系,文档中肯定还有不少的错误。
如对你的学习过程造成困扰,再次先表示歉意。
2基础概念在开始正式学习nesC编程之前,我们需要先学习nesC的几个比较重要的概念。
相对于其他编程模式,例如面向过程编程和面向对象编程,事件驱动编程,或者是面向事件编程显得比较特别,尤其是在无线传感器网络当中。
因为无线传感器节点的程序储存空间十分有限,而且通常采用电池供电,所以要求我们的程序必须短小、精炼、高效。
2.1接口(interface)一个完整的nesC程序是由一系列组件构成的,这些组件彼此之间通过事先定义好的接口进行沟通,从而协调程序各部分间的合作。
与Java语言相似,在一个接口的内部,我们定义一系列相关的方法,也就是相当于C语言中的函数。
在下面的代码中我们给出一个简单的例子,Read接口。
该接口主要用来读取某一个环境数据(温度、湿度等)。
它只包含两个函数,用于读取数值的read和表示读取结束的readDone。
我们可以看到接口内的函数只包含了函数的声明,但是并不包含函数体,也就是说它们是空的!接口需要被某一个nesC组件实现才能具备真正的执行能力,如果一个接口没有被实现,那它就不具备实用价值。
负责实现某一个接口的nesC组件称之为该接口的提供者,而需要使用该接口的程序组件,则成为这一组件的使用者。
当我们开发一个nesC程序的时候,我们需要首先考虑以下几个问题:•我们的程序需要实现哪几种功能?•哪些功能是可以通过使用TinyOS自带的接口来实现的?•实现这些接口的组件又是哪些?•哪些功能是需要定义属于我们自己的接口?同一个接口可以由不同的组件来实现,例如我们此前提到过的,关于环境数据读取的问题。
我们知道我们需要通过使用Read接口来读取温度,但是如果传感器平台不同,Read接口的提供者就未必相同。
例如telosb节点和micaz节点未必使用同一组件来提供Read接口。
2.2命令与事件(Command and Event)在此前的例子当中,有的读者可能已经注意到,read和readDone两个函数采用两个不同的前置关键字,command和event。
命令和事件是nesC中两种函数类型。
命令类型的函数由接口的提供者负责实现。
有别于C语言中的函数呼叫,我们需要等待函数运行结束,才能继续执行接下去的指令。
在TinyOS中,我们推崇一种叫做Split-Phase的程序运作模式,也就是说将一项任务分为任务的投递、执行和反馈三个步骤。
当我们呼叫一个命令时,该项任务就被投递到一个任务执行序列当中,等待逐一被系统执行。
而主进程不会被锁死,可以继续执行接下去的指令。
当此投递的任务被成功执行时,任务会返回一个事件给主进程,以告知任务运行结束。
相反事件类型的函数则由接口的使用者负责实现,因为在接口的使用者呼叫一个命令之后,使用者需要等待命令返回的事件,并且在事件函数内对返回的数据进行处理。
关于nesC编程中事件和任务的控制,将在稍后的小节中介绍。
我们举一个比较具体点的例子,某一个nesC程序有两个组件构成,A和B。
A(使用者)想读取环境温度,所以它就需要使用接口Read,而Read接口由B 组件来实现,B就是接口的提供者。
A呼叫接口Read的read命令,然后继续忙自己的工作。
B通过接口收到该呼叫,开始调用传感器节点上的硬件设备读取温度。
一旦温度读取工作完成,B就发送一个readDone事件给A。
A作为接口Read 的使用者,需要实现接口内的readDone事件。
在该事件内部,A取得读取的温度值,然后再计划下一步的工作。
2.3模块与配置(Model and Configuration)nesC程序由两种类型的组件构成:模块和配置。
2.3.1模块在模块类组件主要包含了对它所操作接口的实现。
如果一个模块使用了某个接口,则需要实现该接口内的所有事件函数,如果它提供某个接口,则需要实现该接口的所有命令函数。
下面是例程Blink中的BlinkC模块的源代码,其主要功能是让传感器节点上的三枚发光二极管(LED)按照不同的频率闪烁。
•04-11行:模块的声明。
我们可以看到该模块总共需要使用5个接口,其中3个计时器(Timer)接口。
每个计时器控制一枚LED。
Leds接口中包含了我们点亮和熄灭LED所需的命令函数,而Boot接口中则负责控制传感器节点的启动。
•12-38行:所使用的接口的事件函数的实现。
•14-19行:在一般情况下,booted是程序接收到的第一个事件,表示我们的传感器节点已经正常启动。
通常我们在booted事件函数内放置初始化代码。
对于Blink程序,当节点启动的时候,我们需要通过呼叫startPeriodic命令函数来初始化三个计时器,让它们以不同的时间间隔开始计时。
注意呼叫一个命令函数,我们需要使用call关键字。
•21-25行,27-31行,33-37行:针对三个计时器的fired事件函数的实现。
当timer0被激活时,我们变更0号LED的状态(点亮或者熄灭)。
timer1和timer2同理。
就目前而言,当读者尝试去理解这段程序时,不要太过拘泥于一些语法上的细节,把注意力集中在程序的总体构成上。
2.3.2配置在此前的一个小节当中,我们列举出了BlinkC模块所需的各种接口。
正如此前我们所说的,一个接口必须被实现,也就是说必须找到提供该接口的组件(提供者),不然该接口无法真正接受任何工作。
所以一个完整的nesC程序还需要另外一类组件:配置,主要负责将接口的使用者和提供者紧密联系起来。
我们可以看到程序的开头始终是组件的声明,在这段程序中,我们声明了一个配置类型的组件,称之为BlinkAppC。
该组件不提供任何新的接口(没错,一个配置组件也可以提供接口,但是提供的方式方法有别于模块组件,我们将在接下来的小节中学习)。
•03-06行:列举出了Blink程序所需要的各种组件,其中自然也包括了BlinkC模块。
MainC组件和LedsC组件分别提供了Boot接口和Leds接口。
TimerMilliC提供了Timer计时器接口,因为我们需要3个计时器,所以我们需要用as关键字对他们进行重命名,分别为Timer0,Timer1和Timer2。
•08-13行:建立起接口使用者和提供者之间的联系。
例如第08行,我们读作“BlinkC模块中的Blink接口由MainC组件提供”。
第13行则是一种简化的书写,因为LedsC组件只提供一个叫做Leds的接口,所以nesC可以自动识别。
在建立起接口使用者和提供者之间的联系之后,我们的程序就可以编译了,因为MainC,LedsC和TimerMilliC三个组件已经包含在TinyOS的发行版当中,无需再重新编写。
一个完整的nesC程序包含至少一个配置组件。
2.3.3可以提供接口的配置组件通常情况下,尤其是在小型的程序当中,在配置类组件内部,我们只做对接口使用者和提供者的连接。
但是在某些特定的情况下,我们需要配置类组件也能够扮演接口提供者的角色。
当一个模块类组件作为接口提供者的时候,我们需要在模块内部实现被提供接口的所有命令类函数,但是在一个配置类组件内部,我们无权放置接口的具体实现,所以我们唯一能做的,就是把该配置类组件所提供的接口直接与其真正的提供者连接。
但是这么做的意义何在呢?为什么我们不直接把接口的使用者和提供者连接起来呢?为什么需要通过一个配置组件来绕一个弯呢?假设我们现在正在开发一个叫做Encryption的nesC程序,用于进行数据加密。
和Blink一样,该程序由两个组件构成,分别是TestEncryptC和TestEncryptAppC。
TestEncryptC为模块型组件,在其内部我们放置所有接口的实现,例如Boot.booted,Timer.fired,等等。
而TestEncryptAppC则是配置组件,在其内部我们将TestEncryptC所使用的接口连接到它们的提供者那里。
TestEncryptAppC的源代码如下:这里我们可以看到TestEncryptC(被重命名为App)使用了一个叫做Encryption的接口,主要包含了数据加密、解密的命令函数。
该接口被连接到一个叫做EncryptionC的组件上,也就是说EncryptionC是Encryption接口的提供者。
那么EncryptionC到底是什么类型的组件呢?模块?配置?前者不难理解,模块可以提供接口。
但是出于灵活性考虑,EncryptionC最好是配置型组件。