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

C# 在调制解调器启动时执行AT命令时出现的问题,c#,modem,at-command,C#,Modem,At Command,我正在开发一个应用程序,将读写数据到gsm调制解调器。当我关闭调制解调器并再次打开时,启动时我需要发送at命令,以便调制解调器自动设置为端口的给定设置。当我在hyper terminal中发出此命令时,它不会显示,但会将该命令发送到调制解调器。调制解调器将自身设置为我为超级终端端口设置提供的设置。从那时起,我可以发送其余的命令。但在我的应用程序中,我无法发送first AT命令,所以我通过超级终端手动执行。为什么我的应用程序中没有出现这种情况?我还尝试使用button click发送此命令,但仍

我正在开发一个应用程序,将读写数据到gsm调制解调器。当我关闭调制解调器并再次打开时,启动时我需要发送at命令,以便调制解调器自动设置为端口的给定设置。当我在hyper terminal中发出此命令时,它不会显示,但会将该命令发送到调制解调器。调制解调器将自身设置为我为超级终端端口设置提供的设置。从那时起,我可以发送其余的命令。但在我的应用程序中,我无法发送first AT命令,所以我通过超级终端手动执行。为什么我的应用程序中没有出现这种情况?我还尝试使用button click发送此命令,但仍然没有在端口上执行

        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;

为什么命令之间需要时间间隔…很久以前,我一直致力于将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()); 

查看更改此选项是否有帮助…

需要检查的两件事,波特率和回音

SerialPort类默认使用9600

通常,调制解调器处于自动音频模式,当向其发送“AT”命令时,它将根据COM端口链路的波特率自行调整。这不太可能,但您的调制解调器可能以固定的波特率工作,无法调整…因此,请检查您在超级终端中使用的波特率,并使用相同的波特率

回显-要查看命令是否已发送(调制解调器是否响应),我认为您需要在调制解调器中打开回显,即您发送到调制解调器并接收到的任何字符都将被发送/回显给您

(您也可以在超级终端中打开本地回音…但您不想这样做…您想真正知道调制解调器看到了您的角色)

如果您无法让调制解调器回显您发送的内容,则说明您配置串行端口链路的方式有问题(即使用错误的流量控制握手/奇偶校验等,或未提升流量控制状态行)。

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

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

因此,看起来可能是该调制解调器的eeprom默认设置为不回显(即,有人更改了回显并执行了a&W0),或者HyperTerminal已配置为在调制解调器打开端口时将其关闭,即具有AT“初始化字符串”!)。您应该检查该端口的初始化字符串是什么,并在使用SerialPort类时复制/使用它

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

请先尝试此命令:

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

    (注意,如果您刚刚打开调制解调器,则不需要使用&F,因为此时调制解调器应处于出厂设置……但这样做没有害处。E1打开回音)

  • 等待OK响应代码

    如果使用HyperTerminal,那么如果您正在键入命令,您只需直观地等待响应代码返回(如果使用脚本发送命令,则让脚本等待),或者如果在代码中发送AT命令,则您的代码需要捕获响应并相应地执行操作

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

  • 等待确定、错误或命令特定的响应代码。

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

  • 发出下一个命令等

这里有一些参考链接,例如显示味道或AT命令,以及一些超级终端参考:


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

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

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

      但是我不知道为什么添加这些设置会产生影响并解决了我的问题,但它起到了作用:)

      如果是port.Write(),那么最后需要输入。但由于它是Port.WriteLine(),因此不需要通过ENTER。我试着毫不迟延地连续发出命令,但他们不工作,这可能不是一个问题,然后…但我有一种感觉,这不是延迟,这是你的问题的原因…尝试只发送一个命令,看看它是否工作,例如ATDT命令拨一个号码…或者把断点放在你的每一个端口上。写线,手动模拟延迟,并检查…如果它是真的是一个延迟问题,那么我想添加延迟应该不难。我只发送了一个命令,比如AT+CMGF=1,并且使用了一个断点。正在执行该命令,但不知道为什么该命令未在端口执行。证据是我在超级终端中检查了它,设置没有变化。因为thread.sleep()在所有这些命令之前执行,然后所有这些命令都连续执行,没有时间延迟。您的GSM模块的确切数量是多少,天线的阻抗应为problem@arunkumarnonascii:当我的调制解调器能够从超级终端读取第一个AT命令时,为什么它无法从我的应用程序读取它。猜测天线弹射