Как я использую dataReceived событие Объекта порта SerialPort в C#?

19
задан Community 23 May 2017 в 12:10
поделиться

4 ответа

Прежде всего я рекомендую использовать следующего конструктора вместо того, который Вы в настоящее время используете:

new SerialPort("COM10", 115200, Parity.None, 8, StopBits.One);

Затем, действительно необходимо удалить этот код:

// Wait 10 Seconds for data...
for (int i = 0; i < 1000; i++)
{
    Thread.Sleep(10);
    Console.WriteLine(sp.Read(buf,0,bufSize)); //prints data directly to the Console
}

И вместо этого просто цикл, пока пользователь не нажимает клавишу или что-то, как так:

namespace serialPortCollection
{   class Program
    {
        static void Main(string[] args)
        {
            SerialPort sp = new SerialPort("COM10", 115200);
            sp.DataReceived += port_OnReceiveDatazz; // Add DataReceived Event Handler

            sp.Open();
            sp.WriteLine("$"); //Command to start Data Stream

            Console.ReadLine();

            sp.WriteLine("!"); //Stop Data Stream Command
            sp.Close();
        }

       // My Event Handler Method
        private static void port_OnReceiveDatazz(object sender, 
                                   SerialDataReceivedEventArgs e)
        {
            SerialPort spL = (SerialPort) sender;
            byte[] buf = new byte[spL.BytesToRead];
            Console.WriteLine("DATA RECEIVED!");
            spL.Read(buf, 0, buf.Length);
            foreach (Byte b in buf)
            {
                Console.Write(b.ToString());
            }
            Console.WriteLine();
        }
    }
}

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

ОБНОВЛЕНИЕ 1

<час>

я просто выполнил следующий код успешно моей машины (использующий нуль-модемный кабель между COM33 и COM34)

namespace TestApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread writeThread = new Thread(new ThreadStart(WriteThread));
            SerialPort sp = new SerialPort("COM33", 115200, Parity.None, 8, StopBits.One);
            sp.DataReceived += port_OnReceiveDatazz; // Add DataReceived Event Handler

            sp.Open();
            sp.WriteLine("$"); //Command to start Data Stream

            writeThread.Start();

            Console.ReadLine();

            sp.WriteLine("!"); //Stop Data Stream Command
            sp.Close();
        }

        private static void port_OnReceiveDatazz(object sender, 
                                   SerialDataReceivedEventArgs e)
        {
            SerialPort spL = (SerialPort) sender;
            byte[] buf = new byte[spL.BytesToRead];
            Console.WriteLine("DATA RECEIVED!");
            spL.Read(buf, 0, buf.Length);
            foreach (Byte b in buf)
            {
                Console.Write(b.ToString() + " ");
            }
            Console.WriteLine();
        }

        private static void WriteThread()
        {
            SerialPort sp2 = new SerialPort("COM34", 115200, Parity.None, 8, StopBits.One);
            sp2.Open();
            byte[] buf = new byte[100];
            for (byte i = 0; i < 100; i++)
            {
                buf[i] = i;
            }
            sp2.Write(buf, 0, buf.Length);
            sp2.Close();
        }
    }
}

ОБНОВЛЕНИЕ 2

<час>

, Учитывая весь трафик в этом вопросе недавно. Я начинаю подозревать, что или Ваш последовательный порт не настроен правильно, или что устройство не отвечает.

я настоятельно рекомендую, чтобы Вы попытались связаться с устройством с помощью некоторых других средств (я часто использую гипертерминал). Можно затем играть вокруг со всеми этими настройками (скорость передачи, четность, биты данных, стоповые биты, управление потоком), пока Вы не находите набор, который работает. Документация для устройства должна также указать эти настройки. После того как я понял их, я удостоверюсь, что мой SerialPort.NET настроен правильно для использования тех настроек.

Некоторые подсказки относительно конфигурирования последовательного порта:

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

new SerialPort("COM10", 115200, Parity.None, 8, StopBits.One);

также важно, чтобы Вы установили SerialPort.NET для использования того же управления потоком в качестве устройства (как другие люди заявили ранее). Можно найти больше информации здесь:

http://www.lammertbies.nl/comm/info/RS-232_flow_control.html

8
ответ дан 30 November 2019 в 04:12
поделиться

я думаю, что Вашей проблемой является строка: **

SP. DataReceived + = port_OnReceiveDatazz;

не был Должен это быть:

SP. DataReceived + = новый SerialDataReceivedEventHandler (port_OnReceiveDatazz);

** Nevermind, синтаксис прекрасен (не понял ярлык в то время, когда я первоначально ответил на этот вопрос).

я также видел предложения, чтобы Вы включили следующие опции для своего последовательного порта:

sp.DtrEnable = true;    // Data-terminal-ready
sp.RtsEnable = true;    // Request-to-send

Вам, вероятно, также придется установить квитирование на RequestToSend (через перечисление квитирования).

<час>

ОБНОВЛЕНИЕ:

Найденный предложением, которое говорит, необходимо открыть порт сначала, затем присвоить обработчик событий. Возможно, это - ошибка?

Так вместо этого:

sp.DataReceived += new SerialDataReceivedEventHandler (port_OnReceiveDatazz);
sp.Open();

Делают это:

sp.Open();
sp.DataReceived += new SerialDataReceivedEventHandler (port_OnReceiveDatazz);

Сообщенный мне, как это идет.

12
ответ дан 30 November 2019 в 04:12
поделиться

Между прочим, можно использовать следующий код в Вас обработчик событий:

switch(e.EventType)
{
  case SerialData.Chars:
  {
    // means you receives something
    break;
  }
  case SerialData.Eof:
  {
    // means receiving ended
    break;
  }
}
3
ответ дан 30 November 2019 в 04:12
поделиться

У меня была такая же проблема с модемом, который раньше работал, а потом однажды просто перестал генерировать событие DataReceived.

В моем случае решение, очень случайное, состояло в том, чтобы включить RTS, например,

sp.RtsEnable = true;

Не знаю, почему это сработало с этим конкретным комплектом (на самом деле, не для связного), и почему оно сработало, а затем остановилось, но однажды это может помочь кому-то другому, поэтому просто разместите его на всякий случай. ..

4
ответ дан 30 November 2019 в 04:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: