说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

利用Visual Basic实现无线通讯

HTML文档下载 WORD文档下载 PDF文档下载
利用Visual Basic实现无线通讯
中科院空间中心 姜棣昭

  一、概述
  Visual Basic 是Mcrosoft公司推出的强有力的系列开发软件之一,而且以其实用、方便、快捷、开发周期短、广泛而强大的功能越来越被广大编程人员所亲赖,广为流传,似乎有些专业的编程人员放弃了Visaul C++ 而改用了Visaul Basic之类的RAD编程工具,尽管Visaul C++在灵活性、代码紧凑、运行速度快及底层开发等方面Visaul Basic无法比拟的,但编写C++应用程序过长的调试和开发周期确实有点不适应当今的应用程序开发环境。
  在Visaul Basic开发工具中提供了大量的控件(或称控制、组件)供编程人员使用,可以方便的利用这些组件中的属性、方法、语言等以事件驱动方式开发应用程序,还可以利用WINDOWS SDK中的API中的应用程序接口等工具开发应用程序。VB还自带一个控件开发软件包CDK,利用CDK可以开发自己需要的Controls 。在通讯问题中我们可以使用VB提供的通讯控件或调用WINDOWS API通讯函数。

  二、 VB串行通讯
  利用VB开发通信程序主要的方法有两种,一是利用VB本身提供的控件(CONTRALS),另一种方法是利用WINDOWS API应用程序接口,WINDOWS API 主要提供了三个动态连接库KERNEL.EXE、USER.EXE、GDI.EXE供开发人员调用,其中KERNEL.EXE 主要包括一些底层操作函数,完成一些资源管理、任务、内存等操作,USER.EXE包含了一些与WINDOWS管理有关的函数,如通讯、菜单、消息、光标、插入符、计时器以及绝大多数非显示函数,GDI.EXE图形设备接口库,主要内容为与设备输出有关的函数。和串口通讯有关系的函数BuilidCommDCB、ClearCommBreak、SetCommBreak、FlushComm、GetCommError、GetCommState、WriteComm、ReadComm、SetCommState、CloseComm等均在 \Windows\system 子目录下的USER.EXE动态连接库中,在VB调用之前应该先在全局变量定义处声明API通讯函数、定义常量。
  在我们的实践中,用VB 控件实现通讯的方法比调用SDK的API动态连接库的方法更加方便、快捷,而且用较少的代码可以实现相同的功能,这就是用VB 控件实现通讯的优点所在,下面主要介绍一下利用VB 控件实现无线通讯的问题。
  在VB的控件工具箱中,提供了一个使用非常方便的串行通讯控件MSComm,它全面的提供了使用RS-232串行通讯上层开发的所有细则,它既可以使用查询方式又可以使用事件驱动方式来完成串行通讯。
  在MSCOMM控件中提供了一系列的编程要素,这些编程要素有属性、事件和函数,利用这些要素编程,可以实现几乎全部的串行通讯功能。在VB中提供了30多个属性、一个事件和两个函数,其中主要的属性为CommPort、Settings、PortOpen、InBufferSize、OutBufferSize、InBufferCount、OutBufferCount、Break、InputLen、SThreshold、Rthreshold、RTSEnable、CommEvent、ParityReplace、NullDiscard等。
  控件MSComm提供了一个事件OnComm,该事件可以截取串口的任何消息,转入事件处理程序。WINDOWS操作系统的运行机制为事件驱动,在VB编程中事件驱动方式同样是软件运行的主要方式之一,当没有事件发生时程序可能处于某一循环、等待或任务状态当事件发生时,程序转入事件处理程序。每个控件下都有一些事件供程序员使用,MSCOMM控件中OnComm事件是唯一的,OnComm可以扑获通讯时发生的串口事件和错误信息,当有串口事件或错误发生时,VB会立刻触发一个OnComm事件,程序就会自动转入OnComm事件处理程序中。CommEvent属性是OnComm事件的指示器,该属性在设计时不能使用,在程序运行时为只读,CommEvent 属性存有最近的事件或错误的数值代码,可以在程序中随时读取CommEvent 属性值来了解通讯的状况,OnComm事件是和CommEvent属性密切相关、一起使用,当任何一个OnComm 事件或错误发生时,都会使得CommEvent属性值改变,在OnComm事件处理过程中,可以通过判断CommEvent属性值,对于不同的属性值转入不同的事件处理过程,一般采用的办法是SELECT CASE…….END SELECT。由于在无线通讯中没有使用有线MODEM,CommEvent 属性涉及到的有线MODEM的属性数值代码和本项目无关。

  三、 无线传输接口和协议
  在我们的项目中用Intel 586/120的PC机为上位机,通讯程序使用VB开发的,用8031单片机做CPU、 AD574作数据采集的下位机,上位机作数据接收和数据处理中心站,下位机实时采集数据之后,进行简单的数据平均计算,当收到上位机发来的发送指令之后,开始向上位机发送数据。
  上位机无线通讯接口使用的是一块插在ISA扩展槽中的无线MODEM ZX-02,无线MODEM与KENWOOD公司的TK-378无线对讲机相连,数字信号通过无线MODEM调制成为音频信号之后,送到TK-378无线对讲机上的MIC口。
  下位机有一台外置无线MODEM ZX-01,单片机的数字信号经过串口送入无线MODEM,MODEM对信号进行调制后送入KENWOOD TK-378无线对讲机上,接收数据的方式与上述相同,由TK-378收到信号后,经无线MODEM将音频信号解调为数字信号进入计算机或单片机处理。
  由于在我们的通讯网络中,并非点对点的通讯,而是一点对多点的广播式的通讯方式,因此,我们在通讯协议中曾加站点识别码,每个站有自己特定的识别码,给下位机编码可以保证网络通讯的有序性。
  由于无线通讯可能会有空间的燥声干扰,因此,我们采取了多项抗干扰措施,首先是包头识别码,在发送了传输命令之后,下位机开始以打包的形式传输数据,每一包都有一个包头和包尾识别码,假如识别码有误,这一次的传输为不正常数据处理。打包发送另外一个原因是TK-270对讲机连续发送数据的时间不能超过一分钟,超过一分钟就会自动中断发送,因此,当数据较多时不打包连续发送的时间就会超过一分钟,发送数据中断。
  在下位机中有32KB的NVRAM,可以保存32KB的数据该数据可以由上位机发送清除命令的方法清楚掉,当32KB满了以后,最早放入的数据就会丢掉,由于我们的采样速率不高,在慢采的情况下,两天的时间才能存满,这样不论上位机或下位机出现断电、死机等问题,数据不会丢失掉。
  在发送过程中,由于干扰的原因数据传输出现错误,上位机不给下位机发送清楚命令,数据保存在NVRAM中,下次上位机发送传输命令之后,这些数据还会重新发送到上位机来,这样可以避免了线路带来的数据损失,
从下位机向上位机传送的代码有ASCII码和BCD码,测量数据部分用的是BCD码主要是为了节省资源,由上位机向下位机发送的命令均为ASCII码。
  我们还对字段长度和包的长度作了规定,一个字段有多少个字节,一包有多少个字段组成,如果数据最后不够一整包,也按照整字段的格式作为半包发送过来。
  考虑到下位机的分散性,可能固定在偏远、不宜接近的地带,用上位机对下位机发送校时命令并校时的方法来统一网络时间。
  由于我们使用的无线MODEM 所限,传输速率只能达到2400BPS,而在我们的使用中1200BPS、N PARITY、8 DATA、1 STOP为较稳定状态。
  上位机向下位机发送的命令有校时命令并校时、请内存命令、发送数据命令、快采命令和慢采命令等。发送命令有两种发送方式,即手动方式和自动方式,自动方式是由定时器来完成的。
  在无线通讯过程中,除了规定合理的协议之外,为了保证通讯的正确性,在数据发送时适当的增加延时是必要的,当速度较慢的计算机向速度较快的计算机发送数据时应适当的增加延时。

  四、 应用实例
  由于该项目的软件源代码较长,我们只拿出和串口通讯有关的程序片段来供大家参考。在我们的工作中实践了三种通讯方式,即查询方式、事件驱动方式、事件驱动转查询方式,这三种方式各有利敝,查询方式有方便可靠的特点,可利用协议或设定时钟进入和退出查询状态,但不是资源的有效利用方式,事件触发方式对于定长通讯非常有效,但定长通讯在有些场合不实用,事件驱动转查询方式既有事件驱动的特点又有转查询方式特点,可以说是集二者之长,有效利用资源。下面着重介绍事件驱动转查询方式。
  首先在公共模块中定义和ONCOMM有关的参数:
.
.
.
Global Const MSCOMM_EV_RECEIVE = 2'收到 Rthreshold 个字符。该事件将持续产生直到用 Input 属性从接收缓冲区中删除数据。
Global Const MSCOMM_ER_RXOVER = 1008'接受缓冲区溢出。接收缓冲区没有空间。
Global Const MSCOMM_ER_TXFULL = 1010 '传输缓冲区已满。传输字符时传输缓冲区已满

  在启动过程中对串口和输入输出缓冲区初始化:
Sub Form_Load ()
 .
 .
 .
 comm1.Settings = "1200,n,8,1" '设定波特率1200bps,无校验,8位数据位,1位停止位
 comm1.CommPort = 1 '串口1
 comm1.InputLen = 1 '一次从输入缓冲区中读取一个字符
 comm1.InBufferSize = 512 '定义输入缓冲区为512字节(bytes)
 comm1.InBufferCount = 0 '清空输入缓冲区
 comm1.OutBufferCount = 0 '清空输出缓冲区
 comm1.PortOpen = True '启动串口
End Sub
  下面是发送数传命令的子过程,启动该过程由一个定时器控制:
Sub sample_data ()
 .
 .
 .
 comm1.RTSEnable = True '将Modem的PTT置高,同时打开对讲机
 Call time_delay '适当延时
 comm1.Output = "*TRNS" + Chr$(13) '发送命令
 Do '该循环用来检测命令是否全部发送完毕
 Loop Until comm1.OutBufferCount = 0
 Call time_delay '适当延时
 comm1.RTSEnable = False '将Modem的PTT置低,将对讲机改为接受状态
 comm1.InBufferCount = 0 '清空接收缓冲区
 comm1.RThreshold = 1 '设定RThreshold = 1,等待出发OnComm事件
 .
 .
 .
End Sub
  在OnComm编写接收和处理代码:
Sub Comm1_OnComm ()
 Select Case comm1.CommEvent
  .
  .
  .
  Case MSCOMM_ER_RXOVER '接收缓冲区溢出。可插入相应的代码
  Case MSCOMM_ER_TXFULL '传输缓冲区已满。可插入处理代码
  Case MSCOMM_ER_RECEIVE '收到1个字符,可进入以下处理过程
   comm1.RThreshold = 0 '不再响应OnComm事件,转入查寻方式接收
   ii = 0
   iii = 0: sinn = Chr$(42): sinn1 = Chr$(42) '初始化变量
   Do
    duration = Timer + .2 '设定超时退出的时间值
    iii = iii + 1
    sinn1 = sinn
    Do '该循环判断输入缓冲区是否有数据或是否超时
     'dummy% = DoEvents()
    Loop Until comm1.InBufferCount >= 1 Or Timer >= duration
    If Timer >= duration Then
     iii = iii - 1
     overtime = True '确定超时退出,并非正常退出
     Exit Do
    End If
    sinn = comm1.Input '正常退出,取值付给sinn
    If header_er = 0 Then
     GoTo test_header
    End If
    If Asc(sinn) > 175 Or Asc(sinn) < 160 Then '判断包头是否正确
     iii = 0
     GoTo station_number_er '包头不正确,丢掉该数据
    End If
test_header: header_er = 0 '包头正确,接受到包头,header_er=0
    ssin(iii) = sinn'----put date into string dimantion
    station_number = Asc(ssin(1))
    package_number = Asc(ssin(2))
    sentence_number = Asc(ssin(3))
    last_character = Asc(ssin(iii))
station_number_er:
   Loop Until sinn1 = Chr$(10) and sinn = Chr$(13) '当收到正确的包尾0A,0D后退出
   If overtime = True Then '如果超时非正常退出
    overtime = False
    comm1.RThreshold = 1 '重新启动OnComm事件,等待接收下一包
    timer6_wait.Enabled = True
    GoTo endsub
   End If
  以下是接收数据正确以后的数据处理程序,包括解码和计算这里从略。
   .
   .
   .
   If package_number = 1 Then '如果接收数据正确,而且是最后一包
    timer2_sample.Enabled = True '启动控制数传命令定时器
    comm1.RTSEnable = True '置PTT为高
    comm1.OutBufferCount = 0 '清空输出缓冲区
    Call time_delay '适当延时
    comm1.Output = "*MACK" + Chr$(13) '发送清内存命令
    Do '检测是否发送完毕
    Loop Until comm1.OutBufferCount = 0
    Call time_delay '适当延时
    comm1.RTSEnable = False '置PTT为低
   End If
   If package_number > 1 Then '如果不是最后一包
    comm1.RThreshold = 1 '启动OnComm准备接收下一包
    timer6_wait.Enabled = True
   End If
endsub: header_er = 1: comm1.InBufferCount = 0 '--empty inbuffer protect from bed data on the inbuffer
 End Select
End Sub

  五、 结论
  根据我们实践工作的经验,在本项目中无线通讯和有线通讯的主要区别在于用MSCOMM控件的RTSEnable属性对无线Modem的PTT操作以及适当的延时,延时的长短和使用的计算机有关。在开发的过程中,把握好上述两条,设定一个合理的通信协议,选择合适的硬件是至关重要的。
一周消息树:盘点史上最具毁灭性的软件Bug 微信公众平台设备功能支持个人开发者接入 2014中国移动开发者大调查第三批获奖名单曝光 微信企业号上线,带你看看它的真面目! OpenStack Juno版本发布——支持Spark和NFV 【十问十答】对话Go语言开发团队 苹果要求、Android开始,64位时代真的来了! MDCC 2014产品与设计论坛:带你发现产品之美 Java开发者值得关注的7款新工具 助力国产移动产品出海,UCloud部署北美节点 Zack Parker:用EC2在Cotap上打桩 用卫生棉杀敌冲关!两个高中女生的创意游戏 专访《Java程序员修炼之道》作者Ben Evans:保守的设计思想是Java的最大优势 Google收购Firebase 帮助程序员快速开发出移动App和Web App 微信支付开发关键点技术解析 游戏任玩!开源虚拟现实头戴式设备Open DoVision MDCC大会召开倒数10天 看Twitter、Facebook和国内“BAT”三大巨头最新动态 《近匠》Wijmo 5 CTO:从Web到移动,我的25年编程生涯 重复充电、防丢失!多功能智能行李箱Bluesmart 【设计经验传承】图标设计初阶要先型 “光年”光纤路由 支持千兆网络的家居中心 MDCC 2014移动开发技术与平台峰会:知名应用技术大牛传授实战经验 Unity生态圈将变?EA前总裁接替创始人任新CEO 第九届中国Linux内核开发者大会在京举办 《近匠》爱拍SDK:手游录像分享 爱拍才会赢 Mark走起!iOS开发最常用的第三方库 【CTO俱乐部读书会】《人件》译者肖然:软件工程是社会学 错过就要等一年 深圳微信开发者大会不容错过的十大理由 【干货】国外程序员整理的 C++ 资源大全 一周消息树:被投资人“送”入看守所,创业人汪洁有罪还是无罪? 聚焦五大主题 Atlassian Summit 2014精华PPT下载 关于显示窗体的问题! 贡献500分或者更多,大家大讨论!! 为什么我的硬盘灯会一闪一闪的? sql 语句 错在哪儿??? 我调试了很久 什么样程序风格才最好的? 有关计算机方面的国标大家有列表吗,只要列表呀,我在论谈上找不到呀,谁给我一份了谢了! 如何知道串口上来数据了 在线等待:Windows启动时弹出“Exception EStackOverflow in moudle ...”的错误提示而无法运行Delphi的程序,why? 请高手指点一二。 简单问题:我却搞不定:--- vc7.0里面为什么不认cos、sin等数学函数? OracleOraHome81ManagementServer服务的启动问题。 activex 发布 用C#怎样得到一个dll文件的版本号呢? 问一个比较简单的问题! 关于msgbox的简单问题,才鸟求知,谢谢帮忙!!!!! 困惑。什么工作好啊,来者有分 大哥、大姐们,快拔刀吧! 如何取得SQL SERVER2000数据库某字段的空值? 如何用split分割纵向字符串?在线等候. 关于java workshop的问题(急) 向高手请教一个问题(硬编译),至少200分相送 为什么我用request.getPathInfo()取到的结果为空? c# 版的朋友们大家好!!新手登录,多多帮助! oracle触发1器 一个好多人问过的问题,可是我这里还是不能用,请在帮下忙 发布Applet出现的错误,帮忙撒 本人在PB开发中遇到莫名其妙的问题 强烈建议成立crack专栏,同意的请跟帖。 textbox的输入问题 我的98系统在重新启动后再进入系统时屏幕上会出现一闪闪的雪花点,这是为什么呀? 请教!谁会使用这个API函数(DbiPackTable),该函数在BDE32.HLP中。 一个循环问题,急急急!! mysql -h remotehost -u root连不上对方机子? 分布式应用中的服务器端访问当地窗口的问题 打印的问题,大家请看,得到你们的思路,马上给分! 我想做一个保存图片资源的dll文件,谁有这方面的文章和代码啊? 看一下这个ServiceApp.出错信息! 有专家吗?Cache问题 那里有linux原码下栽?不全也可以? 怎么用OPENCV?(50分) winsock下载FLASH动画的错误问题 好好看看这个妞,天机不可泄漏啊,哈哈哈哈 VxD 中如何使用 sprintf 等函数?[200 分] help me !!! 急急急!!! 有关datareport的问题! 我下载了Core SDK,《windows核心编程》的示例还是编译不成功? SQL Server中定义image类型的问题? 鼠标拖拽效果 简单的问题?高分相送,UP者有分。。。。。。。。 Mount tai is such a attractive place of great interest _____everyone likes to visit .A.as B.whose C.which D.what答案给的是A 为什么 2-甲基乙烯和丙烯的区别 三氧化二铝能否吸附氢气中的水蒸气和氧气? hangzhou is an attractive place of interest ___everyone likes visit 这里填that as which 中请给出原因 求2-甲基-1-丙烯物理常数 化学污染如何危害到食品安全? it's fun to visit such a wonderful place(改为同义句) _ such a wonderful place is _.It's fun to visit such a wonderful place.(改为同义句)_ such a wonderful place is _. 氮气与氢气在高温高压和催化剂作用下会生成NH3 ,问制的的NH3是气态还是液态?已知:NH3加压下易液化 (不知道这条信息有没有用,我不好下决定)请高手指教! 马蹄形磁铁如何分辨磁极 我家用光触媒处理过了,是不是就没有甲醛了? 离心机甩料 振动我有一同事,他操作离心机比较心急,恨不得把物料一次性甩完,离心机甩料 如果物料过多,并产生 振动,对离心机有什么损坏?请各位给予指教. 怎样辨别圆形磁铁的磁极? “光触媒”在什么地方可以买到?光触媒除甲醛的效果好吗? 离心机堵料之后怎么处理 现有一个尺寸为长800宽800深400的不锈钢机箱,环境温度为零下10℃,需加热到20℃,需要多少功率的加热器.机箱带保温棉30mm 厚求计算公式~ 怎么写广告语? (灯箱、标牌、工艺品盒)(饮料瓶)(牙刷柄)由什么物质制成,有饮料瓶 聚酯材料 聚苯乙烯材料3个候选答错了,不是饮料瓶 是有机玻璃 没有磁极的磁铁,怎么辨别 镀镍工艺后还能进行抛光处理么?是否会破坏镀层,如果不抛光,那么表面粗糙度能达到什么水平呢? 什么品牌的ZR-BVV阻燃型铜芯聚氯乙烯绝缘聚氯乙烯护套电缆好? 20%的硫酸,20%的硝酸和2%的氢氟酸,需要用不锈钢加热器加热到80°左右,加热器用什么样的不锈钢材质最好不锈钢不能在80°的温度下和这三种酸发生反应 没铜打底?滚镀镍需要铜打底,但是电镀厂不给镀铜,有什么药可以代替铜得作用性吗?(滚镀拉簧得时候内部上不了镍)或者有什么办法让拉簧里面上镍,表面光泽? 选购ZCN-VV阻燃(C类)耐火铜芯聚氯乙烯绝缘聚氯乙烯护套电力电缆的话,关注哪个牌子的? 亲们好,请问5立方的水加热到38度,用什么加热器?不锈钢圆桶,直径1.8米,高2米.顶部有一40厘米的口,谢 1.They are going to visit (Guangzhou museum).括号里的部分用what place代替还有:2( Uncle Chen) is going to drive us there.括号里用who代替 有没有人会做纳米活性碳 BOD为什么可以反映某些污染物的量和污水浓度 第一盒乒乒乓球中有4个白球2个黄球,第二盒乒乓球中有3个白球3个黄球,分别从每个盒中随即地抽取1个球,求下列事件的概率:(1) 取出的两个球都是黄球;(2) 取出的两个球中有一个白球 丙烯加氯气反应?CH3-CH=CH2+Cl2不是发生取代反应生成Cl-CH2-CH=CH2+HCl吗?怎么我看到一题是说CH2Cl-CHCl-CH2Cl是由CH3-CH=CH2+Cl2和Cl2制得的,谁知道是为什么 说明文,至少500字要把假设、对比、列数字、举例子、打比方、作比较都给加进去. 有3盒乒乓球,每盒75个(只有黄,白两色).第一盒黄球和第二盒的白球同样多,第三盒的白球是第三盒乒乓球总数的五分之二,这三盒乒乓球一共有黄球多少个? 丙烯和氯气如何反应 物理的两个一样的磁铁 一个是磁铁 一个是铁棒 不用任何工具 怎么样将他们分开 源辉煌不锈钢201管生锈了怎么办我去年十月份买的源辉煌不锈钢今年都锈黑了要怎么处理.可不可以找厂家.如果可以要怎么处理.才几个月,就算处理了也还是很快就锈了.既然201那么差为什么 丙烯与氯气在光照条件下反应,最多得到几种沸点不同的有机物 两个形状大小完全相同的铁棒和磁铁不借助任何工具怎样区分它们 i visited the Bund last week.划线部分the Bund提问.请问是用what did 还是where did我的两个老师是两种答案,搞不清……谢谢 纸箱纸质KABCE如何区分 如何不借助其他工具判断磁铁的磁极 Where ______ did you visit last week?A.other B.others C.another D.else请问这道题选B不可以吗?为什么? 如何区分纸箱的纸质A=A B=B B=C C=C 几种纸板区别 加热器是利用什么制成的加热设备? I visit the university last week ____i studied A.then B which C where D that正确答案是C,为什么不选B .C 光触媒怎么么使用? 什么仪器能在火焰上直接加热 Ths is the place ______I visit last summer A,where B,which C.what 稻田光触媒怎么样,和其他光触媒比怎么样 铁在封闭的水环境中会生锈吗比如说铁暖气片.暖气片里常年满水,暖气片什么时候会生锈到漏水?那么,跟完全在在空气中和在半有水的环境中比较呢,哪个快?还有,假设铁管子里面是满水且密封 用水煮 雄黄 变成砒霜啊我看到 都说雄黄加热 会变成 砒霜 加热多少度 才会反应放在水里煮 成砒霜啊 什么纸质做纸箱好我要做一个比较结实的纸箱!什么纸比较好 啊 一小铁棒与磁铁的北极接触后哪一端变为南极? 雄黄如何变砒霜? 纸箱 上引诱SKU NO.和ITEM NO.还有纸质有A=B B=B 等是怎么区分的? 用磁铁N极在一根铁棒上沿同一方向摩擦,铁棒被磁化,则铁棒左端为什么极? Mount Wuyi is such an attractive place of interest____everyone likes to visit.为什么答案是as,不能是that或which,visit是及物动词,却宾语that和which不是也可以在定语从句中做宾语么? 我要一篇500字的有关学校环境的说明文. 什么是烟气分析采样加热器? mount wuyi is such an attractive piace of interest as everyone likes to visi为什么从句要用as 求一篇500字说明文 仪器分析问题•在法庭上,涉及到审定一种非法的药品,起诉表明该非法药品经气相色谱分析测得的保留时间在相同条件下,刚好与已知非法药品的保留时间相一致;而辨护证明有几个无毒的
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘