3

我正在开发一个应用程序,它将读取和写入数据到 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;
4

3 回答 3

2

需要检查 2 件事,波特率和回声。

SerialPort 类默认使用 9600。

通常调制解调器处于 AutoBaud 模式,当向其发送“AT”命令时,它会根据 COM 端口链路的波特率自行调整。这不太可能,但是您的调制解调器可能以固定的 BaudRate 运行并且不会调整...因此检查您在 HyperTerminal 中使用的 BaudRate 并使用相同的 BaudRate。

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

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

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

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

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

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

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

第一次尝试这个命令:

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

    (请注意,如果您刚刚打开调制解调器,则不需要 &F,因为无论如何它应该处于出厂设置......但这样做没有害处。E1 转回声)。

  • 等待 OK 响应代码

    如果使用超级终端,那么如果您正在输入命令(或者如果使用脚本发送命令,则让您的脚本等待),或者如果发送 AT 命令,您只需在视觉上等待响应代码返回在代码中,您的代码需要捕获响应并采取相应措施。

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

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

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

  • 发出下一个命令等

以下是一些可能会派上用场的链接供参考,即显示风格或 AT 命令,以及一些超级终端参考:

于 2012-07-22T11:43:05.050 回答
1

问题已经解决了。将来可能会帮助某人,这就是我所做的。

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

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

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

于 2012-07-27T10:52:03.747 回答
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()); 

看看改变这个是否有帮助......

于 2012-07-20T05:07:38.040 回答