【发布时间】:2010-02-17 14:52:16
【问题描述】:
我有一个 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);
}
}
现在,这里是复杂的因素:
我正在使用的笔记本电脑没有串口,所以我使用了一个名为 Virtual Serial Port Emulator 的软件来设置 COM2。 VSPE 在过去的表现令人钦佩,目前尚不清楚为什么它只会与 .NET 的 SerialPort 类一起出现故障,但我提到它是为了以防万一。
当我点击表单上的按钮发送数据时,我的超级终端窗口(连接到 COM2)显示数据正在通过。是的,当我想测试我的表单读取端口的能力时,我断开了超级终端。
我尝试在连接事件之前打开端口。没有变化。
我在这里阅读了另一篇帖子,其中其他人遇到了类似的问题。在这种情况下,这些信息都没有帮助我。
编辑:
这是控制台版本(修改自 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 类的一些奇怪之处,一个串行端口的实例不能同时是发送者和接收者。反正我觉得解决了。
【问题讨论】:
标签: .net serial-port