У меня есть тестовое приложение 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);
}
}
Теперь вот осложняющие факторы:
Ноутбук, на котором я работаю, не имеет последовательных портов, поэтому для настройки COM2 я использую программу под названием «Эмулятор виртуального последовательного порта». VSPE работал превосходно в прошлом, и не ясно, почему он будет работать только с классом .NET SerialPort, но я упомяну это на всякий случай.
Когда я нажимаю кнопку в форме, чтобы отправить данные, мое окно гипертерминала (подключенное к COM2) показывает, что данные проходят. Да, я отключаю Гипертерминал, когда хочу проверить способность моей формы читать порт.
Я пытался открыть порт перед подключением события. Без изменений.
Я прочитал еще один пост здесь, где у кого-то еще есть похожая проблема. Ничто из этой информации не помогло мне в этом деле.
EDIT:
Вот консольная версия (изменена с 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);
}
}
Это должно устранить любые опасения, что это проблема Threading (я думаю). Это тоже не работает. И снова Hyperterminal сообщает о данных, отправленных через порт, но консольное приложение, похоже, не запускает событие DataReceived.
РЕДАКТИРОВАНИЕ № 2:
Я понял, что у меня есть два отдельных приложения, которые должны отправлять и получать через последовательный порт, поэтому я решил попробовать запустить их одновременно ...
Если я наберу в консольном приложении событие Событие DataReceived приложения WPF, с ожидаемой ошибкой потоков (с которой я знаю, как бороться).
Если я ввожу в приложение WPF, запускается событие DataReceived консольного приложения, и оно отображает данные.
Я предполагаю, что проблема заключается в том, что я использую программное обеспечение VSPE, которое настроено на обработку одного последовательного порта в качестве входа и выхода. И из-за некоторой странности класса SerialPort один экземпляр последовательного порта не может быть ни отправителем, ни получателем. Во всяком случае, я думаю, что это решено.