AT-команда работает, но нет ответа

Я пробовал отправлять AT-команды, открывая соединение через последовательный порт, и моей целью было отправить SMS. Мне удалось добиться этого, и сообщение было отправлено, что является признаком успешного завершения метода WriteLine(). Однако я не могу получить никакого ответа в своих приемных буферах. Я включил эхо, просмотрев некоторые ответы здесь, в stackoverflow.

Но до сих пор нет ответа. Я попытался подождать, используя Thread.Sleep(), а также с помощью обработчика p_DataReceived. Ответа до сих пор нет.

Одним из примеров может быть простая команда «AT», которая должна иметь ответ «ok». Но ответов вообще нет (т.е. размер свойства BytesToRead равен 0)

Я пытаюсь это сделать с USB-адаптером D-Link dwm222 4G LTE.

Любые указатели будут очень признательны!

    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)
    { ........}

person Prakash Ash    schedule 07.11.2016    source источник
comment
ваше мероприятие запущено? а в окне сообщений отображается ноль?   -  person Zain Ul Abidin    schedule 07.11.2016
comment
событие не инициировано, и responseSTR пуст, т. е. responseSTR=.   -  person Prakash Ash    schedule 07.11.2016
comment
Еще вопрос: можно попробовать разные настройки mySerialPort.NewLine=? Поскольку Environment.NewLine — это \r\n в Windows (CR +LF). И, возможно, ваш модем отвечает только CR. Стоит попробовать: mySerialPort.NewLine = \r или любой другой правильный код для этого в C#.   -  person Oliver Heggelbacher    schedule 07.11.2016
comment
(на самом деле вы можете узнать поведение конца строки, если используете наш инструмент Docklight.de на COM15 для отправки AT-команды и проверки ответа. Это один из основных примеров, показанных на экране приветствия Docklight. Достаточно бесплатной оценки.)   -  person Oliver Heggelbacher    schedule 07.11.2016
comment
спасибо, Оливер, извините за мой поздний ответ, я заставил его работать с комбинацией \r\n. Думаю, мой модем принимает это.   -  person Prakash Ash    schedule 20.11.2016


Ответы (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
person Prakash Ash    schedule 20.11.2016

я думаю, вы должны каждый раз сбрасывать буфер, чтобы вы могли получать свежие входящие данные, попробуйте этот код, который я изменил в вашем обработчике событий.

public void p_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        string s = mySerialPort.ReadExisting();
        buff += s;
        mySerialPort.DiscardInBuffer();
        mySerialPort.DiscardOutBuffer();
        MessageBox.Show(buff);
    }
person Zain Ul Abidin    schedule 07.11.2016
comment
спасибо, Заин, воспользуюсь этим, чтобы очистить буфер, моя основная проблема заключалась в том, что размер буфера был равен 0, т.е. BytestoRead равен 0. Я только что узнал, что включение DTR и RTS было решением. - person Prakash Ash; 20.11.2016