Member 12545398 Ответов: 2

Определение COM-порта дисплея custumer (с поддержкой USB)


I have connected customer Display with POS application. I am using serial port class for display message on customer Display. To message i need to know with com port this USB display are using. I have searched allowed there are many examples for getting all com pot for that cumputer but i am able to find any help to get perticular com port no e.g COM93,COM01 or COM2.

I have tried following program and also i have tried Microsoft program WMI code creator.

<pre lang="c#">// Get a list of serial port names. string[] ports = SerialPort.GetPortNames();

    Console.WriteLine("The following serial ports were found:");

    // Display each port name to the console.
    foreach (string port in ports)
    {
        Console.WriteLine(port);
    }

Console.ReadLine();





        SerialPort sp = new SerialPort();
        sp.PortName = "COM93";------------- How i can find this no automatic 
        sp.BaudRate = 9600;
        sp.Parity = Parity.None;
        sp.DataBits = 8;
        sp.StopBits = StopBits.One;
        sp.Open();
        sp.Write("\f");
        sp.WriteLine("***Velkommen***");
        sp.Close();
        sp.Dispose();
        sp = null;

Я также попробовал следующее решение, чтобы использовать это, а также для этого я получаю отказ в доступе, поэтому мне нужно отредактировать registory, чтобы дать права, которые я dot wana хочу ли я решение программно

ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\WMI", "SELECT * FROM MSSerial_PortName");


Что я уже пробовал:

<pre lang="c#">ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\WMI", "SELECT * FROM MSSerial_PortName");

Ralf Meier

Если я правильно вас понял, вам нужно знать, какой COM-порт используется вашим USB-устройством ?

Member 12545398

Да, но как я могу узнать это с помощью c#

Ralf Meier

Некоторое время назад у меня было аналогичное требование. Мой подход состоял в том, чтобы найти информацию об идентификаторе поставщика в реестре. Но это решение (которое работало на меня) не было независимым от операционной системы. Но я буду искать его и предоставлять его в качестве решения, когда я его найду.
Пожалуйста, подождите немного ...

Member 12545398

Спасибо

2 Ответов

Рейтинг:
4

Ralf Meier

Это оказалось проще, чем я думал ...

Imports Microsoft.Win32
Imports System.Text.RegularExpressions

Public Class ReaderInfo
    Public DriverExists As Boolean

    Public PortName As String
    Public PortExists As Boolean
    Public PortOpened As Boolean

    Public VendorID As String
    Public ProduktID As String
    Public DriverID As String

    Public Description As String
    Public Typ_Converter As String
    Public Typ_Reader As String

    Sub Clear()
        DriverExists = False

        PortName = ""
        PortExists = False
        PortOpened = False

        VendorID = ""
        ProduktID = ""

        Description = ""
        Typ_Converter = ""
        Typ_Reader = "Kaba B-Net 9107 Card-Reader"
    End Sub

    Sub New()
        Clear()
    End Sub

    Public Sub Get_RegistryInfo(VID As String, PID As String)
        Dim rk1 As RegistryKey = Registry.LocalMachine  ' HKEY_LOCAL_MACHINE
        Dim rk2 As RegistryKey = rk1.OpenSubKey("SYSTEM\\CurrentControlSet\\Enum")  ' HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum

        Clear()
        VendorID = VID
        ProduktID = PID

        Dim pattern As String = String.Format("^VID_{0}.PID_{1}", VID, PID)
        Dim _rx As Regex = New Regex(pattern, RegexOptions.IgnoreCase)

        Dim rk2_SubKeyNames, rk3_SubKeyNames, rk4_SubKeyNames As String
        Dim Desc, Mfg As String
        Dim Index As Integer

        For Each rk2_SubKeyNames In rk2.GetSubKeyNames()
            Dim rk3 As RegistryKey = rk2.OpenSubKey(rk2_SubKeyNames)

            For Each rk3_SubKeyNames In rk3.GetSubKeyNames()
                If _rx.Match(rk3_SubKeyNames).Success Then
                    Dim rk4 As RegistryKey = rk3.OpenSubKey(rk3_SubKeyNames)
                    DriverExists = True


                    For Each rk4_SubKeyNames In rk4.GetSubKeyNames()
                        Index = CInt(rk4_SubKeyNames)

                        Dim rk5 As RegistryKey = rk4.OpenSubKey(rk4_SubKeyNames)
                        If rk5.OpenSubKey("Control") IsNot Nothing Then 
                            Dim rk6 As RegistryKey = rk5.OpenSubKey("Device Parameters")

                            Dim rk5_DeviceDesc As String() = rk5.GetValue("DeviceDesc").ToString.Split(";")
                            Desc = rk5_DeviceDesc(rk5_DeviceDesc.Length - 1)

                            If Index = 0 Then
                                Description = Desc
                                PortName = rk6.GetValue("PortName")

                                Dim myComports As String() = System.IO.Ports.SerialPort.GetPortNames()
                                For i As Integer = 1 To myComports.Length
                                    If myComports(i - 1) = PortName Then
                                        PortExists = True
                                        Exit For
                                    End If
                                Next
                            Else ' Index <> 0 // ? > 200
                                Dim rk5_Mfg As String() = rk5.GetValue("Mfg").ToString.Split(";")
                                Mfg = rk5_Mfg(rk5_Mfg.Length - 1)
                                Typ_Converter = Mfg + vbCrLf + Desc
                                DriverID = Index.ToString
                            End If
                        End If
                    Next
                End If
            Next
        Next

    End Sub

End Class


конечно... образец - VB , но я думаю, вы могли бы увидеть, как он работает. Должен ли я преобразовать его в C# ?
Единственное, что нужно знать,-это идентификатор поставщика и идентификатор продукта. С помощью этой информации вы вызываете метод " Get_RegistryInfo"
Надеюсь, это поможет - в противном случае не стесняйтесь обращаться ко мне снова ...


Ralf Meier

Нет... вся информация и данные записываются в общедоступные переменные класса (например, "PortName") и так далее.
Этот код работал (для меня) с Windows7.
Но чтобы быть уверенным в том, что происходит, посмотрите на отладчик. Возможно, ключи реестра для вашего требования отличаются.

Ralf Meier

Извиняюсь... поскольку у меня нет вашего USB-драйвера, я не могу проверить его для вас или дать лучшую информацию ...

Member 12545398

Спасибо за большую помощь. Я действительно ценю это. Я изменил его, и он тоже работал на меня, и у меня есть жесткое проводное имя устройства. Функция здесь :


общественного строка Get_RegistryInfo(вид строки, строки ПИД)
{
пробовать
{
RegistryKey rk1 = реестр.Локальная машина;
// Реестра HKEY_LOCAL_MACHINE
Объект registrykey, рк2 = рк1.OpenSubKey("железа\\\\DEVICEMAP\\\\SERIALCOMM");
// HKEY_LOCAL_MACHINE\HARDWARE\ \ \ DEVICEMAP\\ \ SERIALCOMM
Столбец vendorid = вид;
ProduktID = PID;
string pattern = строка.Формат ("^VID_{0}. PID_{1}", VID, PID);
Regex _rx = новое регулярное выражение (pattern, RegexOptions.Параметром ignorecase);
строка rk2_SubKeyNames = null;
foreach (строка rk2_SubKeyNames_loopVariable в rk2. GetValueNames())
{
rk2_SubKeyNames = rk2_SubKeyNames_loopVariable;
if (rk2_SubKeyNames = = " \ \ Device\\ProlificSerial0")
{
COM_Port = рк2.И getValue(rk2_SubKeyNames).Метод toString();

}
}
вернуться COM_Port;
}
поймать(исключение бывший)
{
Ящик для сообщений.Показать (например, сообщение);
вернуться COM_Port;
}

}

Спасибо вам за большую помощь. Огромное спасибо

Ralf Meier

Пожалуйста...
Я рад ,что эта идея может сработать и для вас...

Рейтинг:
2

Jochen Arndt

Вы можете использовать SerialPort.GetPortNames() чтобы заполнить список, позвольте пользователю выбрать порт и сохранить его в качестве пользовательских настроек для повторного использования при следующем запуске программы. Но для этого требуется, чтобы пользователь знал, какой порт является вашим дисплейным устройством.

Чтобы помочь пользователю идентифицировать устройство, вы также можете предоставить описание, как показано в Диспетчере устройств Windows, или использовать описание для автоматического выбора порта.

Но получение описания не предусмотрено .NET, так что вам придется вызывать функции Windows API или использовать WMI (что требует административных привилегий).

Пример можно найти по адресу Перечислите все COM-порты и найдите их название и описание в блоге C# | Svetlin Nakov[^].