.NET SerialPort DataReceived事件未触发

Kla*_*lay 6 .net serial-port

我有一个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);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,以下是复杂因素:

  1. 我正在使用的笔记本电脑没有串口,所以我使用一个名为Virtual Serial Port Emulator的软件来设置COM2.VSPE过去曾经令人钦佩地工作,并且不清楚为什么它只会出现.NET的SerialPort类故障,但我提到它以防万一.

  2. 当我点击表单上的按钮发送数据时,我的超级终端窗口(在COM2上连接)显示数据正在通过.是的,当我想测试我的表单读取端口的能力时,我断开Hyperterminal的连接.

  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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这应该消除任何担心这是一个线程问题(我认为).这也不起作用.同样,Hyperterminal报告通过端口发送的数据,但控制台应用程序似乎没有触发DataReceived事件.

编辑#2:

我意识到我有两个独立的应用程序,应该从串口发送和接收,所以我决定尝试同时运行它们...

如果我输入控制台应用程序,WPF应用程序DataReceived事件将触发,并出现预期的线程错误(我知道如何处理).

如果我输入WPF应用程序,控制台应用程序DataReceived事件将触发,并且它会回显数据.

我猜这个问题出在我使用VSPE软件的某个地方,该软件设置为将一个串口视为输入和输出.通过SerialPort类的一些奇怪,串行端口的一个实例不能同时是发送方和接收方.无论如何,我认为它已经解决了.

小智 15

port.DtrEnable = true;
Run Code Online (Sandbox Code Playgroud)

这解决了它,我没有启用DataTransmitReady标志,因此没有收到任何数据.

  • 事实证明,Adafruit SAMD51 Arduino USB 驱动程序需要设置 DtrEnable 才能工作。感谢您的提示(六年后)! (2认同)

Kla*_*lay -1

我只能推测问题确实出在虚拟串行端口模拟器程序上。这并不是说该软件有问题:到目前为止,VSPE 对我来说运行得很好。但我的代码和我设置 VSPE 连接器的方式之间存在一些冲突。