CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

关于MODEM编程问题(急)!!!!!

楼主zpos(风)2006-03-03 22:20:02 在 Delphi / VCL组件开发及应用 提问

各位高手:  
   
          我的编程环境:  
                  DELPHI7.0   +   APRO4.06  
   
          我的问题:  
                  请问在拨通对方电话以后,如何使用APRO控件判断对方是否已挂机/对方用户忙。  
   
          谢谢!  
  问题点数:100、回复次数:6Top

1 楼lovendII(流氓都做了城管)回复于 2006-03-04 08:20:21 得分 20

http://www.mcuchina.com/Article/Interface/COM/COMPRG/200411/37.html  
   
  MODEM编程及开发通讯软件技巧  
   
  Top

2 楼zpos(风)回复于 2006-03-04 09:37:06 得分 0

能否给出一些关于APRO编程的例子,我这里已经有《delphi串口及语音传真高级编程》的程序,不过它用的是APRO3.0X,有些属性是APRO4.0内没有的或是改写了。   所以我想请教一下各位高手,如何在APRO4.0下使用控件判断‘对方用户已挂机’等类似情况!?Top

3 楼2353939(▄︻┳═一 菜鸟)回复于 2006-03-04 15:33:38 得分 0

markTop

4 楼2353939(▄︻┳═一 菜鸟)回复于 2006-03-04 15:38:02 得分 5

MODEM编程及开发通信软件的技术与技巧  
   
  作者:王渤         文章来源:国防大学图书馆技术室         点击数:         更新时间:2004-11-24    
  龚建伟评论:本文对MODEM编程结合MSComm控件作了较为详细的说明,想了解MODEM编程的读者可以看看,文章后附实例程序。  
   
   
  【提要】随着计算机应用领域的不断扩展,计算机之间的远程通信用得也越来越广泛,计算机间的远程通信所使用的通信软件,在市面上可以买到,但是通用的通信软件虽然能发送和接收文件,在许方情况下这些通信软件并不能满足实际工作的需要。本文就这一技术进行了探讨,介绍了有关的知识和技术,并由实例分步骤说明如何进行通信软件的开发。    
   
  一、前言    
    本文将以VB5.0所带的通信控件MSCOMM进行通信软件的开发,它有约30个属性和事件(可以从联机帮助中找到其使用资料)。本文简述它的主要属性及事件,并归类整理。    
  利用串行端口与调制解调器进行连接时,对于用MSCOMM控件编制通信软件来说,只需了解以下五根线的代号及作用。以下五根线的高电平/低电平状态分别对应MScomm控件的相应属性的True/False值。    
    (1)DTR线:PC发往MODEM,表示PC机是否已准备好。    
    (2)RTS线:PC发往MODEM,表示PC机是否允许modem发回数据.    
    (3)DSR线:MODEM发往PC,表示MODEM是否已做好操作准备    
    (4)CTS线:MODEM发往PC,表示MODEM是否允许发送数据    
  (5)CD线:MODEM发往PC,表示MOEDM已经与呼叫的远方MODEM处于连结状态    
   
  二、MSCOMM控件的属性    
  用1,2,...表示串口COM1,COM2....    
  设置或返回联接MODEM的串口的编号    
  Settings    
  例用"19200,N,8,1"表示传输速率为19200bps,没有奇偶校验位,8位数据位,1位停止位。    
  设置或返回通信参数。    
  Handshaking    
  0没有握手协议,不考虑流量控制。    
  1XON/XOFF,即在数据流中嵌入控制苻来进行流控。    
  2RTS/CTS,既由信号线RTS/CTS自动进行流量控制(常用)。    
  3两者皆可。    
  设置或返回硬件握手协议,指的是PC机MODEM之间为了控制流速而约定的内部协议。    
  PortOpen    
  True/False可以打开/关闭端口。    
  打开或关闭端口。    
  OutBufferSize    
  传输缓冲区的字节数,如选1024。    
  设置或返回传输缓冲区大小。    
  OutPut    
  Variant型变量。    
  向传输缓冲区写数据流。    
  传输文本数据时,应将String型数据放入Variant变量,传输二进制数据(即按字节)时,应将Byte型数组数据放入Variant变量    
  InBufferSize    
  接收缓冲区的字节数,如选1024。    
  设置或返回接收缓冲区大小。    
  InputMode    
  0用Input属性接收文本型数据。    
  1用Input属性接收二进制数据。    
  设置或返回接收数据的数据类型。    
  InBufferCount    
  Integer型    
  返回接收缓冲区中已传到但还未取走的字符个数。    
  Input    
  当InputMode属性值为0(文本模式)时,变量中含String型数据。    
  当InputMode属性值为1(二进制模式)时,变量中含Byte型数组数据。    
  将接收缓冲区中收到的数据读入变量。    
  DTREnabled    
  RTSEnabled    
  DSRHolding    
  CTSHolding    
  CDHolding    
  均取值TRUE/FALSE    
  用于读取或控制pc机与modem之间的交互状态。需运用好。例如,应在读取到DSRHolding属性值为TRUE时再向MODEM发出命令。应当在载波检测到以后(CDHolding属性为TRUE)时再向MODEM发送数据。    
   
  三、MSCOMM控件的触发事件    
    MSCOMM控件只使用一个事件OnComm,用属性CommEvent的十七个值来区分不同的触发时机。主要有以下几个:    
    (1)CommEvent=1时:传输缓冲区中的字符个数已少于Sthreshold(可设置的属性值)个。    
    (2)CommEvent=2时:接收缓冲区中收到hreshold(可设置的属性值)个个字符,利用此事件可编写接收数据的过程。    
    (3)CommEvent=3时:CTS线发生变化。    
    (4)CommEvent=4时:DSR线发生变化。    
    (5)CommEvent=5时:CD线发生变化。    
    (6)CommEvent=6时:检测到振铃信号。    
    另外十种情况是通信错误时产生,即错误代码。    
   
  四、通信软件程序实现    
    1、首先是通信参数设置,主要就是可以设置端口号,波特率,数据位,停止位,奇偶校验位及设置硬件握手协议,这些设置较为简单。    
  2、向MODEM发出DTR(已准备好)信号,如下例程:    
  If   MSComm1.PORTOPEN   Then    
  MSComm1.DTREnable=True    
  Else    
  MSComm1.DTREnable=False    
  EndIf    
  3、打开时向MODEM发出一些命令来设置参数,其中S0=n(n>=1)自动应答.n为响铃次数;E0/E1关闭/打开命令字符回应;Q0/Q1modem返回/不返回结果码;M0/M1关闭/打开MODEM扬声器,例程如下:    
  If   MSComm1.PORTOPEN   Then    
  Do   While   not   MSComm1.CTSHolding   :   loop    
  Outstring="ATS0=1E1Q0M0"+Chr(13)    
  MSComm1.Output=Outstring    
  End   if    
  4、进行拨号设计,需向MODEM发出ATDT命令,如下语句:    
  MSComm1.Output="ATDT"+Trim(“电话号码”)+Chr(13)    
  5、拨号以后发送数据文件,程序要循环等待并随时判定是否接通。如果MODEM向PC的回应字符串中含有"Connect"或CDHolding属性值变为True(检测出载波),则表示已与远方MODEM连机了,此时可以传输数据。    
  程序设计发送及接收程序时,需要以下定义:    
  S_FILENAME   =   "NAME"   +   Chr(5)   +   Chr(13)   +   Chr(10)    
  S_FILELEN   =   "LENTH"   +   Chr(5)   +   Chr(13)   +   Chr(10)    
  S_FILESEND   =   "BEGIN"   +   Chr(5)   +   Chr(13)   +   Chr(10)    
   
  Sub   OpenFileToSend()   '打开一个欲发送的文件    
  HSend   =   FreeFile    
  Open   SENDFN   For   Binary   As   hSend   'SENDFN中含有由用户选定的要传送的文件名。    
  LF&=LOF(hSend)   '文件长度为LF&    
  '开始发送文件名,文件长度,文件开始等信息字符串。    
  Dim   Data   as   Vrait    
  Data   =   S_FILENAME    
  MSComm1.Output=Data   '发出"FILENAME"文件名字串的提示信息    
  Data   =   SENDFN   +Chr(13)+Chr(10)    
  MSComm1.Output=Data   '发出文件名    
  Data   =   S_FILELEN    
  MSComm1.Output=DATA   '发出"FILELEN"提示字串    
  Data   =   Trim(Str(LF&))+Chr(13)+Chr(10)    
  MSComm1.Output=Data   '发出文件大小    
  Data   =   S_FILESTAR    
  MSComm1.Output=Data   '发出"FILESTART"提示信息,表示下面文件开始。    
   
  Dim   Sendarr()   as   byte   '定义字节型数组    
  Sum=0   '记录累计发送的字节数    
  BSIZE=MSComm1.OutBufferSize   '每次发送的块大小    
  ReDim   Sendarr(1   To   BSIZE)   '重新定义读取缓冲    
  Do   While   Sum<LF&   '循环发送    
  If   LF&-Loc(hSend)<BSIZE   Then    
  BSIZE=LF&-Loc(hSend)    
  ReDim   Sendarr(1   To   BSIZE)    
  End   If    
  Get   hSend   ,,   SENDARR   '从文件取字节放入字节数组    
  Sendvar=Sendarr   '转放到Variant型变量    
  '当CTS线及CD线为高电平时才可发送,否则需等待。    
  T=Timer+60    
  L:    
  If   MSComm1.CTSHolding   And   MSComm1.CDHolding   Then    
  MSComm1.Output=Sendvar   '发送    
  Sum   =   Sum   +   BSIZE'累加计数    
  Else    
  If   Timer   <   T   Then    
  Go   To   L   '循环等待    
  Else    
  Go   To   CLOSEFILE   '等待时间超过60秒则退出    
  End   If    
  End   If    
  '等待系统处理完    
  Do    
  RET   =   DoEvents()    
  Loop   Until   MSComm1.OutBufferCount   =   0    
  Loop   '循环发送完毕。    
   
  6、接收MODEM送回的信息和数据文件,该过程是编写mscomm1控件的OnCOMM事件的处理程序来完成。为了接收文本类型的握手信号,通常使InputMode属性为文本模式。当发现接收到的字符串中有"FILESTAR"+Chr(5)+Chr(13)+Chr(10),则将InputMode属性改为二进制模式。当文件内容接收完(由接收的字节数判断)再将InputMode属性改为文本模式。例程如下:    
  Private   Static   Sub   MSComm1_OnComm()    
  Select   Case   MSComm1.CommEvent    
  Case   comEvReceive   '接收缓冲区收到Rthreshold个字符时触发    
  Dim   DATA   As   Variant    
  Dim   N   As   Long    
  Dim   SJARR()   As   Byte    
  N=MSComm1.InBufferCount   '接收缓冲区字符总数    
  If   MSComm1.InputMode=0   Then'文本模式时,将收到的数据放到字符串变量。    
  MSComm1.InputLen=0    
  DATA   =   Space(N)    
  DATA   =   MSComm1.Input    
  Else   '二进制模式时,将收到的数据放到字节数组。    
  ReDim   S   JARR(1ToN)    
  DATA=ARR    
  MSComm1.InputLen=N    
  DATA=MSComm1.Input    
  End   If    
  '其它case情况略    
  End   Select    
  End   Sub    
   
  7、关于接收到的数据的处理例程:    
  Public   Static   Sub   HandleData   (Disp   As   Control,N   As   Long,DATA   As   Variant)    
  '参数:Disp(文本框,用于显示接受数据)    
  'N为本次接收到的字节数    
  'DATA(接收到的数据.Variant型)    
  If   not   mscomm1.InputMode=0   Then   '接收的是字符串    
  Go   To   L2    
  End   If    
  Disp.SelStart   =   Len   (   Disp.Text)    
  Disp.SelLength   =   0    
  Disp.SelText   =   DATA   '显示字符数据    
  If   InStr(1,Disp.Text,S_FILESTAR,0)=0   Then   '若没有开始标志就结束此过程    
  ExitSub    
  EndIf    
  V_FILENAME   =   InStr(1,Disp.Text,S_FILENAME,0)   '找文件名及文件长度    
  V_FILELEN   =   InStr(1,Disp.Text,S_FILELEN,0)    
  FN   =   Mid(Disp.Text,V_FILENAME+11,(V_FILELEN-V_FILENAME-13))    
  HJS   =   FreeFile'打开接收文件    
  JSFN   =   Pathc+"\SJFILE\S"+Trim(Str(NO))+"_"+FN    
   
  Open   JSFN   For   Binary   As   HJS    
  V_FILENAME   =   InStr(1,Disp.Text,S_FILENAME,0)    
  V_FILELEN   =   InStr(1,Disp.Text,S_FILELEN,0)    
  FN   =   Mid(Disp.Text,V_FILENAME+11,(V_FILELEN-1)-(V_FILENAME+11))    
  FL   =   Mid(Disp.Text,V_FILELEN+11,V_FILESTAR-(V_FILELEN+10))    
  SENDLEN   =   Val(FL)   '应收总字节数SENDLEN    
   
  ReDim   JSARR(0   To   N-1)    
  JSARR=DATA   '将字节流放入字节型数组    
  Puth   JS   ,   ,   JSARR   '   写入已打开的接收文件    
  JSLEN=JSLEN+N   '本次已累计收到的字节数    
  Close   HJS    
  End   Sub  
  Top

5 楼oushengfen(逸帆)回复于 2006-03-05 13:10:07 得分 0

我晕,MSComm控件不好用,有没有直接使用API拔号的程序.Top

6 楼hiphon1()回复于 2006-03-05 15:05:56 得分 75

在APRO中,APDTAPIDEVICE控件中有个TAPISTATUS属性,通过它即可判断。  
  如果还有问题,请发邮件至ZHF@21CN.COM.Top

相关问题

  • 串口MODEM编程
  • modem编程问题???
  • 关于MODEM编程
  • 求助modem编程
  • delphi编程!(急!)
  • 急:GDI+编程
  • php编程急问
  • (急)类的编程
  • 急问 winsock编程
  • 急!急!急!编程问题

关键词

  • 属性
  • 数据
  • 控件
  • 通信
  • 文件
  • 字符
  • pc
  • 二进制
  • 软件
  • modem

得分解答快速导航

  • 帖主:zpos
  • lovendII
  • 2353939
  • hiphon1

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo