IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Detecter type port serie (bluetooth ou serial)


Sujet :

C#

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Par défaut Detecter type port serie (bluetooth ou serial)
    Bonjour

    J'ai un systeme branché sur un port com.
    Afin d'aider mes utilisateurs, j'essais de lister les ports com de la machine et de lancer un Helloworld a mon système afin de detecter sa présence et de choisir le bon port Com.
    Sur une machine sans bluetooth : No problem
    Des qu'il y a un port bluetooth l'application plante pdt 3min.

    Comment connaitre le type de port Serie (virtuel, bluetooth)
    ou comment reconnaitre les port bluetooth
    afin de ne pas lancer le test sur ce type de port

    Cordialement

    Le test est par la function suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     public ArrayList DiscoverPluggedDevices()
            {
                ArrayList comList = new ArrayList();
                string[] ports = System.IO.Ports.SerialPort.GetPortNames();
                foreach (string s in ports)
                {
                    addMessage(0, "Search Device on  port " + s, " -> ");
                    DiscoverDevices Dut = new DiscoverDevices();
                    if (Dut.TestSerialPort(s))
                    {
                        addMessage(0, "Device found on  port " + s, " <- ");
                        comList.Add(s);
                    }
                    else
                        addMessage(0, "No device found on  port " + s, " <- ");
                }
                return comList;
            }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
     public bool TestSerialPort(string PortCom)
            {
                bool bRet = true;
                try
                {
                    serialPort = new SerialPort(PortCom, 115200, Parity.None, 8, StopBits.One);
                    serialPort.Open();
                    serialPort.DataReceived += new SerialDataReceivedEventHandler(OnDataReceived);
                    serialPort.ErrorReceived += new SerialErrorReceivedEventHandler(OnErrorReceived);
                    serialPort.PinChanged += new SerialPinChangedEventHandler(OnSerialPinChanged);
                    sendMessage(HelloWorld);
                    nbStartFrame = 0;
                    if (ReceiveEvent.WaitOne(2000, false))
                    {
                        bRet = true;
                    }
                    else
                    {
                        bRet = false;
                    }
                    serialPort.Close();
                    return bRet;
                }
                catch
                {
                    return false;
                }
            }
     
     private void OnDataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                const string completionTag = "Tunnel|";
                while (true)
                {
                    try
                    {
                        if ((serialPort.BytesToRead > 5) && (serialPort.BytesToRead < 100))
                            inboundBuffer += serialPort.ReadExisting();
                        else
                            break;
                    }
                    catch
                    {
                        break;
                    }                int length = inboundBuffer.Length;
     
                    if (length > 100) break;
                    if (nbStartFrame > 5) break;
                    int frameStart = inboundBuffer.IndexOf(CHAR_StartOfFrame);
                    if (frameStart != 0)
                    {
                        if (frameStart < 0)
                        {
                            inboundBuffer = "";
                            break;
                        }
                        inboundBuffer = inboundBuffer.Substring(frameStart);
                        frameStart = 0;
                        nbStartFrame++;
                    }
     
                    int frameEnd = inboundBuffer.IndexOf(CHAR_EndOfFrame, 0);
                    if (frameEnd < 0)
                        break;
     
                    // A full message is available.
                    string message = inboundBuffer.Substring(1, frameEnd - 1);
                    inboundBuffer = inboundBuffer.Substring(frameEnd + 1);
     
                    if (!message.StartsWith(completionTag)) break;
     
                    if (message.Length > 12)
                    {
                        serialNumber = message.Substring(10, 2) + message.Substring(8, 2) + message.Substring(6, 2) + message.Substring(4, 2);
     
                    }
                    else
                        break;
                    ReceiveEvent.Set();
     
                }
            }

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Par défaut
    Bonjour a tous

    J'ai trouvé en glanant sur le Net, je post la reponse.

    il faut ajouter la reference "System.Management"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    using System.Management;
     
     
     // search for bluetooth port
     
                ArrayList comBluetooth = new ArrayList();
                const string Win32_SerialPort = "Win32_SerialPort";
                SelectQuery q = new SelectQuery(Win32_SerialPort);
                ManagementObjectSearcher mos = new ManagementObjectSearcher(q);
                  foreach (object cur in mos.Get())
                {
                    ManagementObject mo = (ManagementObject)cur;
                    object id = mo.GetPropertyValue("DeviceID");
                    comBluetooth.Add(id.ToString());               
                }
    la list ComBluetooth contient le nom de tout les ports série bluetooth.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     string[] ports = System.IO.Ports.SerialPort.GetPortNames();
    Contient la liste de tous les ports serie donc en testant la présence dans les deux listes ou pas on connait les port série non bluetooth du PC

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    321
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 321
    Par défaut
    Bonjour,
    après avoir regardé ton problème (qui est le mien) je ne peux pas l'appliquer a mon cas. Je travaille pour du Windows Mobile et je voudrais trouver un moyen de différencier les ports COM serial des ports COM bluetooth mais la méthode que tu as trouvée ne fonctionne pas (System.Management n'existe pas...)

  4. #4
    Membre éprouvé Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 931
    Par défaut
    Bonjour,

    La discutions est un peu ancienne, mais cela ne fonctionne pas, les 2 listes contiennent le même COM, Bluetooth ou pas. (Windows form).
    Le plus simple que j'ai trouvé pour le moment c'est de tenter d'écrire sur le port en activant au préalable le WriteTimeout = 100 et d'y écrire (port.Write("@\r"), cela provoque une exception sur le COM Bluetooth (capturer par un try catch) afin d'éliminé ce port comme valide.

    De plus depuis quelque temps j'ai SerialPort.GetPortNames qui parfois, sur certain PC ne me retourne pas tous les ports COM.
    Windows affecte aussi parfois le même numéro de port COM. (Arriver environ au même moment que le défaut de GetPortNames)
    Obligé de passé par une autre astuce pour listé les ports COM.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 06/03/2014, 13h04
  2. Réponses: 0
    Dernier message: 06/03/2014, 09h58
  3. Detecter erreur de parite port serie
    Par ricky78 dans le forum MFC
    Réponses: 2
    Dernier message: 10/03/2009, 11h46
  4. Detecter liaison broche 7 et 8 port serie RS232
    Par yaltar dans le forum Windows
    Réponses: 1
    Dernier message: 09/11/2006, 16h23
  5. [Kylix] Kylix / port serie
    Par Anonymous dans le forum EDI
    Réponses: 3
    Dernier message: 01/04/2002, 12h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo