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

时间:2016-04-13 05:02:53

标签: c# .net winforms serial-port

我附加了一个生成一些随机数的设备,我希望通过 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提供用户只能看到用户设备连接的端口的用户url('my-font.svg#my_font')。因此,当从此连接设备获取数据时,我将使用该用户选择的下拉端口。

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

2 个答案:

答案 0 :(得分:2)

当我将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

答案 1 :(得分:1)

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);

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