Comment détecter si un modem est présent

Résolu
cs_iceman64b
Messages postés
30
Date d'inscription
mardi 28 février 2006
Statut
Membre
Dernière intervention
5 mars 2013
- 23 juil. 2009 à 14:15
cs_casy
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
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

4 réponses

cs_casy
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
24 juil. 2009 à 09:46
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
3
imothepe_33
Messages postés
168
Date d'inscription
mardi 27 juillet 2004
Statut
Membre
Dernière intervention
28 novembre 2012
7
23 juil. 2009 à 17:22
Je te conseillerais d'utiliser la dll ATSMS.

Only the strong survive !
0
cs_casy
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
23 juil. 2009 à 18:42
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
0
cs_iceman64b
Messages postés
30
Date d'inscription
mardi 28 février 2006
Statut
Membre
Dernière intervention
5 mars 2013

24 juil. 2009 à 06:19
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.
0