C# 在调制解调器启动时执行AT命令时出现的问题
我正在开发一个应用程序,将读写数据到gsm调制解调器。当我关闭调制解调器并再次打开时,启动时我需要发送at命令,以便调制解调器自动设置为端口的给定设置。当我在hyper terminal中发出此命令时,它不会显示,但会将该命令发送到调制解调器。调制解调器将自身设置为我为超级终端端口设置提供的设置。从那时起,我可以发送其余的命令。但在我的应用程序中,我无法发送first AT命令,所以我通过超级终端手动执行。为什么我的应用程序中没有出现这种情况?我还尝试使用button click发送此命令,但仍然没有在端口上执行C# 在调制解调器启动时执行AT命令时出现的问题,c#,modem,at-command,C#,Modem,At Command,我正在开发一个应用程序,将读写数据到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)
- 等待确定、错误或命令特定的响应代码。
注意:即使使用同一命令,不同的调制解调器也可能使用不同的响应代码 - 发出下一个命令等
- 问题解决了。将来可能会帮助一些人,这就是我所做的
在建立连接时,我将这两行设置添加到了我的端口,我之前没有给出这两行设置
port.DiscardOutBuffer();
port.DiscardInBuffer();
但是我不知道为什么添加这些设置会产生影响并解决了我的问题,但它起到了作用:)如果是port.Write(),那么最后需要输入。但由于它是Port.WriteLine(),因此不需要通过ENTER。我试着毫不迟延地连续发出命令,但他们不工作,这可能不是一个问题,然后…但我有一种感觉,这不是延迟,这是你的问题的原因…尝试只发送一个命令,看看它是否工作,例如ATDT命令拨一个号码…或者把断点放在你的每一个端口上。写线,手动模拟延迟,并检查…如果它是真的是一个延迟问题,那么我想添加延迟应该不难。我只发送了一个命令,比如AT+CMGF=1,并且使用了一个断点。正在执行该命令,但不知道为什么该命令未在端口执行。证据是我在超级终端中检查了它,设置没有变化。因为thread.sleep()在所有这些命令之前执行,然后所有这些命令都连续执行,没有时间延迟。您的GSM模块的确切数量是多少,天线的阻抗应为problem@arunkumarnonascii:当我的调制解调器能够从超级终端读取第一个AT命令时,为什么它无法从我的应用程序读取它。猜测天线弹射