C# 从串口读取数据;关闭然后打开应用程序时出错

C# 从串口读取数据;关闭然后打开应用程序时出错,c#,serial-port,C#,Serial Port,我创建了一个从串口读取数据的应用程序,它工作得很好。但是当我关闭应用程序并再次运行它时,问题就出现了。突然,从串行端口读取的数据停止工作。我必须断开连接USB才能解决这个问题 这是我的代码: namespace Serial { public partial class Main : Form { SerialPort mainSerialPort = new SerialPort(); public Main() {

我创建了一个从串口读取数据的应用程序,它工作得很好。但是当我关闭应用程序并再次运行它时,问题就出现了。突然,从串行端口读取的数据停止工作。我必须断开连接USB才能解决这个问题

这是我的代码:

namespace Serial
{
    public partial class Main : Form
    {
        SerialPort mainSerialPort = new SerialPort();

        public Main()
        {
            InitializeComponent();
        }

        delegate void SetTextCallback(string text);

        private void buttonOpen_Click(object sender, EventArgs e)
        {

            mainSerialPort.PortName = "COM" + numericPort.Value.ToString();
            mainSerialPort.BaudRate = 115200;
            mainSerialPort.Parity = Parity.None;
            mainSerialPort.StopBits = StopBits.One;
            mainSerialPort.DataBits = 8;
            mainSerialPort.Handshake = Handshake.None;
            mainSerialPort.DataReceived += DataReceived_Read;

            try{
                mainSerialPort.Open();
            }catch (Exception ex){
                labelStatus.Text = ex.GetType().ToString();
            }


            if (mainSerialPort.IsOpen == true){
                numericPort.BackColor = Color.Green;
                labelStatus.Text = "Port je otevřen!";
            }else{
                numericPort.BackColor = Color.Red;
            }

        }

        private void DataReceived_Read(object sender, SerialDataReceivedEventArgs e)
        {
            SerialPort mySerial = (SerialPort)sender;

            if (this.InvokeRequired){
                listBoxRead.Invoke(new MethodInvoker(delegate {
                    listBoxRead.Items.Add(mySerial.ReadExisting());
                    listBoxRead.SelectedIndex = listBoxRead.Items.Count - 1;
                }));
            }

        }

        private void Main_FormClosed(object sender, FormClosedEventArgs e)
        {
            mainSerialPort.DataReceived -= DataReceived_Read;
            mainSerialPort.Close();
        }
    }
}

USB和串行端口是非托管资源。你得把它处理掉!。在FormClosed上进行简单的关闭不会起到同样的作用。

我认为这与一些资源没有正确释放有关。尝试调用Dispose方法

mainSerialPort.Close();
mainSerialPort.Dispose();

我尝试过处理它,但仍然一无所获:Close和Dispose执行完全相同的操作。如果不使用握手,则必须将DtrEnable和RtsEnable属性设置为true。一个串行设备会注意到这些信号,当它们关闭时会拒绝发送任何东西。非常感谢你!你真棒!它工作得很好;