2 votes

Divisez le message en communication série

Je suis nouveau dans la communication série. J'ai lu quelques tutoriels, et la plupart de ce que j'essaie de faire fonctionne, cependant j'ai une question concernant la communication série avec C#. J'ai un microcontrôleur qui envoie constamment des données via une ligne série. Les données sont dans ce format : bxxxxixx.xx,xx.xx* où les x représentent différents chiffres, signes + ou -. À certains moments, je souhaite lire ces informations depuis mon programme C# sur mon PC. Le problème que j'ai est que mes messages semblent être divisés à des positions aléatoires même si j'utilise ReadTo("*"); Je pensais que cela allait lire tout jusqu'au caractère *. Comment puis-je m'assurer que le message que j'ai reçu est complet?

Merci pour votre aide.

public string receiveCommandHC()
{

    string messageHC = "";
    if (serialHC.IsOpen)
    {
        serialHC.DiscardInBuffer();
        messageHC = serialHC.ReadTo("*");

    }
    return messageHC;
}

3voto

Joachim Isaksson Points 85969

Je ne suis pas sûr de pourquoi vous le faites, mais vous jetez tout ce qui se trouve dans le tampon d'entrée des ports série juste avant de lire, donc si l'ordinateur a déjà reçu "bxxx" à ce moment-là, vous le jetez et vous ne lirez que "xixx.xx,xx.xx".

1voto

Marc Gravell Points 482669

Je vais deviner que vous recevez en fait les fin de commandes, c'est-à-dire au lieu de recevoir b01234.56.78.9 (en omettant le dernier *), vous recevez (par exemple) .56.78.9. Cela est dû au fait que vous avez jeté le tampon d'entrée. Ne faites pas ça. Vous ne pouvez pas connaître l'état à ce moment-là (juste avant une lecture), donc jeter le tampon est tout simplement incorrect. Supprimez la ligne serialHC.DiscardInBuffer();.

1voto

ChrisBD Points 5795

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X