为什么往串口发AT指令,Modem不响应?(100分)

  • 主题发起人 主题发起人 iamyizhi
  • 开始时间 开始时间
I

iamyizhi

Unregistered / Unconfirmed
GUEST, unregistred user!
我用win32API的createfile成功的打开了com2,DCB也设置好了,
用setcommstate函数将DCB写入后Modem上的TR(终端就绪)就亮了.
然后用writefile往串口写'at'<cr>,
readfile读到的数按理说应是'ok',但我却收到'at'.
我试着用Modem正常拨号的日志文件中at初始化指令写入com2,
同样,我写什么,收到也是那些.并且我不管往com2写什么,
都收到写入的数据.包括'atd163'.但是Modem就是不听见拨号音.
(可以排除Modem的speaker损坏,因可以正常拨号)
我使用的是Diamond SupraExpress56 e(老版本,k56flex协议).
请大虾们帮帮忙!
谢谢!
mail to iamyizhi@263.net
thank you!
 
你没有发回车换行符吧。
 
是应该先收到写入的数据
然后才是返回的数据
 
我试过往com2发‘atd163<cr><lf>'后,同样Modem没有反应,
只是send和receive闪了一下。这是什么原因?
 

我试过往com2发‘atd163'+#13+#10后,同样Modem没有反应,
只是send和receive闪了一下。这是什么原因?
 
wrench:
你说是应该先收到写入的数据
然后才是返回的数据
那两个数据之间是什么格式分开的?
 
好象没有什么格式区分
反正先返回的肯定是写入的数据

你可以试试用modem接电话
电话铃响时
缓冲区里有"RING"的字符
看看你的接收对不对
 
不好意思,又发现了一个问题:
不管往com2写什么数据,readfile都原封不动读出写入的数据.
AT指令没有对Modem起任何的作用.
Help me!
谁有现成的modem通信的程序mail一份给我号吗?iamyizhi@263.net
 
在dos下先试验echo atdt9999 >com2
 
你发的是"atd163'#13#10
因该是'atdt163'#13#10吧
 
假设串口正常、MODEM正常
1)重新检查COM口初始化代码。
(可能是这个原因:你设成回路方式, 开放发送与接收中断)
2)送COM(MODEM)一个ATE0(关闭回显)
3)发送检测命令"AT#10"(如果返回AT而不是OK,再回头看1))
 
先接收你发出去的命令(这个是echo,都有的)
等待再接收“ok”

最好使用 overlapped 方式读写
 
COM口初始化代码如下:
H:= createfile('com2',generic_read or generic_write,0,
nil,open_existing,FILE_ATTRIBUTE_NORMAL,0);
getcommstate(H,myDCB);
my.BaudRate:=CBR_115200;
myDCB.DCBlength:=SizeOf(Tdcb);
myDCB.Flags:=12305;
myDCB.wReserved:=0;
myDCB.XonLim:=65535;
myDCB.XoffLim:=65535;
myDCB.ByteSize:=8;
myDCB.parity:=0;
myDCB.StopBits:=0;
myDCB.XonChar:=#17;
myDCB.XoffChar:=#19;
myDCB.ErrorChar:=#0;
myDCB.EofChar:=#0;
myDCB.EvtChar:=#0;
myDCB.wReserved1:=65;
setcommstate(h,myDCB);
另一个问题是:clearcommerror有什么作用?
在setcommstate后,其COMSTAT成员为
([fRlsHold,fXoffsent..fEof],Reserved,50,188)
使用了clearcommerror之后,全为0.这是为什么?
 
1) myDCB.BaudRate:=CBR_9600; {试试9600,或更低}
2)myDCB.fBinary:=0; {不用二进制方式,二进制方式不检查EOF}
3) myDCB.XonLim:=65535; {缓冲区至少有65535个空,则允许发送}
4) myDCB.XoffLim:=65535; {缓冲区最多有65535个接收字节,则阻塞发送}
{不知道就别瞎设,你这是什么意思}
5) myDCB.StopBits:=1; {1位停止位,没有停止位, 拿什么干活}
6)myDCB.XonChar:=#17;
7)myDCB.XoffChar:=#19; {XON/XOFF你就别管它了}
8) myDCB.EofChar:=#10; {结束符为换行}
9) myDCB.wReserved1:=65 ?? {保留位,没用}
建议你先搞清这个结构各个Field的意思,根据你应用的需要再设置。
 
但是我将myDCB.stopbits:=1之后,用setcommstate老是置com口不成功。
 
说来好笑,我的writefile中的outbuffer置的是lpstr类型,所以我把outbuffer
赋outbuffer:='ATDT163'+#13+#10;拨号老是不成功。然后我用wrench的方案
将outbuffer置为array [0..100] of byte后,将outbuffer一个一个的置字符串
的ASCII值,一writefile之后,modem就响应了。
还要多谢各位大虾的指点了。
 
多人接受答案了。
 

Similar threads

I
回复
0
查看
679
import
I
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部