上一题下一题
跳转到
 
 
  世界如此多姿,发展如此迅速,窥一斑未必还能知全豹。但正如万花筒一样,每一个管窥都色彩斑斓。  
 
 
  知识通道 | 学习首页 | 教师首页 | PK首页 | 知识创造首页 | 企业首页 | 登录
 
本文对应知识领域
在VB下实现无线通信的方法
作者:未知 申领版权
2010年11月15日 共有 943 次访问 【添加到收藏夹】 【我要附加题目
受欢迎度:

    
    一、 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的控件工具箱中,提供了一个使用非常方便的串行通信控件MSComm,它提供了一个事件OnComm,该事件可以截取串口的任何消息,转入事件处理程序。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满了以后,最早放入的数据就会丢掉,由于采样速率不高,在慢采的情况下,两天的时间才能存满,这样不论上位机或下位机出现断电、死机等问题,数据不会丢失掉。
    
    由于使用的无线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 
    

    

 

相关新闻

您可能对这些感兴趣  

用VB做定时断线程序
VisualBasic中的界面设计原则和编程技巧
VB6.0与Windows API 间的呼叫技巧
制作可以自动隐藏的弹出式菜单
ListBox中的字符串超长显示的解决方法
VB中的Unicode 和 Ansi 格式
优化程序显示速度
Visual Basic 产生渐层的 Form 背景
用VB实现客户——服务器(TCP/IP)
用VB制作注册软件的方法

题目筛选器
日期:
类型:
状态:
得分: <=
分类:
作者:
职业:
关键字:
搜索

 
 
 
  焦点事件
 
  知识体系
 
  职业列表
 
 
  最热文章
 
 
  最多引用文章
 
 
  最新文章
 
 
 
 
网站介绍 | 广告服务 | 招聘信息 | 保护隐私权 | 免责条款 | 法律顾问 | 意见反馈
版权所有 不得转载
沪ICP备 10203777 号 联系电话:021-54428255
  帮助提示    
《我的太学》是一种全新的应用,您在操作中遇到疑问或者问题,请拨打电话13564659895,15921448526。
《我的太学》