2010-02-24 6 views
2

je fait une demande en C# qui envoie 11 octets de données à un port série en utilisant:problème avec SerialPort dans une application C#

  port = new SerialPort("COM1"); 
      port.BaudRate = 9600; 
      port.DataBits = 8; 
      port.Parity = Parity.None; 
      port.StopBits = StopBits.One; 
      port.ReadTimeout = 1000; 
      port.WriteTimeout = 1000; 
      port.Open(); 

      byte[] buffer = new byte[11]; 
      buffer[0] = 0; 
      buffer[1] = 0; 
      buffer[2] = 0; 
      buffer[3] = 3; 
      buffer[4] = 2; 
      buffer[5] = 4; 
      buffer[6] = 1; 
      buffer[7] = 20; 
      buffer[8] = 50; 
      buffer[9] = 0; 
      buffer[10] = 120; 
      port.Write(buffer, 0, 11); 

Puis j'ai écrit une autre application pour tester le précédent. Je voudrais vérifier si les 11 octets ont été correctement envoyés. Dans cette application, j'utilise:

 using (SerialPort port = new SerialPort("COM1")) 
     { 
      // configure serial port 
      port.BaudRate = 9600; 
      port.DataBits = 8; 
      port.Parity = Parity.None; 
      port.StopBits = StopBits.One; 
      port.Open(); 

      for (; ;) 
      { 
       byte[] b = new byte[11]; 
       port.Read(b, 0, 11); 
       StringBuilder sb = new StringBuilder(); 
       for (int i = 0; i < 11; ++i) 
       { 
        sb.Append(b[i]); 
        sb.Append(" "); 
       } 
       Console.WriteLine(sb.ToString()); 
      } 
     } 

pour recevoir des octets. Le problème est que, après avoir envoyé quelque chose comme ceci:

0 0 0 3 2 4 1 20 50 0 120 

Je reçois:

0 0 0 0 0 0 0 0 0 0 0 
0 0 3 2 1 4 20 50 0 120 0 

Pourquoi se fait-il? Quel genre d'erreur y a-t-il dans mon code? Merci

+2

Si vous observez le port série avec HyperTerminal, voit-il les 11 octets corrects? – mtrw

+0

@mtrw J'ai envoyé des données binaires et Hyper Terminal les montre avec des caractères étranges. Y a-t-il un moyen de les convertir dans un format numérique? –

+1

désolé j'ai raté votre question. Je ne connais pas de moyen de faire en sorte que HyperTerminal gère les données binaires, mais des outils comme PortMon (http://technet.microsoft.com/en-us/sysinternals/bb896644.aspx) sont utiles pour cette situation. Quoi qu'il en soit, je suis content que votre problème semble être résolu. – mtrw

Répondre

3

Vous ne vérifiez pas le résultat de port.Read(). Renvoie le nombre d'octets lu, pas le nombre d'octets demandé. La boucle de sortie doit ensuite utiliser ce résultat comme limite supérieure.

Bien que vous ayez configuré des délais d'attente côté envoi, vous en aurez également besoin sur le lecteur.

+0

J'ai résolu mon problème. Il y a deux façons. Le premier est ce que vous avez décrit. La seconde est: enregistrer un handle pour l'événement DataReceived et appeler Read with BytesToRead bytes. –

1

Pour vérifier ce qui se passe sur une connexion série sur mon pc j'utilise deux outils:

  • com0com: Un émulateur qui crée deux ports série sur un PC qui peut communiquer entre eux. Le seul inconvénient que j'ai rencontré, est que vous devez définir pour un port COM inférieur à 10.

  • Free Serial Port Monitor: Il renifle sur un port de communication et peut afficher chaque octet qui court sur la ligne. Le seul inconvénient que j'ai rencontré, c'est qu'il a parfois des problèmes pour se déconnecter et ne redémarre qu'après un redémarrage de l'ensemble du PC. Donc, si vous démarrez une session avec, assurez-vous de ne pas déconnecter ou fermer accidentellement l'application avant de fermer la connexion au sein de votre application de test.

+0

Des outils très utiles, merci beaucoup. –

Questions connexes