2010-09-25 4 views
3

J'essaie de lire les données d'une interface RS232 échelle. Il envoie un flux de chaîne ASCII continu à travers le port série que j'ai du mal à obtenir. Je veux juste obtenir une ligne des données qu'il envoie. Je suppose que j'ai supposé que j'utiliserais Readline pour obtenir les données, mais cela verrouille simplement le PC quand je l'exécute. Je pense qu'il essaie d'obtenir toutes les données et ne s'arrêtera pas jusqu'à ce que les données s'arrêtent? Voici le code J'utilise:Lecture à partir du port série verrouille

private void button1_Click(object sender, EventArgs e) 
    { 
     serialPort1.PortName = "COM4"; 
     serialPort1.BaudRate = 9600; 
     serialPort1.DataBits = 8; 
     serialPort1.Parity = Parity.None; 
     serialPort1.StopBits = StopBits.One; 

     //opening the serial port 
     serialPort1.Open(); 

     string str = serialPort1.ReadLine(); 

     MessageBox.Show(str); 

     serialPort1.Close(); 

    } 

Pouvez-vous me aider à déterminer comment obtenir une seule ligne des données de sortie et fermer la connexion?

+0

Lorsque vous dites "verrouille le PC", est-ce que cela bloque réellement l'ensemble du PC, ou seulement votre programme? –

+0

Désolé, je voulais dire qu'il verrouille le programme. – muncherelli

+0

@user: ce fil a l'air de me répondre. De quoi d'autres avez-vous besoin? –

Répondre

2

SerialPort.ReadLine est défini pour bloquer "jusqu'à la première occurrence d'une valeur NewLine", où NewLine par défaut à un saut de ligne. Envoyez-vous un saut de ligne dans votre flux? Notez qu'un caractère saut de ligne (ASCII 0x0A) est différent d'un retour chariot (ASCII 0x0D) que vous pourriez envoyer.

Vous pouvez redéfinir NewLine si nécessaire, ou si une fin de ligne ne vous semble pas correcte, vous pouvez lire jusqu'à une chaîne donnée avec SerialPort.ReadTo. Vous pouvez également définir un read timeout.

Vous pouvez préférer lire un nombre donné d'octets à partir du port plutôt que d'une ligne avec l'une des surcharges SerialPort.Read. Si rien de tout cela ne s'applique, assurez-vous que vous envoyez réellement des données là où vous pensez être - appelez HyperTerminal/TeraTerm/votre terminal série préféré, configurez-le avec les mêmes paramètres de port série que ceux que vous avez utilisés ci-dessus et assurez-vous de voir les données que vous vous attendez à voir.

0

Une solution idéale serait de générer un thread de travail pour lire réellement à partir du port série (ainsi, le thread peut être bloqué toute la journée sans gêner votre thread d'application principal). Une fois les données reçues, il peut diffuser un événement notant que des données ont été reçues et quelles sont ces données. Le thread communiquera avec le thread d'application principal via l'événement.