大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> 程序开发 -> 在VB下实现无线通信的方法

在VB下实现无线通信的方法

时间: 2021-07-31 作者:daque

一、 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 串口1comm1.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 = 0call 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.commeventcase mscomm_er_rxover 接受缓冲区溢出,可插入相映的代码case mscomm_er_txfull 传输缓冲区已满,可插入处置代码case mscomm_er_receive 收到1个字符,可加入以次处置进程comm1.rthreshold = 0 不复相应oncomm事变,转入查寻办法接受ii = 0iii = 0: sinn = chr$(42): sinn1 = chr$(42)初始化变量doduration = timer + .2 设定超时退出的功夫值iii = iii + 1sinn1 = sinndo 该轮回确定输出缓冲区能否罕见据或能否超时'dummy% = doevents()loop until comm1.inbuffercount >= 1 or timer >= durationif timer >= duration theniii = iii - 1overtime = true 决定超时退出,并非平常退出exit doend ifsinn = comm1.input 平常退出,取值付给sinnif header_er = 0 thengoto test_headerend ifif asc(sinn) > 175 or asc(sinn) < 160 then 确定包头能否精确iii = 0goto station_number_er 包头不精确,抛弃该数据end iftest_header:header_er = 0 包头精确,接遭到包头,header_er=0ssin(iii) = sinn 'put date into string dimantionstation_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) andsinn = chr$(13) 当收到精确的包尾0a,0d畏缩出if overtime = true then 即使超时非平常退出overtime = falsecomm1.rthreshold = 1 从新启用oncomm事变,等候接受下一包timer6_wait.enabled = truegoto endsubend 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 = 0call time_delay 符合延时comm1.rtsenable = false 置ptt为低end ifif package_number > 1 then 即使不是结果一包comm1.rthreshold = 1启用oncomm筹备接受下一包timer6_wait.enabled = trueend ifendsub: header_er = 1: comm1.inbuffercount = 0'empty inbuffer protect from bed data on the inbufferend selectend sub 

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.