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 40
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 40
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
Rejoignez-nous