編寫電話撥號程序時一點小技巧

字號:

在MSCOMM控件,輸出電話號碼后,MODEM如檢測到忙音,會返回一個busy字符。
    問題: 用vb如何通過modem讀取電話線上的電話機數(shù)字鍵發(fā)出的DTMF信號?以實現(xiàn)BITWARE中用電話機對語音信箱的操作。
    回答:
    VB中有TERMINAL CONTROL 的控件(主持人注:即MSCOMM32),可以對串行口進行讀寫,而計算機相對于MODEM,正好是一個DTE與DCE的關(guān)系,關(guān)于這種關(guān)系的細(xì)節(jié)可以去參考RS232的通信原理,標(biāo)準(zhǔn)MODEM中大概有30個接口寄存器,你對MODEM卡是無法直接訪問這些寄存器的,只有通過AT命令,由MODEM來完成一些特定的功能。關(guān)于DTMF檢測(也就是對方電話號碼的檢測),則該MODEM芯片必須具有CALLER ID的功能,至于AT命令中是否有檢測CALLER ID 功能的命令,需要你去查閱相關(guān)的最新資料,因為以前的AT命令不包括這個功能,計算機對MODEM的訪問方式就是AT命令。(考試大建議:一般在Modem的手冊上會有AT指令集)。
    注:目前的Modem一般都不具備檢測DTMF功能,所以一般需要另外購買硬件(如電話語音卡)。
    意見:
    可以采用AT#CID=1,如果顯示OK,則可以接收來電號碼了。
    對于你的MODEM是否有CALLER ID功能,可以通過訪問注冊表的HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Service\Class\Modem\0000\EnableCallerId鍵,看其中是否有AT指令字符,其中1的值就是CALLER ID的AT指令。
    不用另外加硬件也可以接收DTMF信號,要用語音AT命令而且MODEM必需是語音FAXMODEM,接收的字符里含有其他字符,但是有規(guī)律的可以捕捉按鍵號碼。
    請問如何實現(xiàn)用modem撥號時檢查電話是否占線?
    回答:
    ****************
    Private Sub Openport()
    ’初始化Modem
    If Not MSComm1.PortOpen Then
    MSComm1.CommPort = 3
    MSComm1.RThreshold = 1
    MSComm1.OutBufferSize = 1024
    MSComm1.InBufferSize = 1024
    MSComm1.Settings = "9600,n,8,1"
    MSComm1.PortOpen = True
    End If
    End Sub
    *******
    Private Function Waiting(strings As String, waittime As Integer) As String
    ’接收Modem的返回信息
    Dim Endtime As Long
    Dim receivestring As String
    Endtime = Timer + waittime
    receivestring = ""
    errorcode = 0
    Do
    DoEvents
    If MSComm1.InBufferCount Then
    receivestring = receivestring + MSComm1.Input
    If InStr(1, receivestring, strings) Then
    Exit Do
    End If
    End If
    If Timer >= Endtime Or errorcode Then
    errorcode = 1
    Exit Do
    End If
    Loop
    Waiting = receivestring
    End Function
    ********* ’判斷本地Modem
    Call Openport
    MSComm1.Output = "AT" + Chr(13)
    mywin = Waiting("OK", 5)
    If errorcode Then
    ’Modem未準(zhǔn)備好,電話占線
    Endif
    *********
    ’判斷對方Modem
    MSComm1.Output = "ATDT" + vbdialno + Chr(13)
    wait = Waiting("CONNECT", 10)
    If errorcode Then
    ’對方Modem未準(zhǔn)備好,占線
    Endif請問如何在VB中利用MODEM來測試到電話振鈴?
    回答:
    在窗體上建立兩個控件
    1) MSComm 將Name屬性改為Comm
    2) Timer 將Name屬性改為Time
    程序代碼為:
    Private Sub Form_Load()
    Comm.CommPort = 2 ’設(shè)置Modem所在的端口
    Comm.PortOpen = True ’打開通訊口
    Time.Interval = 500
    End Sub
    Private Sub Form_Unload(Cancel As Integer)
    Comm.PortOpen = False ’關(guān)閉通訊口
    End Sub
    Private Sub Time_Timer()
    Dim Buffer As Variant
    Buffer = LTrim(Comm.Input) ’獲得Modem的響應(yīng)信息
    If InStr(Buffer, "RING") > 0 Then Debug.Print "振鈴" ’如果是振鈴則顯示振鈴
    End Sub
    你應(yīng)該檢查CDHolding屬性,看是否線路有CD。如果為true,因為著在線,否則意味著用戶掛斷了。用MScomm控件設(shè)計串行通信程序,需要連接兩個MODEM,并傳輸文件。撥入方和被撥入方都設(shè)置了
    CommPort, Settings,并使 PortOpen 為TRUE,下一步是否撥入方只需撥號即可連通對方的MODEM(我在調(diào)試中,發(fā)現(xiàn)撥號后被撥入方的電話一直響個不停,似乎不能連通),如果不是,被撥入方還需對MODEM輸出什么命令或者還需進行那些設(shè)置,怎樣才能判斷兩個MODEM是否已連通,有的說查詢cdholding是否為true,但我在調(diào)試中cdholding始終為false。因不能判斷MODEM是否已連通,所以傳輸文件時提示錯誤也不清楚問題到底出在那里。
    回答:
    解決方案:
    1、被撥入方還需要設(shè)置一個AT命令,才能響應(yīng)呼入:“ATS0=1”。其中,S0(是數(shù)字零)表示振鈴幾次后應(yīng)答,相當(dāng)于拿起話筒,接通連接;s0=1表示一有呼入就響應(yīng)。AT命令請自行參考MODEM手冊。
    2、判斷MODEM是否已連通,可以這樣做:(以下是我編過的一個VB5的程序段,有刪節(jié))
    Sub MscommSetup()
    ……
    MSComm1.PortOpen = True ’打開端口
    If Err Then
    MsgBox "通信端口無效,請另選端口!", , "初始化端口失敗"
    Exit Sub
    End If
    cd = MSComm1.CDHolding ’定義一個變量,后面要用到
    MSComm1.Output = "ATS0=1&C1" & vbCr ’初始化MODEM,你的初始化命令可能不同
    ’&C1表示追蹤數(shù)據(jù)載波信號CD
    Do
    DoEvents
    Loop Until MSComm1.OutBufferCount = 0
    If Not (MSComm1.CTSHolding And MSComm1.DSRHolding) Then
    MsgBox "Modem沒有響應(yīng),請檢查Modem是否連通!", , "MODEM檢測失敗"
    cmdExit_Click
    End If
    MSComm1.DTREnable = True
    End Sub
    Private Sub MSComm1_OnComm()
    Select Case MSComm1.CommEvent
    Case comEvCD ’檢測CD狀態(tài),判斷是否連通
    If MSComm1.CDHolding <> cd Then
    ’是連通的
    ……
    End If
    ……
    End Select
    End Sub
    1997.8(下) pp58~60
    解決方案:
    撥號方應(yīng)輸出"ATDT"+PhoneNum+Chr(13)
    被撥入方輸出 (1)自動接收 "ATS0=1",返回"OK"
    (2)人工應(yīng)答 "ATA"
    在OnComm事件中
    select mscomm1.commevent
    case comEvCD:
    if not Connect And Mscomm1.CDHolding then
    Connect=true ’連接成功
    endif
    end select