Vous constaterez presque toujours dans les communications série que les messages de données (à moins qu'ils ne soient très petits) sont divisés. Cela est dû principalement à la vitesse de la communication et au moment où vous récupérez les données du port.
Généralement, vous devez configurer votre code pour s'exécuter dans un thread séparé (afin d'éviter d'impact la performance du reste de votre code) qui déclenche un événement lorsqu'un message complet est reçu et qui prend également en charge les messages complets pour la transmission. La fonctionnalité de lecture et d'écriture est gérée par des threads de travail (le trafic des communications série est lent).
Vous aurez besoin d'un tampon de lecture et d'un tampon d'écriture. Ceux-ci doivent être suffisamment grands pour contenir des données pour plusieurs cycles.
Ajoutez les données lues de l'entrée à la fin de votre tampon de lecture. Faites en sorte que le tampon de lecture lise cycliquement les messages complets, à partir du début du tampon.
En fonction du protocole utilisé, il y a généralement un indicateur de début de données et peut-être un indicateur de fin de données, ainsi qu'une taille de message (celle-ci peut être fixe, encore une fois en fonction de votre protocole). Je suppose que d'après votre protocole, le caractère de début de message est 'b'
et que le caractère de fin de message est '*'
. Ignorez toutes les données précédant votre caractère de début de message ('b'), car celles-ci proviennent d'un message incomplet.
Lorsqu'un message complet est trouvé, supprimez-le du début du tampon et déclenchez un événement pour indiquer son arrivée.
Un processus similaire est utilisé pour l'envoi de données, sauf que vous devrez peut-être diviser le message, donc les données à envoyer sont ajoutées à la fin du tampon et les données à envoyer sont lues à partir du début.
J'espère que cela vous aidera à comprendre comment gérer les communications série.
Comme l'a souligné Marc, vous êtes actuellement en train de vider votre tampon d'une manière qui posera problème.
modifier
Comme je l'ai dit dans mon commentaire, je ne reconnais pas serialHC, mais si vous travaillez avec des données brutes, envisagez d'utiliser la classe SerialPort
. Plus d'informations sur la façon de l'utiliser et un exemple (qui utilise approximativement le processus que j'ai décrit ci-dessus) peuvent être trouvés ici.