2010-06-01 6 views
1

J'ai besoin d'effacer les données sur le port série quand j'ai lu les données avant que je relis les données? J'utilise c/C++ sur Windows XPPuis-je effacer le port série à chaque fois après avoir lu les données?

comment puis-je faire?

merci à l'avance.

+5

Il n'existe pas de langage tel que C/C++, ni C ni C++ ne prend en charge les ports série. Cela doit être fourni par votre système d'exploitation - lequel utilisez-vous? –

+0

En outre, vous n'avez pas besoin de "effacer les données" après l'avoir lu. Les ports série sont presque toujours implémentés avec des tampons FIFO. La lecture d'un octet le supprime de ce tampon. – MSalters

+0

Le problème que je vois avec ceci est que les données arrivent à un port série de manière asynchrone. Tout ce que vous savez, c'est que les données que vous venez de lire sont déjà arrivées. Dans le moment suivant, de nouvelles données pourraient être arrivées - ou pas. Lorsque vous videz le port, vous ne savez même pas si vous jetez des données, ni combien ou quoi.Je n'ai aucune expérience avec les protocoles de communication série, alors peut-être que je manque quelque chose d'évident, mais cela me semble étrange. – sbi

Répondre

1

La norme C++ dispose d'interfaces pour l'écriture dans des fichiers, à l'écran et dans un journal. Il a aussi des interfaces pour lire des fichiers et lire des "entrées standard". Il n'y a pas de manière standard d'interagir avec les ports série, les connexions réseau, etc.

Heureusement, votre système d'exploitation ou votre plate-forme aura une interface pour cela. Mais (1) ce que vous devez faire pour lire à partir d'une connexion série, et (2) ce que vous devez faire entre les lectures consécutives, et (3) comment le faire sont tous dépendants de la plate-forme.


En regardant some Microsoft Documentation, vous ne devez pas « effacer le port » du tout. Mais quand un drapeau est positionné pour signaler quelque chose - par exemple qu'une erreur s'est produite - alors vous devez réinitialiser le drapeau avant de continuer. Bien sûr, vous réinitialisez le drapeau après en manipulant tout ce que le drapeau était censé signaler.

3

La purge du tampon de réception est presque toujours fausse. Les communications par port série sont asynchrones par nature, vous risquez de supprimer de bonnes données. Uniquement si vous utilisez un protocole maître-esclave (le périphérique ne transmet que lorsque l'hôte le demande) permet la purge. Mais alors, si le tampon de réception a réellement des données à purger, alors vous ignorez une violation de protocole, quelque chose que vous ne voulez jamais ignorer.

La communication par port série fiable nécessite un protocole. Une somme de contrôle pour vérifier l'intégrité du message et la prise de contact ACK/NAK pour récupérer à partir de la corruption de données. Découvrez le protocole RATP, décrit dans la RFC 916. Largement ignoré btw mais je l'ai utilisé dans le passé. Sa seule faiblesse est les tentatives de connexion avec tampon.

1

La solution suivante est pas le meilleur, mais il convient à de nombreux cas:

Lire un grand nombre d'octets à partir du port série rendu vide. Par exemple:

ReadFile (Port, TMP, 4096, & ioread, NULL);

tmp []: est la variable qui contiendra les données que vous ne voulez pas (données flush) IOREAD: Nombre d'octets lus

Ainsi, le ci-dessus va lire 4096 octets à partir du port série. Vous pouvez augmenter le nombre pour vous assurer que vous vous retrouvez avec un port propre après l'instruction.

P.S. Je l'avais utilisé avec Visual Studio 2010, C++, Windows 7 - 64 bits