Comment détecter si un modem est présent [Résolu]

Messages postés
30
Date d'inscription
mardi 28 février 2006
Dernière intervention
5 mars 2013
- - Dernière réponse : cs_casy
Messages postés
7745
Date d'inscription
mercredi 1 septembre 2004
Dernière intervention
24 septembre 2014
- 24 juil. 2009 à 09:46
Bonjour,

Je suis en train de concevoir une application de bottin téléphonique avec composition automatique. Je voudrais savoir commment faire pour détecter sur quel port se trouve le modem (si présent), et par la suite comment composer un numéro de téléphone et capter le message de retour pour indiquer à la personne quand prendre la ligne. Je tentes d'utiliser la bibliothèque SerialPort de .NET mais je me perds un peu au niveau de la détection.

Merci de m'aider.

ICEMAN64B
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
Messages postés
7745
Date d'inscription
mercredi 1 septembre 2004
Dernière intervention
24 septembre 2014
3
Merci
Plusieurs points :
- Ta liste de port, tu dois la parcourir de 0 à longueur-1 pas jusqu'à longueur, sinon tu auras une erreur d'indice hors limite.
- Tu ne dois pas suspendre le thread, car du coup tu suspend aussi l'envoie des données par le port série.
- Tu utilise la méthode ReadLine. Cette méthode lit une ligne complète sur le port série. C'est à dire, qu'elle attend durant un certain temps jusqu'à obtenir le caractère de saut de ligne. Ce certain temps est défini par le paramètre ReadTimeOut du port série, à positionner avant l'ouverture du port. Par défaut, ce paramètre est défini à Infinite. Cela signifie que ta méthode ReadLine va attendre indéfiniment et donc bloquer. Il faut donc définir une valeur pour ReadTimeOut. Au dela de cette valeur si la méthode ReadLine n'a toujours reçu une ligne complète, elle se finira en générant une exception.

J'ai un peu remanier et corrigé ton code :
public void ChercheModem()
{
SerialPort oSerialPort = new SerialPort();

string CMD = "AT\r";
string DataReceived = "";
string[] sPortList = System.IO.Ports.SerialPort.GetPortNames();

for (int i = 0; i < sPortList.Length; i++)
{
try
{
oSerialPort.PortName = sPortList[i];
oSerialPort.ReadTimeout = 500;
oSerialPort.Open();
if (oSerialPort.IsOpen)
{
oSerialPort.WriteLine(CMD);
Application.DoEvents();
  DataReceived = oSerialPort.ReadLine().ToString();
}
if (DataReceived.Length == 0)
{
label7.Text = sPortList[i] + " : Aucun modem détecté";
Application.DoEvents();
}
else
{
label7.Text = "Modem détecté sur le port " + (sPortList[i]);
PortModemTrouve = sPortList[i];
}
}
catch
{
label7.Text = sPortList[i] + " : Aucun modem détecté";
Application.DoEvents();
}
finally
{
if (oSerialPort.IsOpen) { oSerialPort.Close(); }
}
}

}





[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 106 internautes ce mois-ci

Commenter la réponse de cs_casy
Messages postés
168
Date d'inscription
mardi 27 juillet 2004
Dernière intervention
28 novembre 2012
0
Merci
Je te conseillerais d'utiliser la dll ATSMS.

Only the strong survive !
Commenter la réponse de imothepe_33
Messages postés
7745
Date d'inscription
mercredi 1 septembre 2004
Dernière intervention
24 septembre 2014
0
Merci
Regarde dans la doc du modem sur les commandes AT (ou commandes hayes)

Celui-ci doit normalement répondre à ce type des commandes devenue norme.

Si tu envoie AT, le modem doit te répondre OK, preuve qu'il est là en état de marche.

Pour décrocher, racrocher, ça sera ATH
Pour composer ça sera ATD
etc .....

Pour savoir quand la personne peut prendre la ligne, le mieux est encore d'activer le hautparleur du modem et de la laisser prendre la ligne d'elle même

[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
Commenter la réponse de cs_casy
Messages postés
30
Date d'inscription
mardi 28 février 2006
Dernière intervention
5 mars 2013
0
Merci
Je vous remercie pour les réponses mais je ne suis pas rendu au stade de gérer le modem pour le moment. Ce que je voudrais faire est une fonction qui permet de connaître sur quel port se trouve le modem, si il y en a un de présent. J'ai une fonction "ChercheModem" mais ça gèle lorsque je l'exécute.

La voici:


 public void ChercheModem()
        {
            
            SerialPort oSerialPort = new SerialPort();
            string CMD = "AT\r";
            string DataReceived = "";
            string[] sPortList = System.IO.Ports.SerialPort.GetPortNames();

            for (int i = 0; i <= sPortList.Length; i++)
            {
                try
                {
                    oSerialPort.PortName = sPortList[i];
                    oSerialPort.Open();
                    if (!oSerialPort.IsOpen)
                    {
                        oSerialPort.WriteLine(CMD);
                    }
                    Thread.Sleep(500);  // serial ports are slow
                    DataReceived += oSerialPort.ReadLine().ToString();
                    //MessageBox.Show(sPortList[i] + " port responded " + DataReceived);
                    if (DataReceived.Length == 0)
                        label7.Text = "Aucun modem détecté";
                    else label7.Text = "Modem détecté sur le port " + (sPortList[i]);
                    PortModemTrouve = sPortList[i];
                }
                catch { }
                finally
                {
                    if (oSerialPort.IsOpen) { oSerialPort.Close(); }

                }
            }
        }


Si aucun modem n'est présent dans l'ordinateur, la fonction gèle et ne se rend pas à "Aucun modem détecté". Ça bloque à la ligne DataReceived += oSerialPort.ReadLine().ToString(); Pourquoi ?

Y-a-t-il moyen de faire mieux pour détecter et renvoyer le port du modem, si présent.
Commenter la réponse de cs_iceman64b

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.