簡體   English   中英

C# 中串口的 SerialPort.GetPortNames() 比較

[英]SerialPort.GetPortNames() comparison for serial ports in C#

我正在測試串行端口的實時端口視圖。
始終為 false 的 Form1 和調試 state 如下所示。
創建Form1時,COM端口列表存儲在recordedPorts中,每100ms產生timer1_Tick事件,當前COM端口列表被讀取並存儲在presentPorts中,並與recordedPorts進行比較。 如果查看調試state圖片,可以看到GetPortNames()方法的每個結果值string[]都是一樣的。
在此處輸入圖像描述
我想在comboBox1中實時顯示COM端口。
但是,它無法顯示在 comboBox1 中。
字符串操作出現問題,導致timer1_Tick事件無法正常操作。
第一個問題是要知道為什么字符串實時比較總是假的,
二是是否有其他方式實時顯示串口。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;

namespace TestSerial
{
    public partial class Form1 : Form
    {
        string[] recordedPorts, presentPorts;

        string str;
        public Form1()
        {
            InitializeComponent();
            recordedPorts = SerialPort.GetPortNames();
            foreach (string PortName in recordedPorts)
            {
                comboBox1.Items.Add(PortName);
            }
        }
        private void button2_Click(object sender, EventArgs e)
        {
            if(serialPort1.IsOpen == true)
            {
                serialPort1.Close();
                textBox1.Text += "disconnected." + Environment.NewLine;
            }
            else
            {
                textBox1.Text += "already disconnected." + Environment.NewLine;
            }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            if(serialPort1.IsOpen == false)
            {
                serialPort1.PortName = comboBox1.SelectedItem.ToString();
                serialPort1.BaudRate = 9600;
                serialPort1.DataBits = 8;
                serialPort1.StopBits = StopBits.One;
                serialPort1.Parity = Parity.None;
                //serialPort1.Open();
                try
                {
                    serialPort1.Open();  //serial port open!!!
                }
                catch (InvalidOperationException ex)
                {
                    MessageBox.Show(ex.Message);
                    return;
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    return;
                }

                serialPort1.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
                textBox1.Text += "connected." + Environment.NewLine;

                serialPort1.WriteLine("abcd\r\n");
            }
            else
            {
                textBox1.Text += "already connected." + Environment.NewLine;
            }
        }

        private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
        {
            str = serialPort1.ReadExisting();

            if(str.Length > 8)
            {
                textBox1.SelectedText += str + Environment.NewLine;
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            presentPorts = SerialPort.GetPortNames();
            if (presentPorts.Count() == 0)
            {
                //if(comboBox1.Items.Count != 0) comboBox1.Items.Clear();
                recordedPorts = presentPorts;
                return;
            }

            if (recordedPorts != presentPorts)
            {
                comboBox1.DataSource = presentPorts;
                recordedPorts = presentPorts;
            }
        }
    }
}


始終為假的調試state如下。

感謝克勞斯·古特。 我解決了這個問題。
將其更改為下面的代碼,它可以正常工作。

if (!recordedPorts.SequenceEqual(presentPorts))
//if (recordedPorts != presentPorts)
{
    comboBox_port.DataSource = presentPorts;
    recordedPorts = presentPorts;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM