在调制解调器启动时执行AT命令的问题

时间:2012-07-20 04:12:04

标签: c# modem at-command

我正在开发一个应用程序,它将数据读写到gsm调制解调器。当我关闭调制解调器并再次打开时,在启动时我需要发送一个AT命令,以便该调制解调器自动设置为给定的端口设置。当我在超级终端中给出此命令时,它不会显示但命令被发送到调制解调器。并且调制解调器将自己设置为我为超级终端设置提供的设置。从那时起,我可以发送其余的命令。但在我的应用程序中,我无法发送第一个AT命令,所以我通过超级终端手动执行它。为什么这不是通过我的申请发生的?我也尝试使用按钮单击发送此命令,但仍未在端口上执行。

        port.Open();
        port.DtrEnable = true;
        port.RtsEnable = true;

        if (port != null)
        {
            btn_connect.Enabled = false;
            btn_disconnect.Enabled = true;
            port.WriteLine("AT");

            port.WriteLine("AT+CLIP=1");

            port.WriteLine("AT+CMGF=1");

            con_status.Text = "Connected at " + cboPortName.Text;
        }

我在我的应用程序中提供的端口设置是:

            port.PortName = cboPortName.Text;
            port.BaudRate = Convert.ToInt32(this.cboBaudRate.Text); //9600
            port.DataBits = Convert.ToInt32(this.cboDataBits.Text); //8
            port.ReadTimeout = Convert.ToInt32(this.txtReadTimeOut.Text); //300
            port.WriteTimeout = Convert.ToInt32(this.txtWriteTimeOut.Text); //300
            port.StopBits = StopBits.One; //1
            port.Parity = Parity.None; // None
            port.Encoding = Encoding.GetEncoding("iso-8859-1"); 
            port.Open();
            port.DtrEnable = true;
            port.RtsEnable = true;

3 个答案:

答案 0 :(得分:2)

要检查的两件事,波特率和回声。

SerialPort类默认使用9600。

通常情况下,调制解调器处于AutoBaud模式,并且当" AT"时,它将自身调整为COM端口链路的波特率。命令发送给它。它不太可能,但您的调制解调器可能在固定的BaudRate下运行并且不会调整...因此检查您在HyperTerminal中使用的BaudRate并使用相同的BaudRate。

回声 - 看到命令被发送(并且您的调制解调器正在响应),我相信您需要在调制解调器中打开回显,即您发送到调制解调器的任何字符,它接收它将被发送/回显给你。

(你可以选择在HyperTerminal中打开本地回声...但你不想要......你真的知道调制解调器看到了你的角色)

如果您无法让调制解调器回显您发送的内容,那么您在配置串口链接时遇到问题(即使用错误的流量控制握手/奇偶校验等,或者没有提高流量控制状态线。)

假设您的调制解调器配置为使用RTS / CTS流控制,您是否尝试过:

port.Handshake = HandShake.RequestToSend? (即硬件控制线流量控制)。

因此,看起来可能是该调制解调器的eeprom默认值不是回显(即有人改变了回声并完成了& W0)或者HyperTerminal已被配置为在调制解调器上将其关闭打开它的端口,即它有一个AT"初始化字符串" !)。您应该检查该端口的Initialization String是什么,并在使用SerialPort类时复制它/使用它。

另一个最佳实践是在发出下一个AT命令之前等待响应代码 - 延迟是一种方法,但不是最佳实践,因为某些命令可能需要不同的时间来执行....调制解调器不喜欢接收另一个命令,而忙碌"。

尝试此命令1st:

  • AT& FE1(重置为出厂设置并打开回声)

    (注意如果您刚刚打开调制解调器,则不需要& F,因为它应该在出厂时设置无论如何......但是这样做没有什么坏处.E1会在回声中发出回声)。

  • 等待确定的响应代码

    如果使用超级终端,那么只要您输入命令就可以直观地等待响应代码返回(或让您的脚本等待,如果使用脚本发送命令),或者如果在代码中发送AT命令,则代码需要捕获响应并采取相应的行动。

  • 发出下一个命令(例如你的AT + CLIP = 1)

  • 等待OK,ERROR或命令特定的响应代码。

    注意:即使使用相同的命令,不同的调制解调器也可能使用不同的响应代码。

  • 发出下一个命令等,等等

以下是一些可能派上用场的链接,例如show flavors或AT命令,以及一些HyperTerminal引用。:

答案 1 :(得分:1)

问题解决了。未来可能会帮助一些人,这就是我所做的。

我在连接建立时将这两行设置添加到我的端口,我之前给出了它。

            port.DiscardOutBuffer(); 
            port.DiscardInBuffer();

但我不知道为什么添加这些设置会产生差异并解决我的问题,但它有效:)

答案 2 :(得分:0)

为什么你需要命令之间的时间间隔...很久以前我把AT命令传递给调制解调器,我记得连续传递了诸如“AT + FCLASS = 8”“ATS0 = 1”“AT + VTX”之类的命令在两者之间给予任何延迟,你确定这个延迟的事情吗?

也只是

 port.WriteLine("AT+CLIP=1"); 

可能不起作用虽然我不确定,我现在没有调制解调器尝试但我认为我们曾经在AT命令之后传递一个ENTER键所以命令应该是

 port.WriteLine("AT+CLIP=1" + System.Convert.ToChar(13).ToString()); 

看看改变这有助于......