2013-03-14 2 views
1

J'essaye de construire une application simple qui renvoie le numéro appelant par l'intermédiaire d'un modem, cependant je semble seulement obtenir la première ligne des données reçues du modem.Récepteur de numéro de téléphone C#

Quand je lance HyperTerminal et passer par AT # CID = 1 commande, appeler le numéro, je reçois une sortie pleine de:

OK

DATE = 0314

TIME = 1111

NMBR = 4936

NAME = Stuart E

RING

Dans mon application, je ne reçois que la première section contenant la partie "OK". Toute aide sur ce que je fais mal ou suis manquant?

code:

public partial class Form1 : Form 
{ 
    public SerialPort port = new SerialPort("COM3", 115200,Parity.None,8,StopBits.One); 
    public String sReadData = ""; 
    public String sNumberRead = ""; 
    public String sData = "AT#CID=1"; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void btnRun_Click(object sender, EventArgs e) 
    { 
     SetModem(); 

     ReadModem(); 

     MessageBox.Show(sReadData); 
    } 

public void SetModem() 
    { 

     if (port.IsOpen == false) 
     { 
      port.Open(); 
     } 

     port.WriteLine(sData + System.Environment.NewLine); 
     port.BaudRate = iBaudRate; 
     port.DtrEnable = true; 
     port.RtsEnable = true; 

    } 

    public string ReadModem() 
    { 

     try 
     { 
      sReadData = port.ReadExisting().ToString(); 

      return (sReadData); 
     } 
     catch (Exception ex) 
     { 
      String errorMessage; 
      errorMessage = "Error in Reading: "; 
      errorMessage = String.Concat(errorMessage, ex.Message); 
      errorMessage = String.Concat(errorMessage, " Line: "); 
      errorMessage = String.Concat(errorMessage, ex.Source); 

      MessageBox.Show(errorMessage, "Error"); 
      return ""; 
     } 
    } 

    private void btnExit_Click(object sender, EventArgs e) 
    { 
     port.Close(); 
     Close(); 
    } 
} 
} 
+0

ne sais pas si cela est le problème, mais sur msdn, 'readexisting' semble renvoyer une chaîne de toute façon donc je ne sais combien la' .toString() 'est nécessaire – Sayse

+0

Quels sont les paramètres que vous utilisez dans le terminal Hyper? Assurez-vous d'utiliser la même chose dans votre application. – ellak

+0

Vous pouvez jeter un oeil à ma question http://stackoverflow.com/questions/5897916/callerid-detection-doesnt-work-with-some-phones – Marshal

Répondre

1

En ReadModem() essayer d'utiliser port.ReadLine() dans une place boucle et en boucle jusqu'à ce que vous obtenez une ligne disant RING (si c'est la dernière ligne que vous attendez).

+0

J'ai aussi essayé une boucle, mais j'ai quand même obtenu "ok" – Stuart1044

+0

Pouvez-vous montrer le code avec la boucle? – ellak

+0

Ok, donc j'ai changé ReadModem() pour avoir ce qui suit: while (sReadData! = "RING") { sReadData + = port.ReadLine(); } mais lors de la lecture en boucle de sReadData, n'est mis à "OK", puis il semble arrêter tout lire ensemble – Stuart1044

1

Vous lisez simplement le modem une fois après l'avoir configuré. Vous devez vous abonner au DataReceivedEvent sur serialPort pour obtenir en continu des données du port.

public void SetModem() 
    { 

     if (port.IsOpen == false) 
     { 
      port.Open(); 
     } 

     port.WriteLine(sData + System.Environment.NewLine); 
     port.BaudRate = iBaudRate; 
     port.DtrEnable = true; 
     port.RtsEnable = true; 

     port.DataReceived += port_DataReceived; 

    } 

    void port_DataReceived(object sender, SerialDataReceivedEventArgs e) 
    { 
      //For e.g. display your incoming data in RichTextBox 
      richTextBox1.Text += this.serialPort1.ReadLine();   

      //OR 
      ReadModem(); 
    } 
+0

J'ai ajouté la section DataReceived à SetModem() et ajouté un RichtextBox , mais cela ne peupler avec rien .... aurais-je besoin de se débarrasser de la fonction ReadModem()? – Stuart1044

+0

@ Stuart1044 place un point d'arrêt à l'événement DataReceived et vérifie si l'événement dataReceived est déclenché lors de la réception du RING. – Marshal

+0

hmm il saute juste au-dessus de sorte que port.DataReceived n'est pas défini, aucune idée de la raison pour laquelle cela se produirait? – Stuart1044