Une grande partie de la difficulté entourant le port série est centrée autour d'une hypothèse. L'hypothèse est que le port série reçoit des données en morceaux qui sont pratiques, et ce qui est attendu.
Voici un exemple. Je sais que mon récepteur GPS envoie des lignes (se termine avec CRLF). Ceci est un exemple de l'une des phrases NMEA:
$ GPGSV, 3,1,11,10,75,053,29,29,52,311,32,24,50,298,30,02,39,073,30 * 77
Cependant, le gestionnaire d'événements DataReceived des ports série peut (à plusieurs reprises sur mon PC) déclencher plusieurs fois avec des segments de ces données.
feu événement
- Données
1 $
2 GPGSV,3,1,11,10
3 ,75,053,29,29,52,311,32,24,50,298,30,02,39,073,30*77
Au lieu de combattre cela, je créé des routines qui reçoivent des données à chaque fois que l'événement se déclenche, et la file d'attente vers le haut. Quand j'ai besoin des données, j'appelle d'autres routines qui rassemblent les données en tailles de blocs Je veux. Donc, en utilisant mon exemple la première et la deuxième fois que j'appelle la ligne de lecture (ma ligne de lecture), je reçois une réponse vide. La troisième fois, je récupère toute la phrase NMEA.
La mauvaise nouvelle est que je ne fais pas de C#. Le code est ici SerialPort
Selon la vitesse des ports, les délégués peuvent ne pas être un bon choix. J'ai testé mes routines à près de 1Mbps en utilisant des délégués, et n'utilisant pas de délégués. À ces vitesses, ne pas utiliser les délégués était un meilleur choix.
Voici quelques conseils de ceux qui savent
Kim Hamilton
@dbasnett - si vous avez une chaîne de terminaison connue, une autre approche est de définir la propriété SerialPort.NewLine (http://msdn.microsoft.com/en-us/library /system.io.ports.serialport.newline.aspx) à CRLF, puis utilisez SerialPort.ReadLine() (http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.readline. aspx). Cela vous assure d'obtenir des paquets complets. – mtrw