0

我正在尝试使用连接到 COM 端口的 GSM 调制解调器发送和接收数据。这是我的代码的重要部分:

        SerialPort sp = new SerialPort();
        sp.PortName = "COM1";
        sp.BaudRate = 9600;
        sp.DataBits = 8;
        sp.Parity = Parity.None;
        sp.StopBits = StopBits.One;
        sp.ReadTimeout = 5000;

                sp.Open();
                if (sp.IsOpen)
                {
                    Console.WriteLine(sp.PortName + " is open");

                    Console.WriteLine("Trying to write data");
                    sp.Write("AT");
                    Console.WriteLine("Data has been sent");

                    Console.WriteLine("Trying to read data");
                    char[] read = new char[200];
                    sp.Read(read, 0, 20);
                    foreach (char chr in read)
                    {
                        Console.Write(chr);
                    }
                    Console.WriteLine();

                }

我没有收到任何错误,但 GSM 设备只是将我发给他的任何东西都发回给我。在这种情况下,AT。如果我发送“BOO”,他会发回“BOO”(虽然有时我只收到第一个字母,但我认为这是因为我读取数据的方式,应该在单独的线程中不?我可以轻松做到这一点之后)。

当我给他发“AT”时,我期待他给我发回“OK”。

无论我发送给他什么,设备都会将我发送回去,这有什么解释。我在想可能是端口通信设置不正确,我实际上没有到达设备,只是将其发送回给自己?

4

1 回答 1

2

你和 PuTTY 沟通过吗?您应该首先尝试从终端应用程序(PuTTY 下载链接)发送和接收数据以排除调制解调器本身的任何问题,然后继续编写应用程序进行通信。

至于代码,您应该使用 sp.WriteLine 而不是 sp.Write... 调制解调器需要看到换行符才能知道您的命令已完成。您可以使用 sp.NewLine 设置换行符,使其与调制解调器需要查看的内容相匹配。或者,您可以将 '\r' 附加到您正在编写的任何 AT 命令中。

我用过的 GSM 调制解调器默认都开启了回显,你可以通过发送 'ATE0' 来禁用回显。当 echo 打开时,调制解调器将首先回显您发送的任何内容,然后发送它的响应。由于您读取数据的方式,我怀疑您看到的是回声而不是响应。试试这个方法来读取数据:

//add this just before opening the port
sp.DataReceived += new 
    SerialDataReceivedEventHandler(port_DataReceived);

在设置端口的方法之外添加以下方法:

private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
  Console.WriteLine(port.ReadExisting());
}
于 2013-03-28T14:02:15.197 回答