Событие SerialPort DataReceived.NET, не стреляя

У меня есть тестовое приложение WPF для оценки основанной на событии коммуникации последовательного порта (по сравнению с опросом последовательного порта). Проблема состоит в том, что событие DataReceived, кажется, не стреляет вообще.

У меня есть очень простая форма WPF с TextBox для ввода данных пользователем, TextBlock для вывода и кнопкой для записи входа в последовательный порт.

Вот код:

public partial class Window1 : Window
{
    SerialPort port;

    public Window1()
    {
        InitializeComponent();

        port = new SerialPort("COM2", 9600, Parity.None, 8, StopBits.One);
        port.DataReceived +=
            new SerialDataReceivedEventHandler(port_DataReceived);  
        port.Open();
    }

    void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        Debug.Print("receiving!");
        string data = port.ReadExisting();
        Debug.Print(data);
        outputText.Text = data;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        Debug.Print("sending: " + inputText.Text);
        port.WriteLine(inputText.Text);
    }
}

Теперь, вот усложняющие факторы:

  1. Ноутбук я продолжаю работать, не имеет никаких последовательных портов, таким образом, я использую часть программного обеспечения под названием Эмулятор Виртуального последовательного порта для установки COM2. VSPE работал превосходно в прошлом, и не ясно, почему это только неправильно функционировало бы с классом SerialPort.NET, но я упоминаю это на всякий случай.

  2. Когда я нажал кнопку на своей форме для отправки данных, мое Гиперокно терминала (соединенный на COM2) показывает, что данные проходят. Да, я разъединяю Гипертерминал, когда я хочу протестировать способность своей формы считать порт.

  3. Я попытался открыть порт прежде, чем обеспечить электричеством событие. Никакое изменение.

Я прочитал другое сообщение здесь, где у кого-то еще есть подобная проблема. Ничего подобного информация не помог мне в этом случае.

Править:

Вот консольная версия (изменена из http://mark.michaelis.net/Blog/TheBasicsOfSystemIOPortsSerialPort.aspx):

class Program
{
    static SerialPort port;

    static void Main(string[] args)
    {
        port = new SerialPort("COM2", 9600, Parity.None, 8, StopBits.One);
        port.DataReceived +=
            new SerialDataReceivedEventHandler(port_DataReceived);
        port.Open();

        string text;
        do
        {
            text = Console.ReadLine();
            port.Write(text + "\r\n");
        }
        while (text.ToLower() != "q");
    }

    public static void port_DataReceived(object sender,
        SerialDataReceivedEventArgs args)
    {
        string text = port.ReadExisting();
        Console.WriteLine("received: " + text);
    }
}

Это должно устранить любую озабоченность, что это - проблема Поточной обработки (я думаю). Это не работает также. Снова, Гипертерминал сообщает о данных, отправленных через порт, но консольное приложение, кажется, не запускает событие DataReceived.

РЕДАКТИРОВАНИЕ № 2:

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

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

Если я ввожу в приложение WPF, консольное приложение огни события DataReceived, и оно повторяет данные.

Я предполагаю, что проблема где-нибудь находится в моем употреблении программного обеспечения VSPE, которое настраивается для обработки одного последовательного порта как обоих вводов и выводов. И через некоторую странность класса SerialPort, один экземпляр последовательного порта не может быть и отправителем и получателем. Так или иначе я думаю, что это решено.

6
задан mtrw 21 March 2010 в 18:30
поделиться

3 ответа

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

0
ответ дан 8 December 2019 в 05:54
поделиться

Я не могу сказать наверняка, но может быть проблема с потоками. WPF по-разному обрабатывает потоки, и я считаю, что опрос виртуального порта асинхронный. Вы пробовали это с помощью Windows Forms или консольного приложения, чтобы доказать, что оно вообще может работать?

3
ответ дан 8 December 2019 в 05:54
поделиться

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

Вот как выглядит моя начальная декларация:

comControl = new SerialPort();

//This is important - determine your min nb of bytes at which you will fire your event, mine is 9
comControl.ReceivedBytesThreshold = 9; 

//register the event handlers
comControl.DataReceived += new SerialDataReceivedEventHandler(OnReceive);
comControl.PinChanged += new SerialPinChangedEventHandler(OnPinChanged);

Я разделил методы open port и close port, поскольку я часто проверяю, закрыт ли com-порт.

public bool OpenPort()
{
    try
    {
        //must keep it open to maintain connection (CTS)
        if (!comControl.IsOpen)
        {
             comControl.Open();
             comControl.RtsEnable = true;
        }
    }
    catch (Exception e)
    {
        //error handling here
    }
}

Наконец, проверьте, правильно ли установлен драйвер Virtual Com Port, и что вы используете правильный порт, для моего адаптера было недостаточно простого plug and play. Если вы хотите создать элемент управления, который позволит вам выбирать порты, доступные во время выполнения, следующая команда выдаст вам доступные порты:

System.IO.Ports.SerialPort.GetPortNames()
3
ответ дан 8 December 2019 в 05:54
поделиться
Другие вопросы по тегам:

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