我有一个非常基本的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类中发生故障,但我还是提到了这一点。
当我按下表单上的按钮发送数据时,我的Hyperterminal窗口(连接在COM2上)显示数据正在传输。是的,我想测试表单读取端口的能力时会断开Hyperterminal。
我尝试在连接事件之前打开端口。没有变化。
我已经阅读过另一篇帖子,其中其他人遇到了类似的问题。但那些信息都没有对我有所帮助。
编辑:
这是控制台版本(修改自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);
}
}
这应该消除了任何关于线程问题的担忧(我想)。但这也不起作用。Hyperterminal再次报告通过端口发送的数据,但控制台应用程序似乎没有触发DataReceived事件。
编辑#2:
我意识到我有两个单独的应用程序都应该从串行端口发送和接收数据,所以我决定尝试同时运行它们...
如果我在控制台应用程序中输入,WPF应用程序的DataReceived事件会触发,并出现预期的线程错误(我知道如何处理)。
如果我在WPF应用程序中输入,控制台应用程序的DataReceived事件会触发,并回显数据。
我猜问题出在我的VSPE软件使用上,它被设置为将一个串行端口同时视为输入和输出。由于SerialPort类的某些奇怪特性,一个串行端口实例不能同时充当发送方和接收方。无论如何,我认为问题已解决。