关于Modem AT命令--------高分求解(200分)

  • 主题发起人 主题发起人 秋之叶
  • 开始时间 开始时间

秋之叶

Unregistered / Unconfirmed
GUEST, unregistred user!
用 AT 命令初始化 Modem,出现初始化不成功,或是通信一段时间后初始化不成功
的情况。请问谁有这方面的经验,请给出解释或是安全的初始化命令。
我用的初始化 AT命令为:
ATH0
AT
ATE0M0V1S0=2
先后发给Modem后等待回应。请问有何不妥?
 
思考中、、、
 
劳驾,各位有没有这方面的经验请指点一二。
 
我当时作过这方面的东西,好像没有在初始化上化太多的精力。
找AT指令集,试试。
ATDT 号码
ATh结束。
 
你可以试着先发一个字符串'+++',这样可以转换到命令模式,我最近也在用at指令集,在拨号成功以后,就是
先发个'+++'以后才能挂断电话,还有一种可能就是你的命令发出的时候有没有在后面加回车换行,modem要辨
别这个标识才能认为这是一个at指令。给个例子给你
main.cpdrv1.SendString('ATS0=1'+#13+#10); //delphi
这是将modem置为自动应答,一秒钟后自动接通
 
每种MODEM的初始化AT命令都是不完全一样的,

  手动获取MODEM或ISDN(TA)的初始化码

WINDOWS 95/98
1、将您的MODEM或ISDN(TA)直接接到电脑的任一串口上;
2、双击“我的电脑”,然后再双击“控制面板”窗口内的“调制解调器”。
3、在调制解调器列表里选择你所使用的调制解调器型号,点击“属性”,进入后点击“连接”活页夹,然后点击“高级”按钮。
4、在“高级连接设置”窗口内,选择“附加到日志文件”,然后按“确定”离开。
5、然后通过MODEM或ISDN(TA)拨号至ISP,然后断开连接。
6、重复2,3步,在“高级连接设置”窗口内,点击“查看日志”按钮,日志文件里显示的是MODEM或ISDN(TA)的拨号过程。请您留意,在atdt***(***代表您拨的ISP的电话号码)前面以at开头的字符串,例如:AT%A2=2,这段字符串就是您的MODEM或ISDN(TA)的初始化码。

WINDOWS NTSERVER/WORKSTATION 4.0
1、将您的MODEM或ISDN(TA)直接接到电脑的任一串口上;
2、双击“我的电脑”,然后再双击“控制面板”窗口内的“调制解调器”。
3、在调制解调器列表里选择你所使用的调制解调器型号,点击“属性”,进入后点击“连接”活页夹,然后点击“高级”按钮。
4、在“高级连接设置”窗口内,选择“记录日志文件”,然后按“确定”离开。
5、然后通过MODEM或ISDN(TA)拨号至ISP,然后断开连接:
6、在WINNT里查找ModemLog_[您使用TA或MODEM的型号-MP/PPP(TA)].txt。例如,您使用的是实达ISDN TA,则只要查找ModemLog_InterStar TA128 - MP.txt 和 ModemLog_InterStar TA128 - PPP.txt即可。
7、打开ModemLog_InterStar TA128 - PPP.txt后,它会记录您拨号的过程,包括发送接收数据包的时间。请你留意,您会看到“正在初始化调制解调器”这一句,然后它的下一段(与前一段空开一行的)的“发送:”后面的那段AT开头的字符,例如:AT &F2 E0 !L0=0 $I,这段字符串就是您的MODEM或ISDN(TA)的初始化码。

请注意
1、后面的<cr>不属于初始码的一部分。
2、MP表示ISDN 128K双通道,PPP表示64K单通道,两种状态下的初始码是不一样的,所以请分别获取其初始码。
3、E0 表示回显,请你把这两个字符删掉;然后在初始码最后加上 &amp;K3,此为硬流控码,其他则不变,所以AT &amp;F2 E0 !L0=0 $I这段初始码供共享器使用的应为:AT &amp;F2 !L0=0 $I &amp;K3

 
多谢各位热心帮忙。
我在调试过程中发现有的Modem(普遍为内猫),对于初始化AT命令需要一次性写入才能成功。
不知道大家有没有这种经历。
 
不需要拉,不同的Modem在at指令集上有细微区别,要向统一,建议使用TAPI,否则就参考
使用Modem的说明书吧
 
如果是内猫的话,就另当别论了,我也很想知道该如何控制,好像只能用ras才行,我这里有段代码
// ******************************************************************************
// Unit: Ras.pas
// Description: Remote Access unit that encapsulates all Remote Access functions,
// consts and structs.
// Date: 08.12.1996.
// Copyright (c) 1996 Milan Vidakovic. All rights reserved.
// ******************************************************************************
unit Ras;

interface

uses
Windows, RichEdit;

const

NETBIOS_NAME_LEN = 16;
UNLEN = 256;
PWLEN = 256;
CNLEN = 15;
DNLEN = CNLEN;

RAS_MaxDeviceType = 16;
RAS_MaxPhoneNumber = 128;
RAS_MaxIpAddress = 15;
RAS_MaxIpxAddress = 21;

//#if (WINVER >= 0x400)
RAS_MaxEntryName = 256;
RAS_MaxDeviceName = 128;
RAS_MaxCallbackNumber = RAS_MaxPhoneNumber;
//#else
// RAS_MaxEntryName 20
// RAS_MaxDeviceName 32
// RAS_MaxCallbackNumber 48
//#endif

RAS_MaxAreaCode = 10;
RAS_MaxPadType = 32;
RAS_MaxX25Address = 200;
RAS_MaxFacilities = 200;
RAS_MaxUserData = 200;

RASCS_PAUSED = $1000;
RASCS_DONE = $2000;
// ovo su trebale da budu enum konstante, ali pascal ne podrzava predefinisanje vrednosti,
// RASCONNSTATE
// vec samo linearno povecavanje vrednosti enum konstanti
RASCS_Interactive = RASCS_PAUSED;
RASCS_RetryAuthentication = RASCS_Interactive +1;
RASCS_CallbackSetByCaller = RASCS_RetryAuthentication + 1;
RASCS_PasswordExpired = RASCS_CallbackSetByCaller + 1;

RASCS_Connected = RASCS_DONE;
RASCS_Disconnected = RASCS_Connected + 1;

// RASPROJECTION
RASP_Amb = $10000;
RASP_PppNbf = $803F;
RASP_PppIpx = $802B;
RASP_PppIp = $8021;


type
LPVOID = Pointer;
LPTSTR = LPSTR;
BOOL = Integer;
LONG = LongInt;
LPBOOL = ^BOOL;
HRASCONN = DWORD;
LPHRASCONN = ^HRASCONN;
RASPROJECTION = Integer;

RASCONNSTATE = (
RASCS_OpenPort , // 0
RASCS_PortOpened, // 1
RASCS_ConnectDevice, // 2
RASCS_DeviceConnected, // 3
RASCS_AllDevicesConnected, // 4
RASCS_Authenticate, // 5
RASCS_AuthNotify, // 6
RASCS_AuthRetry, // 7
RASCS_AuthCallback, // 8
RASCS_AuthChangePassword, // 9
RASCS_AuthProject, // 10
RASCS_AuthLinkSpeed, // 11
RASCS_AuthAck, // 12
RASCS_ReAuthenticate, // 13
RASCS_Authenticated, // 14
RASCS_PrepareForCallback, // 15
RASCS_WaitForModemReset, // 16
RASCS_WaitForCallback, // 17
RASCS_Projected, // 18

//#if (WINVER >= 0x400)
RASCS_StartAuthentication, // 19
RASCS_CallbackComplete, // 20
RASCS_LogonNetwork, // 21
//#endif
RASCS_SubEntryConnected, // 22
RASCS_SubEntryDisconnected // 23
{ definisano kao konstanta
RASCS_Interactive = RASCS_PAUSED, // 4096
RASCS_RetryAuthentication, // 4097
RASCS_CallbackSetByCaller, // 4098
RASCS_PasswordExpired, // 4099

RASCS_Connected = RASCS_DONE, // 8192
RASCS_Disconnected // 8193
}
);

LPRASCONNSTATE = ^RASCONNSTATE;

RASENTRYNAME = record
dwSize : DWORD;
szEntryName : array[0 .. RAS_MaxEntryName + 1 -1] of CHAR;
end;
LPRASENTRYNAME = ^RASENTRYNAME;

RASAMB = record
dwSize : DWORD;
dwError : DWORD;
szNetBiosError : array[0 .. NETBIOS_NAME_LEN + 1 -1] of CHAR;
bLana : BYTE;
end;

RASCONN = record
dwSize : DWORD;
hrasconn : HRASCONN;
szEntryName : array[0 .. RAS_MaxEntryName + 1 -1] of CHAR;
//#if (WINVER >= 0x400)
szDeviceType : array[0 .. RAS_MaxDeviceType + 1 -1] of CHAR;
szDeviceName : array[0 .. RAS_MaxDeviceName + 1 -1] of CHAR;
//#endif
end;
LPRASCONN = ^RASCONN;

RASCONNSTATUS = record
dwSize : DWORD;
rasconnstate : RASCONNSTATE;
dwError : DWORD;
szDeviceType : array[0 .. RAS_MaxDeviceType + 1 -1] of CHAR;
szDeviceName : array[0 .. RAS_MaxDeviceName + 1 -1] of CHAR;
end;
LPRASCONNSTATUS = ^RASCONNSTATUS;

RASDIALEXTENSIONS = record
dwSize : DWORD;
dwfOptions :DWORD;
hwndParent : HWND;
reserved : DWORD;
end;
LPRASDIALEXTENSIONS = ^RASDIALEXTENSIONS;

RASDIALPARAMS = record
dwSize : DWORD;
szEntryName : array[0 .. RAS_MaxEntryName + 1 -1] of CHAR;
szPhoneNumber : array[0 .. RAS_MaxPhoneNumber + 1 -1] of CHAR;
szCallbackNumber : array[0 .. RAS_MaxCallbackNumber + 1 -1] of CHAR;
szUserName : array[0 .. UNLEN + 1 -1] of CHAR;
szPassword : array[0 .. PWLEN + 1 -1] of CHAR;
szDomain : array[0 .. DNLEN + 1 -1] of CHAR;
//#if (WINVER >= 0x401)
// dwSubEntry : DWORD;
// dwCallbackId : DWORD;
//#endif
end;
LPRASDIALPARAMS = ^RASDIALPARAMS;

RASPPPIP = record
dwSize : DWORD;
dwError : DWORD;
szIpAddress : array[0 .. RAS_MaxIpAddress + 1 -1] of CHAR;
end;

RASPPPIPX = record
dwSize : DWORD;
dwError : DWORD;
szIpxAddress : array[0 .. RAS_MaxIpxAddress + 1 -1] of CHAR;
end;

RASPPPNBF = record
dwSize : DWORD;
dwError : DWORD;
dwNetBiosError : DWORD;
szNetBiosError : array[0 .. NETBIOS_NAME_LEN + 1 -1] of CHAR;
szWorkstationName : array[0 .. NETBIOS_NAME_LEN + 1 -1] of CHAR;
bLana : BYTE;
end;

{Ras function prototypes }

function RasEnumEntries (
reserved : LPTSTR; // reserved, must be NULL
lpszPhonebook : LPTSTR; // pointer to full path and filename of phonebook file
lprasentryname : LPRASENTRYNAME; // buffer to receive phonebook entries
lpcb : LPDWORD; // size in bytes of buffer
lpcEntries : LPDWORD // number of entries written to buffer
) : DWORD; stdcall;

function RasGetEntryDialParams(
lpszPhonebook : LPTSTR; // pointer to the full path and filename of the phonebook file
lprasdialparams : LPRASDIALPARAMS; // pointer to a structure that receives the connection parameters
lpfPassword : LPBOOL // indicates whether the user's password was retrieved
) : DWORD; stdcall;

function RasDial(
lpRasDialExtensions : LPRASDIALEXTENSIONS; // pointer to function extensions data
lpszPhonebook : LPTSTR; // pointer to full path and filename of phonebook file
lpRasDialParams : LPRASDIALPARAMS; // pointer to calling parameters data
dwNotifierType : DWORD; // specifies type of RasDial event handler
lpvNotifier : LPVOID; // specifies a handler for RasDial events
lphRasConn : LPHRASCONN // pointer to variable to receive connection handle
) : DWORD; stdcall;

function RasHangUp(
hrasconn : HRASCONN // handle to the RAS connection to hang up
) : DWORD; stdcall;

function RasEditPhonebookEntry(
hwnd : HWND; // handle to the parent window of the dialog box
lpszPhonebook : LPTSTR; // pointer to the full path and filename of the phonebook file
lpszEntryName : LPTSTR // pointer to the phonebook entry name
) : DWORD; stdcall;

function RasCreatePhonebookEntry(
hwnd : HWND; // handle to the parent window of the dialog box
lpszPhonebook :LPTSTR // pointer to the full path and filename of the phonebook file
) : DWORD; stdcall;

function RasGetConnectStatus(
hrasconn : HRASCONN; // handle to RAS connection of interest
lprasconnstatus : LPRASCONNSTATUS // buffer to receive status data
) : DWORD; stdcall;

function RasEnumConnections(
lprasconn : LPRASCONN; // buffer to receive connections data
lpcb : LPDWORD; // size in bytes of buffer
lpcConnections : LPDWORD // number of connections written to buffer
) : DWORD; stdcall;

function RasGetErrorString(
uErrorValue : UINT; // error to get string for
lpszErrorString : LPTSTR; // buffer to hold error string
cBufSize : DWORD // size, in characters, of buffer
) : DWORD; stdcall;

function RasGetProjectionInfo(
hrasconn : HRASCONN; // handle that specifies remote access connection of interest
rasprojection : RASPROJECTION; // specifies type of projection information to obtain
lpprojection : LPVOID; // points to buffer that receives projection information
lpcb : LPDWORD // points to variable that specifies buffer size
) : DWORD; stdcall;

function RasSetEntryDialParams(
lpszPhonebook : LPTSTR; // pointer to the full path and filename of the phonebook file
lprasdialparams : LPRASDIALPARAMS; // pointer to a structure with the new connection parameters
fRemovePassword : BOOL // indicates whether to remove password from entry's parameters
) : DWORD; stdcall;

function ConnStatusToStr(i : Integer) : string; // Returns Status string based on integer value

implementation

{ Externals from rasapi32.dll }
const
rasapi32 = 'rasapi32.dll';

function RasEnumEntries; external rasapi32 name 'RasEnumEntriesA';
function RasGetEntryDialParams; external rasapi32 name 'RasGetEntryDialParamsA';
function RasDial; external rasapi32 name 'RasDialA';
function RasHangUp; external rasapi32 name 'RasHangUpA';
function RasEditPhonebookEntry; external rasapi32 name 'RasEditPhonebookEntryA';
function RasCreatePhonebookEntry; external rasapi32 name 'RasCreatePhonebookEntryA';
function RasGetConnectStatus; external rasapi32 name 'RasGetConnectStatusA';
function RasEnumConnections; external rasapi32 name 'RasEnumConnectionsA';
function RasGetErrorString; external rasapi32 name 'RasGetErrorStringA';
function RasGetProjectionInfo; external rasapi32 name 'RasGetProjectionInfoA';
function RasSetEntryDialParams; external rasapi32 name 'RasSetEntryDialParamsA';


function ConnStatusToStr(i : Integer) : string; // Returns Status string based on integer value
var
RetValue : string;
begin
RetValue := '';
case i of
0 : RetValue := 'Device is ready.';
1 : RetValue := 'Device is busy.';
2 : RetValue := 'Connecting device.';
5 : RetValue := 'Authenticating.';
14 : RetValue := 'Authenticated.';
19 : RetValue := 'Starting authentication.';
21 : RetValue := 'Logging to network.';
8192:RetValue := 'Connected.';
8193:RetValue := 'Disconnected.';
else RetValue := '';
end; //case
ConnStatusToStr := RetValue;
end;

end.
如果你是外猫的话,就应该很简单了,我在win2000,winxp下都可以用at指令集控制的很好。
 
to plf22:
是不是内猫最好用TAPI?
此外,你的代码好像不全。
 
我也想知道
借宝地请问一个问题,
我有一个外猫,直接拨号不行,要在windows中先,"拨号",“检测一下”外猫,才可以拨号
成功。好象是猫里面一个继电器发出“嗒”的一声后,再拨号才可以,因此想请教windows
中的检测猫用了那些指令,我好自己写一个小东西开机时自动运行就可以直接拨号了,谢谢。
分可以另外加的啦,200够不够?不够您说话!![:D]
 
程序中实现AT命令是需要有延时等待的,如命令“AT”#$0D#$0A后应检测到“OK”才算成
功(ATV1时是“0”),数据通信切换到命令模式是“+++”不需要回车换行,然后跟断开
命令“ATH”#$0D#$0A。实际使用中用“ATE0”抑制回显“ATQ0”返回结果码成功率更高
,如果MODEM专用不妨把配置存盘“AT&amp;W”。
我所用过的外猫、无线猫、笔记本上的内猫,对于标准AT命令支持没有太大区别,如果你
的命令在超级终端里始终成功那就是程序的问题,也许是缺少必要的延时和错误判断。

To plf22:
“ATS0=1”是一次振铃后自动应答。RAS函数也是内部实现AT命令,然后加入验证并封装了
PPP协议。对MODEM的控制还是AT命令,只是传输数据封装格式不同了。
 
非常感谢各位对该论题的热情参与,在交流经验的同时,也得到了提高。
现在我对大富翁论坛投入的热情越来越高,这里已经形成了一种氛围,
一种每个人都积极参与进来的氛围。不怕解决不了,只怕没有人提出来。

 
多人接受答案了。
 
后退
顶部