我正在开发一个应用程序,它将数据读写到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;
答案 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());
看看改变这有助于......