【问题标题】:AT Command Works, But no responseAT 命令有效,但没有响应
【发布时间】:2017-03-20 09:40:09
【问题描述】:

我尝试通过打开串行端口连接来发送 AT 命令,而我的目标是发送短信。我能够做到这一点并且消息已发送出去,这表明 WriteLine() 方法已成功完成。但是,我似乎无法在接收缓冲区中得到任何响应。我通过查看 stackoverflow 上的一些答案打开了 echo。

但还是没有反应。我尝试使用 Thread.Sleep() 以及使用处理程序 p_DataReceived 来等待。仍然没有回应。

一个例子是简单的“AT”命令,它的响应应该是“ok”。但是根本没有响应(即 BytesToRead 属性大小为 0)

我正在尝试使用 D-Link 的 dwm222 4G LTE USB 适配器

任何指针将不胜感激!

    private void button_Click(object sender, RoutedEventArgs e)
    {



        mySerialPort = new SerialPort("COM15");
        mySerialPort.BaudRate = 9600;
        mySerialPort.Parity = Parity.None;
        mySerialPort.StopBits = StopBits.One;
        mySerialPort.DataBits = 8;

        mySerialPort.Handshake = Handshake.None;
        mySerialPort.NewLine = Environment.NewLine;

        mySerialPort.DataReceived += new SerialDataReceivedEventHandler(p_DataReceived);
        mySerialPort.Open();
        mySerialPort.DiscardInBuffer();
        mySerialPort.DiscardOutBuffer();


        mySerialPort.WriteLine("ATE1"); //turn on echo


        mySerialPort.WriteLine("AT"); //test response


        Thread.Sleep(3000);
        string responseSTR = mySerialPort.ReadLine();

        if (responseSTR.Contains("OK"))  //empty string
        {

            MessageBox.Show(responseSTR);
         }

        this.SendSms("+XXXXXXXXXXXXXXXXXXX", "Hello From C#");

        mySerialPort.Close();

    }

    public void p_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        string s = (sender as SerialPort).ReadExisting();
        buff += s;
        MessageBox.Show(buff);
    }

   void SendSms(string destination, string text)
    { ........}

【问题讨论】:

  • 您的活动正在触发吗?并且消息框显示为空?
  • 未触发事件且responseSTR为空,即responseSTR=""。
  • 另一个问题:你能尝试不同的“mySerialPort.NewLine =”设置吗?因为 "Environment.NewLine" 在 Windows (CR +LF) 上是 "\r\n"。也许你的调制解调器只用“CR”回答。值得一试: mySerialPort.NewLine = "\r" ,或者 C# 中的任何正确代码。
  • (实际上,如果您在 COM15 上使用我们的 Docklight.de 工具发送 AT 命令并检查响应,您可以发现“行尾”行为。这是显示的基本示例之一Docklight 欢迎屏幕。免费评估就足够了。)
  • 感谢 Oliver,抱歉我的回复晚了,我让它与“\r\n”组合一起工作。猜猜我的调制解调器接受了。

标签: c# serial-port usb at-command modem


【解决方案1】:

我认为你应该每次都丢弃缓冲区,这样你应该得到一个新的传入数据试试我在你的事件处理程序中修改的代码

public void p_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        string s = mySerialPort.ReadExisting();
        buff += s;
        mySerialPort.DiscardInBuffer();
        mySerialPort.DiscardOutBuffer();
        MessageBox.Show(buff);
    }

【讨论】:

  • 谢谢 zain,将使用它来清除缓冲区,我的主要问题是缓冲区大小为 0,即 BytestoRead 为 0。我刚刚发现启用 DTR 和 RTS 是解决方案。
【解决方案2】:

启用 DTR 和 RTS 会填满串口对象的缓冲区。

        mySerialPort = new SerialPort("COM17");
        mySerialPort.BaudRate = 9600;
        mySerialPort.Parity = Parity.None;
        mySerialPort.StopBits = StopBits.One;
        mySerialPort.DataBits = 8;

        mySerialPort.Handshake = Handshake.None;
        mySerialPort.NewLine = Environment.NewLine;

        mySerialPort.DataReceived += new SerialDataReceivedEventHandler(p_DataReceived);

        mySerialPort.Open();
        mySerialPort.DiscardInBuffer();
        mySerialPort.DiscardOutBuffer();
        mySerialPort.DtrEnable = true;    //this solved my problem
        mySerialPort.RtsEnable = true;    //this solved my problem

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    • 2018-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多