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

利用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操作以及适当的延时,延时的长短和使用的计算机有关。在开发的过程中,把握好上述两条,设定一个合理的通信协议,选择合适的硬件是至关重要的。
开发者眼中的代码审查“真相” 互联网产品设计的12个理念 Pair、Between、小恩爱:妹纸装个情侣应用吧? 横跨四大操作系统:3DMark将挑战所有智能设备 美国碰壁欧洲得意 华为获CERN青睐 应用数据分析新标准:Flurry增应用崩溃分析功能 Twitter被黑客入侵,25万用户信息可能被窃 16亿美元超级计算机项目助力解读人脑 卡巴斯基发现新型Android恶意软件 可入侵Windows 谷歌发布基于B-Tree的C++模板库 开源产品系列:高性能Web框架Zend Framework LiFi是否会取代WiFi? 1月浏览器排行:IE10突破1% Chrome连续3月下滑 Wine让Android也能运行Windows软件 Cory Ondrejka,是这位工程师拯救了Facebook! 三星争夺企业市场的三大痛点与对策 Xcode更新至4.6 支持iOS 6.1 工程师揭秘:NVIDIA如何锻造Android掌机 VMware掌控Puppet 老用户会被锁定吗? 试图领导创新:三星创新中心11亿美元建基金 基于WebRTC Chrome与Firefox实现视频通话 将OpenStack私有云部署到Hadoop MapReduce环境 Web设计师必备的10款最佳排版工具 诺基亚CEO谈平板计划 Android为候选系统 244亿美元!戴尔公司正式完成私有化 对抗苹果 Facebook或推Find My Friends应用 前谷歌工程团队负责人:如何打造一个完美的产品 好消息!Google Drive可存储共享JavaScript等网站 Android Rivers:用Kotlin语言写出的新闻应用 辞旧迎新 老牌游戏开发商的移动进化之路 iSuppli:硬盘市场持续萎缩 大数据应用成重要市场 我的asp.net程序运行一段时间后,就会出现不能访问sql server的情况,好象说是缓冲区已满,不知如何解决? 如何利用串口来实现SNMP协议呢? 问中国球迷: 求一段从web页面通过提交插入sqlserver的源代码, 什么软件可以修改.hlp文件呢 谁有软件工程的英文文档? 请问如何给asp写成的系统打包成安装程序,我用了sql-server,难道连sql的设置之类的东东也一起打包吗? 请教PB高手,谁可以告诉我下段程序的功能 数据窗口中某字段为date类型,我希望新增记录是能自动将当天的日期附值给它 谁有 平衡二叉树的插入算法 的C源代码? 谢了 什么软件可以修改.hlp文件 id是怎么随机生成的?这是小弟我学asp.net遇到的疑惑 一个FLASH,,看看像不像自己。。。 谁有 平衡二叉树的插入算法 的C源代码? 谢了 请问那里有ms exchange server2000正式企业版下载的?很急用,到处都找不到,请大家帮帮忙,谢谢! Win2000辅助域控制器问题。无法建立辅助域控制器。谢谢! 什么函数能对CStringArray中的字符串按字母顺序排序? 请问数据窗口更新的问题。 请教有没有判断日期格式是否正确的函数? 各位高手,有人听说过PCI-7841,帮帮忙吧,拜托了 js可以修改xml里的数据吗? 如何知道某一台电脑的IP的子网掩码??急!!! 考试通过心情爽,开心、快乐的人请来!!! 什么地方有关于这个APACHE的安装,配置的讲解呀? 请教PB高手,谁可以告诉我下段程序的功能 神啊~~救救我吧~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 谁有没有好的方法将一条记录从表1中添加到表2(Ado连接)(在线等待)???? 如何判断鼠标是否移出一个窗口(广义上的窗口),且此窗口没有句柄 对delete 操作释放内存资源有些搞不清楚? SQL SERVER 中有没有计算余数的函数? 如何用vb开发web组件,比如说上传文件组件,发email组件,思路是什么?怎么样实现? 有谁知道哪里能下载我形我速,我找的网站下不下来,帮帮忙吧! 怎么让我的opengl程序link成static的,不想总是需要dll 为什么我的DBGRID不能用???? 来者有分!我想找一个能暂停一个程序并保存下来的软件。 100分的小问题,寻SQL语句,选出最小的记录? Dialog中能不能加ToolBar? ODBC参数绑定,为什么会失败,我已经试了最起码10次了,高手给我指教一下好吗,程序是这样的,谢谢! 请教一个数据库问题,大数据量时如何处理才能使速度不至于太慢,还望赐教! 我不明白,既然微软将C#定位在网络上,而且还大力支持ASP.NET,为什么在开发时还要大量借助于JavaScript呢? 怪事情更新表也会出现这种问题的吗?? 急!急!急!怎么不能注册com组件???? 怎样生成一个空文件,然后向里面写一些record数据? 有没有什么好的办法,可以倒入倒出数据? 关于encode,请帮忙! 如何过滤掉我不想要的xml文档? hydnoahark(诺亚方舟) come in!! C#的应用程序如何部署到windows 的其他计算机上? 不好意思,数据库连接:( winapi gettcptable怎么用? 请教:怎样利用特定大小的缓冲区播放大型的WAVE格式的声音数据 交通工具的特点轮船.飞机.的. 1.某人吃花生时不小心噎到,即刻引起了一阵咳嗽反应,此反应由哪里控制?A 脊髓 B 大脑 C 小脑 D 延脑 地球上海洋面积是36000万平方千米,占地球总面积的17分之12.地球总面积是多少万平方千米?谁会!算式! 液溴用一层水封盖再密封保存 和 固体碘放在棕色细口瓶中 哪个对哪个错 为什么 是不是固体都放广口? 水银能蒸发吗? 中国历史上有什么政治家 只用一种试剂将AgNO3、KSCN、稀HCL、NaOH四种溶液分开的反应离子方程式为 8年级上册科学实验活动手册P6页答案在测定食盐的密度的实验中,如果先用天平测出烧杯和盐水的质量,再把部分食盐倒入量筒,测出体积再天平测出烧杯和剩下盐水的质量,想想,这样的操作程 敢于革新的事例 奴隶社会有地主阶级吗? 辅导书上有一句话:反射弧中任何一个环节中断,反射都不能发生.如果我们刺激传入神经或者神经中枢,效应器有么有反应,如果有,这难道不算是反射吗 力和物体在力的方向移动的距离的乘积叫做功中的距离指的是垂直距离吗? 我的理想 医生 怎么实现 第七册 科学实验活动手册第二章观察蜗牛 压力可以产生电能.但是持续不断的压力是否也可以产生电能?比如人站在那里不动,由自身的体重产生压力,能否产生电能? F和Cl形成的化合物的化学式是什么 一道有关反射的生物题下列不属于反射活动的现象是( )A.狗算算术B.因气候炎热而出汗C.眼前突然出现物体会眨眼D.草履虫趋向有利刺激,逃避有害刺激B.因气候炎热而出汗 好象也是啊.它通过了 什么材料在 压力作用下会产生电能呢?附加 打火机的工作原理? 如何加快铝拉丝油中铝粉的沉降? 水银蒸发吗 如何利用汽车在路面行驶时让路面压力产生电能 来自春秋,战国,秦,汉,三国,晋,南北朝,隋,唐,五代十国,宋,元,明,清的名人有哪些?急. 中国历史人物故事不要太多我拿来做手抄报的内容 温度计水银破了怎么清理 春秋,战国,秦,汉,三国,晋,南北朝,隋,唐,五代十国,宋,元,明,清里有哪些人? 历史人物事迹历史人物光荣事迹 温度计水银撒到包上能直接洗吗 春秋;战国;秦;汉;三国;晋;南北朝;唐;五代十国;宋;元;明;清的朝代的三个重点人物求求各位了 历史人物故事要简短的.具体的故事!不要人物简介! 历史上在黄河“身边”的英雄有那些?简述其事迹. 我的理想是医生50字小短文 铝卷拉丝是什么意思 有关历史人物的故事 关于海口高速铁路的问题...想在正月初三的时候早上去三亚 当天就回...能提前订票么?提前几天订?可不可以一次买来回的那种票?如果要提前订的话怎么订啊?还有是不是三亚回海口的票很难 为了除去KCl溶液中的含有的少量FeCl3和K2SO4杂质,应依次加入的试剂是?A.先加入适量的AgNO3溶液,再加入适量BaCl2溶液B.先加入BaCl2溶液,再加入适量AgNO3溶液C.先加入适量KOH溶液,再加入适量Ba(NO3)2 求历史人物故事,紧急!最好不要转载, 简述航空母舰的优点和缺点 在FeCl3+KSCN=Fe(SCN)Cl2+KCl的平衡体系中,(1)在溶液中加少量KSCN固体,平衡( )移动.理由( ) (2)在溶液中加少量KCl固体,平衡( ).理由是( )…… 我想了解化学趣味知识 急求与航天高铁有关的辩论赛题目 被蚊子咬 ,那么蚊子咬后,瘙痒是什么反射呢,..谢瘙痒是简单还是复杂反射 公元前221年,秦朝结束春秋战国___的局面;280年,___短期统一,结束三国鼎立的局面;589年,隋朝建者___结束南北朝分裂局面,统一了中国. 封建社会时期,西欧封建精神支柱是 O和Na的最高价氧化物对应的水化物的化学式分别为什么? 秦朝在哪三国长城的基础上建立万里长城 西欧的封建社会开始于什么时期 铝挤中,拉丝用英语如何表达 不同温度不同浓度下氯化钾的电导率多少?20,30,40摄氏度在0.02mol/l,0.05mol/l的电导率, 将下列的交通工具按发明的先后顺序排列,并说出他们的特点与优势飞机火车自行车轮船汽车 感受器-传入神经-神经中枢-传出神经-效应器为什么拿起烫馒头时先放手在感觉到烫啊应该是要先感觉到烫才能进行一系列神经传导到达效应器做出放手动作才对呀 酒与汞可以化学反应不,温度计碎了,想处理 常用交通工具的特点和优势?火车、巴士、自行车、轮船、飞机的特点和优势各有哪些? 质量与密度习题一个瓶子装满水时的总质量是160g,装满密度为1.2*10^3kg/m^3的某种液体时的总质量是176g.求这个瓶子的质量和容积. 已知地球上海洋面积约为361000000km的平方,361000000这个数用科学记数法可表示为( )A.3.61*10的6次方 B.3.61*10的7次方C.3.61*10的8次方 D.3.61*10的9次方 所有的交通工具都共有的特征是什么? 反射弧中感受器、传入神经、神经中枢、传出神经、效应器受损分别会怎么样?老师把我弄糊涂了,我们老师说只有感受器不坏就有感觉,我觉得他说的不对. 地球上海洋面积是36000万平方千米,占地球总面积的17分之12.地球总面积是多少平方千米? 这些交通工具按发明的先后顺序排一排,并说出它们的特点与优势飞机 火车 自行车 轮船 汽车 (1)反射必须要经过完整的反射弧么,如果直接刺激效应器引起的反应能称为反射么?(2)膝反射时,感受器和效应器都是伸肌么,如果是,那么为何同时屈肌又会舒张(不是应该和屈肌无关?) 地球上海洋面积是36000万平方千米,占地球总面积的17分之12.地球总面积是多少万平方千米?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘