串行通讯—调制解调器(MODEM)之三 点击:1656 | 回复:0



如火

    
  • 精华:172帖
  • 求助:0帖
  • 帖子:803帖 | 5249回
  • 年度积分:0
  • 历史总积分:0
  • 注册:1900年1月01日
发表于:2005-12-05 11:29:00
楼主
vb开发MODEM通信软件

   一: 零Modem连接即直接用调制解调器电缆将两台设备连接起来,Modem连接则通过DCE(Modem)将两台PC连接起来。

    零Modem连接用于距离15m内两台DTE或DCE设备之间的连接。而Modem连接则通过电话网或专线用于长距离的通信。

    TXD和RXD信号线用于计算机和Modem间传输数据信息;RTS从计算机端发送信号到Modem,表示希望把数据传给Modem,若Modem能接收这个数据,它将发送CTS信号给计算机;DTR从计算机端发送信号到Modem,表示计算机已作好通信准备,Modem将DTR信号作为初始化自己的信号,然后给计算机回送数据设置就绪信号DSR;当本地Modem接收到远地Modem的呼叫,则发送RING信号给计算机;Modem应答呼叫后,发送数据载波检测DCD信号到计算机,表示已建立连接。

  二:  Modem的工作状态分为命令状态和在线状态。处于命令状态时,Modem对串口发送的信息进行解释,可通过PC串口向Modem发送AT命令对其进行初始化、设置和操作。

例如,初始化命令为:“ATQOV1WOSOΚ1&C1&D2&YO&WO”,其含义为:

QO:返回结果码;

V1:以字符形式显示结果码;

WO:不返回协商进程结果码;

SOΚ1:振铃一次,即应答;

&C1:追踪数据载波信号CD;

&D2当DTR从开到关时,Modem挂机进入命令状态;

&YO:Modem上电时重新调出用户方案;

&WO:将以上设置存为动态设置用户方案0;

一旦本地Modem与远地Modem建立连接,Modem即处于在线状态,可进行数据传输。此时,Modem不响应AT命令,直接传送所收到的数据。

三、Modem连接远程通信软件的编制

通信过程中大部分的工作由串行通信驱动软件承担。

本文软件的运行环境为AST+4/66d,Hayes公司的ACCURA144+FAX144Modem,Windows3.2,VB3.0专业版。VB3.0专业版中提供了一个MSCOMM.VBX通信控件。它使用户能很方便地通过对控件属性的设置、检测,访问串行通信驱动程序的大多数特性,而不必考虑其实现细节。该控件为“事件驱动”,只响应“OnComm”事件,该事件可对已发生的事件或错误进行处理,与CommEvent属性紧密相关。

通信软件、通信驱动软件和Modem之间的通信关系

以下程序实现了通信的基本过程。包括初始化串口和Modem,上位机拨号呼叫下位机,下位机应答并开始定时传输数据,挂机停止传输等功能。

VB3.0编制的通信软件清单如下:

上位机控件清单:

控件名称 属性

Form1Form1Caption ″上位机通信″

MsComm comm1

CommandButton1CallCaption ″拨号″

CommandButton2hangCaption ″挂机″

CommandButton3ExitCaption ″退出″

下位机控件清单

控件名称 属性

Form1Form1Caption ″下位机通信″

MsComm comm1

CommandButton1hangCaption ″挂机″

CommandButton2ExitCaption ″退出″

Timer1Timer1Interval 3000

Text(i)Text(i)

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$′当前


关于modem AT命令使用可以下载:
http://www.gongkong.com/download/detail.asp?id=2150


热门招聘
相关主题

官方公众号

智造工程师