C# 串行端口不';t实际打开VirtualCOM端口

C# 串行端口不';t实际打开VirtualCOM端口,c#,wpf,serial-port,C#,Wpf,Serial Port,我有一个微控制器,通过USB CDC/ACM连接到电脑。当我试图用一个使用SerialPort的应用程序打开端口时,我在微控制器上什么也看不到。在使用RealTerm、TeraTerm、PuTTy等时,我可以轻松地在micro中设置断点,并观察端口打开/写入/读取/关闭事件被触发,但在我的应用程序中,什么都没有。没有给出错误,应用程序似乎认为一切正常。打开后,即使我在micro上看不到任何东西,其他终端应用程序也无法再连接到该端口,但一旦我在我的应用程序中关闭它,它们就会再次工作。此外,如果我试

我有一个微控制器,通过USB CDC/ACM连接到电脑。当我试图用一个使用SerialPort的应用程序打开端口时,我在微控制器上什么也看不到。在使用RealTerm、TeraTerm、PuTTy等时,我可以轻松地在micro中设置断点,并观察端口打开/写入/读取/关闭事件被触发,但在我的应用程序中,什么都没有。没有给出错误,应用程序似乎认为一切正常。打开后,即使我在micro上看不到任何东西,其他终端应用程序也无法再连接到该端口,但一旦我在我的应用程序中关闭它,它们就会再次工作。此外,如果我试图在打开后写入端口,应用程序就会挂起。那么我错过了哪一步呢

这是我的密码:

using System;
using System.ComponentModel;
using System.IO.Ports;
using System.Windows;
using System.Windows.Controls;

namespace SerialApp
{
    public partial class MainWindow : Window
    {
        static SerialPort _serialPort = new SerialPort();
        static byte[] read_buffer = new byte[4096];
        static byte[] getSerialNumberCmd = { 0x6D, 0x69, 0x6E, 0x64, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };

        public MainWindow()
        {
            InitializeComponent();
        }

        private void comboBoxPorts_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            string port = comboBoxPorts.SelectedIndex.ToString();
            port = "COM" + port;

            _serialPort.PortName = port;
            _serialPort.BaudRate = 115200;
            _serialPort.Parity = Parity.None;
            _serialPort.DataBits = 8;
            _serialPort.StopBits = StopBits.One;
            _serialPort.Handshake = Handshake.None;
            _serialPort.ReadBufferSize = 4096;
            _serialPort.WriteTimeout = 500;
            _serialPort.ReadTimeout = 500;
        }

        private void button_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                if (_serialPort.IsOpen) _serialPort.Close();
                if (_serialPort != null)
                {
                    _serialPort.Open();
                    _serialPort.DataReceived += Serial_DataReceived;

                    comboBoxPorts.IsEnabled = false;
                    buttonClosePort.IsEnabled = true;
                    buttonOpenPort.IsEnabled = false;
                    label1.Content = "Connected to " + _serialPort.PortName;
                }
                else
                {
                    label1.Content = "Choose a COM port.";
                }
            }
            catch(Exception ex)
            {
                label1.Content = "Invalid COM port.";
            }
        }

        private void Serial_DataReceived(object s, SerialDataReceivedEventArgs e)
        {
            _serialPort.Read(read_buffer, 0, 64 + 12);
        }

        private void Window_Closing(object sender, CancelEventArgs e)
        {
            if (_serialPort.IsOpen)
            {
                _serialPort.Close();
            }
            if (_serialPort != null)
            {
                _serialPort.Dispose();
            }
        }

        private void buttonClosePort_Click(object sender, RoutedEventArgs e)
        {
            if (_serialPort.IsOpen)
            {
                _serialPort.Close();
                
                buttonClosePort.IsEnabled = false;
                buttonOpenPort.IsEnabled = true;
                comboBoxPorts.IsEnabled = true;
                label1.Content = "Choose a COM port.";
            }
        }

        private void buttonGetSerial_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                if (_serialPort.IsOpen)
                {
                    _serialPort.Write(getSerialNumberCmd, 0, 64);
                }
            }
            catch(Exception ex)
            {
                _serialPort.Close();
                labelSerialNumber.Content = ex.Message;
            }
        }
    }
}

顺便说一句,我尝试在另一个完全不同系列的微控制器上执行相同的操作,我看到了相同的行为。

尝试添加以下内容:

_serialPort.DtrEnable = true; //enable Data Terminal Ready
_serialPort.RtsEnable = true; //enable Request to send

有关完整的代码示例,请参见。这篇文章是为Windows窗体编写的,但您应该能够根据自己的情况使用大部分代码。

哦,亲爱的sweet merciful@user9938谢谢!这简直让我发疯。我还没见过其他地方用过。