我有一個用於評估基於事件的串行端口通信(與輪詢串行端口)的WPF測試應用程序。問題是DataReceived事件似乎根本沒有觸發。.NET SerialPort 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上)顯示數據正在通過。是的,當我想測試我的表單讀取端口的能力時,我斷開超級終端。
我試圖在接線事件前打開端口。不用找了。
我已閱讀另一篇文章,其中有人有類似的問題。在這種情況下,這些信息都沒有幫助我。
編輯:
這裏的控制檯版本(從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軟件的地方,它被設置爲將一個串口視爲輸入和輸出。並且通過串口類的一些奇怪的事情,串口的一個實例不能既是發送者又是接收者。無論如何,我認爲它已經解決了。
請參閱上面的控制檯版本。沒有運氣。 – Klay 2010-02-17 16:44:54