Une partie d'un programme que je modifie implique la communication via un port série à l'aide d'une bibliothèque propriétaire. Malheureusement, cette bibliothèque n'a pas le même SerialPort.DataReceived event que l'espace de noms System.IO.Ports contient. En fait, il n'a pas d'événement que ce soit, mais il ne dispose de deux fonctions qui peuvent probablement être utilisés de manière similaire:Soulever un événement lorsqu'une fonction renvoie Vrai
Port.WaitForData (heure int)
Cette fonction attend la quantité de temps donnée pour recevoir certaines chaînes précédemment spécifiées sur le port. Il renvoie 1 pour oui, a reçu la chaîne, ou 0 pour non, n'a pas reçu de chaîne, a expiré.
Port.IsReceiveBufferEmpty()
Cette fonction retourne une valeur booléenne de oui, le tampon de réception est vide ounon, la mémoire tampon de réception contient des données.
Il me semble que je vais devoir créer un fil pour être en boucle en continu chaque fois que le port est ouvert et faire une de ces deux choses:
Pour chaque boucle, appelez WaitForData (certains grand nombre) avec les chaînes spécifiées, il cherche à mettre "", ou vbCrLf, ou quelque chose d'autre que je peux confirmer, il recevra à chaque fois que les données sont envoyées. S'il trouve quelque chose, lisez-le et écrivez dans une zone de texte. Si WaitForData ne trouve rien, bouclez à nouveau.
Pour chaque boucle, appelez IsReceiveBufferEmpty(), et si ce n'est pas le cas, lisez-le et écrivez dans une zone de texte.
Quelle est la meilleure façon d'y parvenir? Les premières options me semblent potentiellement plus efficaces, bien que je ne sache presque rien de la façon dont ces méthodes fonctionnent sous le capot. Évidemment, je veux que mon formulaire reste réactif quand je fais cela, alors comment dois-je faire pour boucler continuellement sans figer le formulaire, mais être capable de lire toutes les données entrantes?
Merci pour votre aide.
écrire une telle API pour un usage général serait différent de l'optimiser pour l'application que vous écrivez. nous ne savons rien de votre application. une chose est «... écrire dans une zone de texte ...» vous ne pourrez pas faire cela à partir de n'importe quelle solution à base de threads. Je soulèverais un événement et fournirais les données reçues et laisserais le consommateur traiter avec lui. – Plutonix
@Plutonix Je ne sais pas exactement comment simuler un événement DataReceived dans mon code, et j'essaie de trouver la meilleure façon de le faire. L'application prend l'entrée à partir d'une zone de texte, l'envoie au port, puis lit tout ce qui revient du port. Y a-t-il plus d'informations dont vous avez besoin pour pouvoir décrire de manière générale comment procéder? Mes solutions ci-dessus ont-elles un sens? En outre, dans les applications multithread, je peux utiliser Invoke ou quelque chose de similaire pour écrire dans les composants de formulaire, correct? – Django
Pouvez-vous utiliser 'Async/Await' (VS 2012+/.NET 4.5+ - ou 4.0 avec quelques librairies supplémentaires)? – Mark