【问题标题】:How to know on which serial port external device is connected and read data from that device?如何知道连接了哪个串口外部设备并从该设备读取数据?
【发布时间】:2016-08-03 23:51:48
【问题描述】:

我连接了 1 个生成随机数的设备,我想通过我的 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 应用程序非常陌生,从未做过任何与串口相关的事情。

【问题讨论】:

    标签: c# .net winforms serial-port


    【解决方案1】:

    当我将 arduino 连接到 com 端口时。我已经使用了这段代码(假设 arduino 返回了带有“来自 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

    【讨论】:

    • Getting Error on this line: currentPort = new SerialPort(port, 9600);//非静态字段、方法或属性需要对象引用。我已将此代码放在静态中无效的主要
    • 这一行没有任何反应:string returnMessage = currentPort.ReadLine();
    • 如果您有控制台应用程序,请将“静态”添加到变量和 ArduinoDetected 方法
    • 如果端口不返回新行,您可以尝试 string returnMessage = currentPort.ReadExisting();
    • 是的。似乎港口很忙。被其他应用占用
    【解决方案2】:
    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);
    

    希望对您有所帮助,并根据您的要求进行修改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-04
      • 2023-03-21
      • 2019-06-09
      • 1970-01-01
      • 2011-06-02
      • 1970-01-01
      • 2011-02-10
      • 1970-01-01
      相关资源
      最近更新 更多