Обработчик событий для чтения последовательного порта никогда не срабатывает - PullRequest
0 голосов
/ 25 июня 2018

Цель:

Попытка записать строку в последовательный порт, прочитать ее, а затем распечатать на консоли

Код:

// for waiting until event is detected
private static ManualResetEvent waitHandle = new ManualResetEvent(false);

public Driver()
{
    // create new serial port
    comPort = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
    // add event handler
    comPort.DataReceived += new SerialDataReceivedEventHandler(comPort_DataReceived);  
    // configure port
    comPort.DtrEnable = true;
    comPort.RtsEnable = true;
    comPort.ReadTimeout = 3000;
    // open port          
    comPort.Open();

    // send string through port
    string command = "test \n";
    byte[] MyMessage = System.Text.Encoding.UTF8.GetBytes(command);
    comPort.Write(MyMessage, 0, MyMessage.Length);

    // wait until event is detected
    waitHandle.WaitOne();
}

private void comPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    // Write data to buffer and stop wait
    Console.WriteLine(comPort.ReadExisting());
    waitHandle.Set();
}

Проблема:

Кажется, что запись в последовательный порт работает нормально ( подтверждено с помощью монитора последовательного порта ), но «comPort_DataReceived» никогда не вызывается

Если я изменю свой код и добавлю

while(true)
{
    Console.WriteLine(comPort.ReadExisting());
}

Сразу после «comPort.Write (MyMessage, 0, MyMessage.Length);» так что я опрашиваю, а не жду обработчик события, тогда ничего не пишется

Если я попытаюсь опросить таким образом

while (true)
{
    Byte[] buf = new Byte[2048];
    comPort.Read(buf, 0, 2048);
    Console.WriteLine(buf.ToString());
}

Время ожидания истекло (System.TimeoutException: «Время ожидания истекло». ).

Я не уверен, где я иду не так / почему я не могу читать с последовательного порта

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

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

0 голосов
/ 25 июня 2018

Хорошо, из того, что я вижу, похоже, что нет устройства, прослушивающего последовательный порт.Затем, если вы записываете что-то в последовательный порт, это не означает, что те же данные будут появляться в качестве полученных данных.Эти данные outgoing data.Если вы хотите получать данные, к этому последовательному порту должно быть подключено другое устройство, которое отправляет данные в ответ на записанные вами данные.

...