Страницы

Поиск по вопросам

суббота, 4 января 2020 г.

Как правильно открыть COM порт

#c_sharp #com_порт


На столе лежит Gsm модуль RX 101 от "Телеофис", хочу пообщаться с ним из кода, но
не получается.

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

А теперь что происходит когда я пытаюсь обратиться к модулю из кода - ничего!
То есть лампочка RX мигает, но ответа нет. При чем после закрытия программы которая
успешно общалась с модулем, я могу из кода обращаться и модуль отвечает. Вот такая
магия. Я полагаю что программы открывают порт с какими-то параметрами которые я не
указываю в коде, но понятия не имею какие.

Вот код который пытается связаться с модулем:

using System;
using System.IO.Ports;
using System.Threading;

namespace ConsoleApplication
{
    internal class Program
    {
        private static void Main( string[] args )
        {
            var comPort = new SerialPort( "COM4", 115200, Parity.None, 8, StopBits.One );

            comPort.Open();

            if ( !comPort.IsOpen ) throw new Exception();

            comPort.DataReceived += ComPortOnDataReceived; //событие, кстати, тоже
не генерируется

            comPort.WriteLine( "AT \r\n" );

            Thread.Sleep( 3000 );

            var response = comPort.ReadExisting();

            Console.WriteLine( string.IsNullOrWhiteSpace( response ) ? "null" : response );

            comPort.DataReceived -= ComPortOnDataReceived;
            comPort.Close();
        }

        private static void ComPortOnDataReceived( object sender,
            SerialDataReceivedEventArgs serialDataReceivedEventArgs )
        {
            Console.WriteLine( "received" );
        }
    }
}

    


Ответы

Ответ 1



В данном случае необходимо установить кроме основных параметров инициализации СОМ порта еще и дополнительные comPort.Handshake = Handshake.XOnXOff; так как по умолчанию этот параметр установлен в None. Более детально про этот параметр можно посмотреть здесь. Так же иногда могут возникать ситуации когда устройство долго отвечает на запрос(дольше стандартных значений). В таких случаях нужно изменять время ответа (искать в документации или экспериментировать с увеличением значений) comPort.ReadTimeout = 500; Я встречал устройства у которых время ответа по умолчанию равнялось 10с. А вообще, в подобных ситуациях, когда не получается опросить устройство по СОМ порту и у вас есть родная программа опроса, запускать снифер СОМ-порта и смотреть какие основные и дополнительные параметры порта устанавливает эта программа.

Комментариев нет:

Отправить комментарий