代码之家  ›  专栏  ›  技术社区  ›  Learning-Overthinker-Confused

如何知道连接了哪个串行端口的外部设备并从该设备读取数据?

  •  0
  • Learning-Overthinker-Confused  · 技术社区  · 8 年前

    我连接了一个产生随机数的设备,我想通过我的 Windows应用程序 .

    我正在使用此代码:

    public static void Main()
    {
        SerialPort mySerialPort = new SerialPort("COM19");
    
        mySerialPort.BaudRate = 115200;
        mySerialPort.Parity = Parity.None;
        mySerialPort.StopBits = StopBits.One;
        mySerialPort.DataBits = 8;
        mySerialPort.Handshake = Handshake.None;
    
        mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
    
        mySerialPort.Open();
    
        Console.WriteLine("Press any key to continue...");
        Console.WriteLine();
        Console.ReadKey();
        mySerialPort.Close();
    }
    
    private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
    {
        SerialPort sp = (SerialPort)sender;
        string indata = sp.ReadExisting();
        Debug.Print("Data Received:");
        Debug.Print(indata);
    }
    

    使用此代码,我成功地获取了数据。

    但问题是我已经硬编码了 com port(Com19) 这是从设备管理器,我已经检查了我的设备连接到哪个端口,所以我已经硬编码了,但我不想这样做。

    相反,我会给用户 1 dropdown 其中用户将仅看到用户设备连接到的端口。因此,当从连接的设备获取数据时,我将使用用户选择的下拉端口。

    我对windows应用程序非常陌生,从未做过任何与串口相关的事情。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Alexej Sommer    8 年前

    当我将arduino连接到com端口时,我使用了以下代码(假设arduinoo返回了包含“来自arduino的信息”的文本):

    SerialPort currentPort; // global variables
    bool ArduinoPortFound = false;
    

    ...

            try
            {
                string[] ports = SerialPort.GetPortNames();
                foreach (string port in ports)
                {
                    currentPort = new SerialPort(port, 9600);
                    if (ArduinoDetected())
                    {
                        ArduinoPortFound = true;
                        break;
                    }
                    else
                    {
                        ArduinoPortFound = false;
                    }
                }
            }
            catch { }
    

    ......

            private bool ArduinoDetected()
        {
            try
            {
                currentPort.Open();
                System.Threading.Thread.Sleep(1000); 
    
                string returnMessage = currentPort.ReadLine();
                currentPort.Close();
    
                if (returnMessage.Contains("Info from Arduino"))
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch (Exception e)
            {
                return false;
            }
        }
    

    更新: 或者你也可以使用 Windows Management Instrumentation (WMI)

    下面是关于它的文章: How to programmatically find a COM port by friendly name

        2
  •  1
  •   ViKu    8 年前
    ManagementObjectCollection mReturn;
    ManagementObjectSearcher mSearch;
    mSearch = new ManagementObjectSearcher("Select * from Win32_SerialPort");
    mReturn = mSearch.Get();
    
    Combobox cboPort = new Combobox();
    
    foreach (ManagementObject mObj in mReturn)
    {
       cboPort.Items.Add(mObj["Name"].ToString());
    }
    

    按如下方式修改代码

    SerialPort mySerialPort = new SerialPort(cboPort.Text);
    

    我希望这对你有帮助,并根据你的要求进行修改。