老问题了。。如何用Modem拨号 ( 积分: 100 )

  • 主题发起人 主题发起人 silaszhe
  • 开始时间 开始时间
S

silaszhe

Unregistered / Unconfirmed
GUEST, unregistred user!
虽说是老问题,可依然看不懂前辈们的话,特再次请教。
是这样的,我想用一个普通小软猫自动去拨一列电话号码。
然后如果是通了就怎样,如果是占线就怎样,如果是停机就怎样,如果是。。。
不知能否实现,如可以,怎样具体实现。
我学Delphi比较浅,还忘各位能说得清楚点。。先谢谢。
 
虽说是老问题,可依然看不懂前辈们的话,特再次请教。
是这样的,我想用一个普通小软猫自动去拨一列电话号码。
然后如果是通了就怎样,如果是占线就怎样,如果是停机就怎样,如果是。。。
不知能否实现,如可以,怎样具体实现。
我学Delphi比较浅,还忘各位能说得清楚点。。先谢谢。
 
如果。。。。

如果。。。。

一个一个解决了...什么都等别人给,就不可能进步了。
 
这个么,大概需要
1、操作Modem的At指令,这个你自己去查
2、自己去找一个串口通讯控件,往串口发送At指令(内猫的话,偶不知)
 
wwolf:
我不是那样懒人,我是找了好久都没结果才来发问的。不是自动语音功能的,就是什么数据传输功能的。都没我想要的。不过我想这些不都是建立在拨号连接基础上的?只是翻来覆去的不得要领。
dawnsong:
这两样东西我早早的就准备好了。只是怎么操作法。实在是不明白。DFW里也好多这方面的内容。。只是总觉得还没入门的样子。。
 
如:ATDT66886688简单拨号66886688
如:ATDT0371,66886688简单拨号0371-66886688,中间有个“,”延迟
(ATDT 用音频拨号-ATDP 用脉冲拨号 -ATH 挂起电话)

你可以在超级终端里面这么调试,
或者自己写程序打开串口,写入如上命令字符,然后应该就能听到拨号声音了
 
此问题可以用最新的KOHUR软件解决 具体国内有无下载 我不知道 你可以去查一下
 
dawnsong:
清问我在那里输出您说的字符串。
 
若是内猫,偶不知[:(]
偶仅有一个外猫,写到Modem连接的串口
 
各位,现在拨号是拨出去了。原来就是往串口里直接写。
如今又出现一个问题,拨出号码之后,怎么得知返回的结果。
比如返回是空号,是占线,是不在服务区之类的。。
我用的是spcom,在ReceiveData好像得不到相应的数据。

另外我拨号之后,传来等待接听的声音,我没挂掉,一直等。
最后说:“您拨的电话正忙。。。”。结果返回了一个BUSY。这还说得过去。
可是我瞎拨了一个空号,返回的结果还是BUSY。这就不行了吧。。

还有就是我不懂得原理,如果我拨号过去,给我返回的结果(比如占线,停机之类的)
我要如何判断?

这贴的第一个问题问完,就不开新贴了,回答之后再加分好了。
 
以前做过类似软件,用到APRO控件,具体的你要买一本书看看,有例子说明,好象叫《DELPHI串口高级编程》或者到温锦山的网页上可以查到相关资料。
 
下了好多资料 包括书里好像也没讲这些内容。
哪位大虾只要给个提示就好,我自己去查。
 
这个你自己去看CnPack的源代码,那里有一个Modem控制模块,在CnPack->Source->NetComm->CnModem.pas,看看他的源代码,用起来会很方便
贴出其中回应发送信息的一段代码,呵呵,我没有侵权吧:)

// 等待一条AT命令执行结果
function TCnModem.WaitATResult(Delay: Cardinal): string;
var
Tick: Cardinal;
begin
FWaitATResult := True;
try
FATResult := '';
Tick := GetTickCount;
while (GetTickCount - Tick < Delay) and (FATResult = '') do
Application.ProcessMessages;
Result := FATResult;
FATResult := '';
finally
FWaitATResult := False;
end;
end;

// 发送一条AT命令,返回是否成功
function TCnModem.SendATOk(AT: string; Delay: Cardinal): Boolean;
var
i, j: Integer;
s: string;
begin
Result := False;
for i := 0 to 2 do
begin
WriteATCommand(AT);
for j := 0 to 2 do
begin
s := Trim(UpperCase(WaitATResult(Delay)));
if Pos('OK', s) > 0 then
begin
Result := True;
Exit;
end
else if Pos('ERROR', s) > 0 then
begin
InvalidCommand(AT);
Exit;
end;
end;
end;
end;

// 接收到数据
procedure TCnModem.ReceiveData(Buffer: PChar; BufferLength: WORD);
var
s: string;
begin
if FWaitATResult then // 正在等待AT命令执行结果
begin
FATResult := Buffer;
Exit;
end;
s := Buffer;
s := Trim(UpperCase(s));
if (ModemState in [msOffline, msOnlineCommand, msConnecting]) and (s = 'RING') then
Ring // 振铃信号
else if (ModemState = msOnline) and (s = 'NO CARRIER') then
DisConnect // 载波丢失
else
inherited;
end;
 
还有就是我不懂得原理,如果我拨号过去,给我返回的结果(比如占线,停机之类的)
我要如何判断?
--------------------------------------------------------------------------
上面给你的那个CnModem.Pas文件中有这方面完全的定义
 
我提出的方法可能更方便易懂一点。
 
dawnsong:
非常非常感谢,我仔细看了CnPack。可是他是在RS232上写的。我现在是直接用SPCom控件,难道没有相对简单的方法么?说真的,CnPack里的注释,以我现在的水平,看着有点头大。。。
jwfy2001:
那本书我去书店看了没卖的,网上也只有目录介绍,我下了APRO和那本书的随书附送程序,可惜没书。。实在没法理解。。
 
如果买到这本书,对你有很大帮助,它确实要比AT指令好用多了。
 
多人接受答案了。
 
后退
顶部