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

利用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操作以及适当的延时,延时的长短和使用的计算机有关。在开发的过程中,把握好上述两条,设定一个合理的通信协议,选择合适的硬件是至关重要的。
开源SMTP和POP3邮件服务器 三星:在专利上不会和苹果妥协 不止谷歌,微软也有自己的眼镜计划?! Windows 8商店应用总数突破20000大关 硝烟弥漫:三星起诉苹果最新iPad、iPod侵权 效仿Google Facebook欲整合Instagram用户数据 与苹果全面竞争?传微软明年推Xbox机顶盒 微软Ralph Haupter:WP8即将在中国上市 开发者黄金时代来临 Paul Graham:Y Combinator创始人成长轨迹 我们需要强密码吗? 为了改变?英特尔CEO宣布将于明年5月辞职 传苹果下一代Mac OS中将整合Siri及地图服务 TripAdvisor:使用AWS比服务器托管成本节省50% [MDCC精华]亚马逊AWS布道师Kingsley Wood:灵活IT架构之道 亚马逊诉讼彰显谷歌在公有云领域威慑力十足 AWS全球创业大赛 奖金100000美元 YY:破冰而出,成功上市 Xtreme Labs工程师:Android开发常陷入的五大深坑 Elon Musk:没了乔布斯的苹果干不过谷歌 旁门左道:第一次开发移动游戏就赚到28623美元 移动周报:小聪明赚大钱 游戏SEO如何耍鸡贼? 创翼全国 六城联动——2012移动互联网应用创新大赛开放日 全国六城联动沙龙 爱丽丝+福尔摩斯 Game Insight解谜游戏玩出新花样 Windows Phone 8 SDK大升级:部分功能兼容WP7 信息大图《愤怒的小鸟》发家史 Intel预测:10年之后你的手机是48核的 消息推送惹怒用户:应用开发者请别太过分 创新工场:我们如何孵化未来? iOS越狱比例下降:国内移动开发环境怎么了? 响应式图像技术与资源分享 看Twitter如何应对大选:少些Ruby 多些Java 请教高手!如何执行带条件SQL语句? 大家一起来为c#加油阿 追女教训谈 如何用OUTLOOK作多用户使用???? 赐教 有谁知道ramdrive.sys在dos下的详细用法,敬请赐教,倍感感激!! 怎么用Delphi调用MySql(win) 关于frame的问题. 为什么显示不出来???? c#通过INTERNET远程访问数据库都有什么办法?(请高手指点) 有誰能把CDONTS.DLL(電子郵件)的源代碼貼出來嗎?有分送,THANK! 请教 NetColorWolf(NCW) pb7的工具条栏的文字字体! 为什么,我的子窗口调用另一个窗口时,总是新开一个被调用窗口,而且被调用窗口中的ADOTable的connected总是丢失。why 《Delphi淡手辑略 之 数据库篇》:数据安全删除(函数) 请教! 我用setfocus使一个控件聚焦,但我想隐藏光标,不想让它在界面上闪动,怎么办? 用delphi 编防火墙 有谁知道ramdrive.sys在dos下的详细用法,敬请赐教,倍感感激!! 关于Delphi线程构造函数: 简单问题 ADSL代理上网部分站点上不去解决一例. 消息中间件的功能?各位铜人帮忙! 如何改变对话框和窗体的背景色呢? 《Delphi淡手辑略 之 数据库篇》:打印DBGrid中的所有数据(过程) 有关Delphi指针的问题,请高手帮忙!!!!!!! 还是weblogic问题 麻烦帮我检查一下代码,实在想不通 请问大家我新买一台品牌机,再使用时经常死机是怎么回事? 哪里有介绍Active Directory 的中文资料? 怎样在ListView组件的详细显示模式下,让屏幕自动随输出数据滚屏和聚焦在输出的数据上面。 实现接口时出错,分数大大的有 《Delphi淡手辑略 之 数据库篇》:数据集解构成树(过程) 100分求教!!!文章“如何快速自动生成并定制报表”的问题!!! 一个农民上网的代价! 怎样将分割视图在一开始显示的时候就是确定的? Win2000server如何设置成路由器? 存储过程和函数得问题 转帖]!现在各大城市求爱对话写真 如何把XML+XSL的输出结果显示到一个指定的HTML元素里? 有些API中的参数开头是lpsz ,lpsa ....请问什么意思?相关的也说说好吗?谢谢 为何长语句分不了行 我用vs.net正式版开发的留言簿提供全部源码下载 公车上的性骚扰 请问哪里有比较好的关于 OpenGL 的网站或者是论坛啊?小弟的毕业设计课题是关于这个的!(NULL) 一个高难度的问题,特急! 在linux下有没有类似windows当中的dos95.BAT的文件 为什么在程序运行SQL中的存储过程,会出现未能找到存储过程...,可是我在SQL中有这个存储过程阿! 不晓得《资本论》的英文名字叫什么,特地来请教大家 一个高难度的问题,特急! 一个高难度的问题,特急! llpei 谢谢你。请进来领分。 这是VS.NET的BUG吗?不是该怎么解决? Slice(FSortArray^, FSize)解释解释“^”和“Slice()” 有没有关于欧洲历史什么的概述书啊、文章啊都行 简析欧阳修《五代史伶官传序》 (1)该文的中心论点是什么?(2)作者是怎样论证中心论 点的 (3) 文章最 ..凡含有气元素的化合物一定是气化物.加热氯酸钾会生成氧气,则氯酸钾中含有氧气分子.凡含有氧元素的化合物一定是氧化物。抱歉打错了。 3()3()3()3=8 ()里添符号3()3()3()3=8()里添符号 求(新五代史.伶官传)翻译!kkkkkkkkkkkkkkkk不是序文,拜托把网址留一下 化学1题其它几个错哪里了? 12个3等于2000,3之间添符号+-×÷. 当前世界最热门最尖端的科学研究领域是什么? 为什么这道化学题我这样做是错的呀? 六年级第二学期的课文当时延安的生活很艰苦,为什么会有那么大的吸引力? 2=12 添什么符号?2年级暑假生活第11天上的. 调节人体生理活动的最高级中枢位于 1.小脑2.大脑3.脊髓4.神经 杨家岭在课文延安我把你追寻里是什么样地方 添符号9 12 9 3=24还有 11 2 3 7=24,12 9 8 2=24 化学老师让我们用化学语言赞美她一下怎么写,她姓叶 语文书六年级下册第四篇课文《延安,我把你追寻》诗人为什么要追寻延安?追寻延安什么?急 1992 1992 1992 1992 =2000 中间符号随便加 赞美鼓励别人的语言 唱南泥湾这首歌,联系延安,我把你追寻课文,写自己的感受一定要准确点的啊! 极限x趋于0,[(1+x)^(1/x)-(A+Bx+Cx^2)]/x^3=D,D不为0.求ABCD的值.求具体点方法 鼓励别人的语言 历史科论证题有人认为甲午战争是中国历史发展的一个重要的分水岭,它使中国近代化的进程大大加快了,请你论证这一观点(从经济、思想、政治几方面论证) 7 7 7 7=10加什么运算符号算式才能成立 物体做匀速直线运动,其位移随时间变化的函数关系式为s=2t+2t平方,则第1s内物体的位移是(),第2s末...物体做匀速直线运动,其位移随时间变化的函数关系式为s=2t+2t平方,则第1s内物体的位移是 四个五怎样得到2添运算符号 为什么为什么为什么.鱼不能在凉开水中养,是因为凉开水中几乎没有( )A氧分子 B氧原子 C氢元素 D氧元素我想说,原子构成分子,分子组成元素,实际说,我认为他们都一样,虽然元素的范围比较 求单边拉氏反变换:F(s)=2(s^2+3)/[(s+2)(s^2+2s+5)]有点难 气温变化是属于物理学中的什么运动?今天20度,明天15度,后天22度...物理学里记得有直线运动,曲线运动,圆周运动,简谐振动等等...用那个运动来解释它,比较合理?为什么? 延安,我把你追寻,到底追寻什么? 把0.05molNaOH固体分别加入100ml液体中,溶液的导电性变化不大的是()A.自来水 B.0.5mol/L盐酸 C.0.5mol/L D.05mol/L氯化铵溶液 孟子鱼我所欲也主要内容 介绍一下《延安,我把你追寻》 脊髓和小脑里的灰质和白质哪个在外围,哪个在里面? 如果非要分别 那么天气的温度变化属于物理变化还是化学变化 历史上自然灾害 6.食醋是厨房中的一种调味品,其中含有少量醋酸.下列有关醋酸的说法不正确的是( )A.醋酸分子是有碳、氢、氧三种原子构成的B.醋酸中碳元素的质量分数为40% C.醋酸是由碳、氢、氧三种元 鱼我所欲也中的重点词有哪些? 历史自然灾害 下列符号只具有微观意义的是Cl2 2N2 Cu Co2原因 流通环境的物理因素,气象因素将对产品产生什么影响 诗歌的题目是“延安,我把你追寻”,这和“我把你追寻,延安”“追寻你,延安”在表达效果上有何不同? 灰质和白质的排列,在脊髓中是_____,在大脑中是_____ 用简洁的语言概括《鱼我所欲也》的主要内容 延安,我把你追寻 全诗我要这首诗全文! 下列符号只具有微观意义不具有宏观意义的是A、OB、AlC、2NaD、H 作者在第三段中阐述的观点 延安我把你追寻的诗的意思望火速回答 脊髓中的神经中枢是白质在外,灰质在里的;而大脑中的神经中枢是白质在里,灰质在外的.请问是为什么?越详细越好.tongruoming,我是问为什么脊髓中的灰质在里,而大脑中的灰质在外? 关于写父母的爱文章,500字 诗中“追寻延安”的意思是?直接说“追寻延安”的意思 脊髓灰质和白质是什么? 西周时期的历史概述请简要介绍西周时期的历史,可以参考哪些书籍 《延安,我把你追寻》诗句意思我像答案. 大脑和脊髓的灰质和白质有细胞体的哪部分组成 简述唯物主义基本观点和历史形态? 论述:邓小平理论的科学体系及历史地位 问一些极限天文问题微波背景辐射的产生?虚时间如何存在?(即是否介于1,2,3,4维时空,空间中) 从中国历史角度阐述劳动创造人类! 一道历史漫画图的材料分析论证题图上的字样有——欧洲大战(法英俄都冲向欧洲大战的火燎中) 还有和平运动,国共内讧,重废政府等字样(一个军阀似的人支撑着快塌陷的房子) 此图是上 你的化学题是错的你那个向醋酸钠中加醋酸呈中性的回答是错的
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘