科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件使用Visual Basic开发通讯软件(二)

使用Visual Basic开发通讯软件(二)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

在程序初始化时,先对串口初始化。因为使用rts/cts握手信号的硬件设备只有rts信号置为高才能接收数据,

作者:enet 来源:soft6 2008年5月14日

关键字: 通讯 开发 VB vb.net Windows

  • 评论
  • 分享微博
  • 分享邮件

1.串口初始化、设置程序

  在程序初始化时,先对串口初始化。因为使用rts/cts握手信号的硬件设备只有rts信号置为高才能接收数据,所以需将mscomm通信控件的rtsenable属性设为true。由于modem在处于命令状态时,通过串口发送的命令以及命令结果均会回显在输入缓冲区中,因此在进入在线状态前,禁止产生ev-receive事件,避免数据误处理。


  由于windows是多任务系统,在进行数据收发循环处理时,应调用doevents事件,将控制权交还系统,允许windows执行其他任务。但应注意,在处理oncomm事件时小心使用doevents,避免系统又产生oncomm事件,造成嵌套,出现堆栈溢出错误。

sub form-load()

comm1.commportκ1′com1口通信

comm1.settingsκ″9600,n,8,1″′波特率9600,无校验,8位数据位1位停止位

comm1.outbuffersizeκoutpack′设置输出缓冲区大小

comm1.inbuffersizeκinpack′设置输入缓冲区大小

comm1.inputlenκ1′每次从输入缓冲区中取一个字符

comm1.rtsenableκ-1′rts信号为高

comm1.rthresholdκ0′不产生mscomm-ev-receive事件

comm1.portopenκ-1′打开串口

cdκcomm1.cdholding′取载波检测信号线原始状态

comm1.outputκ″atqov1wosoκ1&c1&d2&yowo″′初始化modem

do doeventsloopuntilcomm1.outbuffercountκ0

end sub

2.上位机拨号呼叫下位机

subcallcom-click()

comm1.outputκ″atdt″&phonnum$&chr$(13)′向modem发拨号命令

do doeventsloopuntilcomm1.outbuffercountκ0

end sub

3.下位机modem应答,连通后开始定时传输数据

下位机检测cd,判断是否连通:

sub comm1-oncomm()

select casecomm1.commevent

case5 ′mscomm-ev-cd

timer1.enabledκ-1′启动定时器

end select

end sub

  vb传送定长字符串,数据接收处理相对简单。但在发送实时数据时,若将数据转换成定长字符串,这样会大大降低传输效率。在接收端,通知程序从输入缓冲区中取字符有两种方法:一是用轮询方法循环判断inbuffercount是否为0;另外就是利用rthreshold属性触发“oncomm”事件及“commevent”属性中ev-receive事件。当rthreshold的值不为0时,允许产生ev-receive事件。该属性设置和返回在通信控件设定commevent特性为接收和产生oncomm事件之前要接收的字符数。vb传送变长字符串时,接收端的rthreshold值要作相应的改变,以确保接收数据及时准确。

  下位机定时发送字符串“strin3$κformat$(len(strin1$),″0000″)&chr$(8)&strin2$”。strin1$为当前字符串,strin2$为上一字符串。上位机根据接收strin3$中len(strin1$),相应改变rthresholdκlen(strin1$)+4。这样,通过提前发送字符串长度,改变rthreshold值可实现发送变长数据。


 

[下一页]


 

  windows串行通信驱动程序的事件驱动特性仍有不稳定的缺陷。如inputlenκ0时,有可能取出不完整的数据。为保证可靠,采取降低处理速率的方法,保证下位机发送的数据流完整地进入输入缓冲区。设inputlenκ1,即每次从缓冲区中取一个字符。也可采用轮询方法,定时检测输入缓冲区。下位机定时发送数据:

sub timer1-timer()

if comm1.cdholdingιλcdthen

str1$-text1(i).text

strin2$κstrin1$′上一字符串

strin1$κstr1$′当前字符串

strin3$κformat$(len(strin1$),″0000″)&chr$(8)&strin2$

′传送当前字符串长度,以及上一字符串内容

com m1.outputκstrin3$

do doeventsloopuntilcomm1.outbuffercountκ0

else

timer1.enabledκ0

end if

end sub

上位机检测cd状态,判断是否连通、并接收处理数据。

sub comm1-oncomm()

select case comm1.commevent

case5 ′mscomm-ev-cd检测cd状态,判断是否连通

comm1.inbuffercountκ0′清输入缓冲区

comm1.rthresholdκ4′当输入缓冲区中有五个字符,

case2′mscomm-ev-receive产生ev-receive事件,接收处理数据

do doevents

ifcomm1.inbuffercountthen′循环从缓冲区中取数据

str1$κstr1$+comm1.input

else

exit do

end if

loop

len2κ1en1′当前字符串长度

len1κva1(left$(str1$,5))′即将发送的字符串长度

comm1.rthresholdκlen1+4

strin$κright$(str1$,len2)′数据处理

……

end select

str1$κ″″

end sub

4.根据设置的at命令“&d2”,当置dtr信号为低时,modem挂机进入命令状态。也可通过串口输出““+++ath”+chr$(13)”字符串挂机。

sub hang-click()

if comm1.cdholdingιλcdthen′检测cd,判断是否挂机

comm1.dtrenableκ0

comm1.dtrenableκ-1′置dtr信号为高,为下一次通信准备

end if

end sub

5.退出程序时,一定要关闭串口

sub exitcomm()

comm1.portopenκfalse

end

end sub

四、windows通信机制和vb3.0通信控件潜在缺陷

在通信软件编制过程中,我们发现windows下通信机制采用的“事件驱动”在实际运行中不稳定。如在文件传输过程中,误码和数据丢失的情况时有发生;若串口波特率过高,会产生无法通信或在通信过程中随机挂机的情况。这主要是由于windows本身通信机制和通信线路介质及质量的影响。为保证数据传输稳定可靠,可采用通信协议如xmodem-crc或ymodem。在mscomm.vbx通信控件中,rthreshold属性值大小与输入缓冲区inbuffersize大小有关,当rthreshold值较接近inbuffersize值时,有可能不产生ev-receive事件,为保证产生该事件,可将inbuffersize值取得较大。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章