La lecture à partir du port série en C#
J'ai essayé d'utiliser Readline() et des données est perdu, j'ai essayé d'utiliser Read() mais je ne suis pas sûr de savoir comment une erreur de la preuve de la méthode de le faire, depuis que je puisse obtenir plusieurs paquets l'un après l'autre et je n'ai aucun moyen de savoir qu'il va être un autre paquet qui arrive. Entre les paquets BytesToRead est 0, donc je ne peux pas l'utiliser. Lors de la lecture des données de la mémoire tampon vous avez une minuterie ou mettre le fil de sommeil pour permettre à tous les paquets à l'arrivée?
Je suis perdu. Ne sais pas quoi essayer.
Je dois mentionner que je n'ai pas de garantie que la chaîne vient de le port série sera terminée par \n ou \r ou \r\n. J'ai simplement besoin d'un infaillible moyen de lire TOUS les paquets qui viennent de l'ampleur lorsque l'utilisateur appuie sur IMPRIMER.
Quelqu'un a répondu ici avec l'idée que j'ai aimé: en attente d'une certaine quantité de temps pour tous les paquets, mais ils ont effacé de leur réponse. Toute chance vous pourriez re-post?
OriginalL'auteur sarsnake | 2009-03-13
Vous devez vous connecter pour publier un commentaire.
Avez-vous essayé l'écoute de la
DataRecieved
cas de laSerialPort
classe?OriginalL'auteur Samuel
Nous sommes passés par le même processus il y a un moment.
Le seul moyen de lire les "paquets", c'est avoir la notion de l'endroit où le début et la fin d'entre eux sont dans un flux.
De msdn:
Nous avons utilisé un fond de thread (vous pouvez utiliser un BackgroundWorker) pour lire les données dans une mémoire tampon.
Si vous ne pouvez pas fiable définir le caractère de terminaison à l'aide de la SerialPort.De retour à la ligne de propriété (parce que, disons, il varie!) ensuite, vous aurez besoin de mettre en place votre propre paquet de détection de système parce que vous ne serez pas en mesure d'utiliser le blocage SerialPort.Readline() la méthode.
Vous pourrait lire dans un tampon d'octets à l'aide de SerialPort.Lire() (ou une chaîne à l'aide de la SerialPort.ReadExisting() la méthode) et de générer un événement lorsque vous détectez un paquet valide dans les données. Notez que Read() (et je suppose ReadExisting() ) vide le SerialPort du tampon, de sorte que vous aurez besoin de garder les données à un autre endroit.
Si vous définissez la SerialPort.ReadTimeout, vous pouvez gérer le TimeoutException et avoir un moyen facile de gérer des conditions où votre appareil n'est pas en train de transmettre. C'est un bon moyen pour réinitialiser votre paquet de détection si vous utilisez un nombre fixe d'octets, ou certains autres non-terminé régime. (utiliser SerialPort.DiscardInBuffer() sur un délai d'attente si vous n'avez pas besoin partielle des paquets).
Bonne chance
Nous utilisons beaucoup de l'échelle industrielle et à vous pouvez normalement régler le caractère de fin dans l'appareil. Pensez-vous avoir le contrôle sur les appareils d'entrée de sorte que vous pourrait ressembler à cela? ReadLine est bien de plus facile 🙂
nous n': \n (ascii 13). Ce que je vais essayer de faire est de lire les données octet par octet avec SerialPort.ReadByte() et de regarder 13. Je suis également aller à définir SerialPort.De retour à la ligne \n ( je l'ai mis à \r\n....hmmm, peut-être que c'est la question. Merci!
désolé pour le charabia:) au début, j'avais SerialPort.De retour à la ligne définie sur \n mais cela ne fonctionne pas c'est pourquoi je suis passé à \r\n. J'ai utilisé ReadLine jusqu'à maintenant.
OriginalL'auteur Byron Ross
Depuis octets peuvent venir à tout moment, de mise en mémoire tampon des données entrantes est critique. Donc, vous devriez
Je me demandais simplement si vous rencontrez toujours des problèmes avec le port série. Si oui, j'ai développé un port série langage de programmation C# et je crois qu'il résout presque tous les problèmes que chacun rencontre avec.
Vous s'il vous plaît prendre un coup d'oeil et de l'essayer ? Par exemple, vous pouvez tampon de données entrantes sur le port série comme la suivante et de faire des opérations sur les chaînes facilement.
Projet est disponible gratuitement sur le site de sourceforge et si vous avez des questions, n'hésitez pas à demander.
Page D'Accueil Du Projet
Lien De Téléchargement
OriginalL'auteur albay