首页 > 解决方案 > SerialPort 实际上并没有打开 VirtualCOM 端口

问题描述

我有一个通过 USB CDC/ACM 连接到 PC 的微控制器。当我尝试使用我尝试使用 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;
            }
        }
    }
}

顺便说一句,我试图在另一个完全不同系列的微控制器上做同样的事情,我看到了同样的行为。

标签: c#wpfserial-port

解决方案


尝试添加以下内容:

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

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


推荐阅读