Cette question assez simple cette fois-ci. J'ai une application qui communique avec une autre copie de l'application sur d'autres machines. Une application envoie un flux de données assez constant, l'autre le reçoit.Amélioration d'une connexion SerialPort
Le code pour envoyer des données se présente comme suit (où serialPort
est une instance de la classe System.IO.Ports.SerialPorts
en C# .Net 2.0):
private void bgDataWorker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e){
try{
string tempStr = Convert.ToString(String.Format("{0:0.000000}", data));
serialPort.Write(tempStr); // Write "data" out to 6 decimal places
}
catch (TimeoutException){ }
catch (InvalidOperationException err){ // Port is obstructed or closed
this.Invoke((MethodInvoker)delegate{
MessageBox.Show(this, "Couldn't send wireless data:\n\n" +
err.ToString(), "NanoMETER - Wireless Error (Data)",
MessageBoxButtons.OK, MessageBoxIcon.Error);
Global.remoteEna = false;
serialPort.Close();
usingBT = false;
});
}
}
Il est appelé une minuterie. Le code réception est encore plus simple:
private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) {
string buffer = serialPort.ReadExisting();
HandleInput(buffer);
}
reçoit les données envoyées et traitées et il est bien beau, mais il y a un peu saccadées indésirables où il est soit de ne pas envoyer de manière fiable des données à un débit constant, ou il est pas ramasser tout . Je ne suis pas sûr si cela peut être corrigé dans mon code, ou si c'est juste la nature d'avoir quelques machines lentes et une connexion bluetooth éventuellement shakey. Aucune suggestion?
pourquoi est-il appelé sur une minuterie? Ne devrait-il pas être déclenché par un événement? – Fosco
Un Bgw DoWork() est appelé à partir d'un minuteur? –
@Fosco: Les données changent constamment en raison d'événements dans la minuterie. Mais je pense que je comprends que vous suggérez qu'il devrait être appelé dès que la valeur des données sera mise à jour. Incidemment, il serait encore sur une minuterie, et probablement ne fait pas beaucoup de différence, mais je comprends la logique. Note: J'adapte un ancien programme VB6 à C# (une langue que je ne connaissais pas il y a 2 mois) pour un stage ... on pourrait donc s'attendre à des WTF. – KChaloux