22 votes

Comment puis-je utiliser l'événement dataReceived de l'objet portuaire SerialPort en C# ?

J'essaie de créer une petite application pour collecter les données reçues d'un capteur externe connecté à COM10. J'ai réussi à créer un petit objet de console C# et une application qui ouvre le port et transmet les données à un fichier pendant une période fixe en utilisant une boucle for.

Je voudrais convertir cette application pour utiliser l'événement dataReceived à la place du flux. Après avoir lu le Les 5 meilleures astuces de SerialPort Je n'arrive toujours pas à le faire fonctionner et je ne sais pas ce qui me manque. J'ai réécrit l'application console de sorte que tout le code se trouve dans Main et est collé ci-dessous. Quelqu'un peut-il m'expliquer pourquoi le gestionnaire d'événement port_OnReceiveDatazz n'est pas appelé alors que je sais que des données sont envoyées au port par le matériel ?

Gracias

Merci à @Gabe , @Jason Down y @abatishchev pour toutes les suggestions. Je suis dans l'impasse et je n'arrive pas à faire fonctionner le gestionnaire d'événements. Peut-être que cela a quelque chose à voir avec l'appareil. Je peux me contenter de lire le port dans un thread et de transmettre les données directement au fichier.


Code


namespace serialPortCollection
{   class Program
    {
        static void Main(string[] args)
        {

            const int bufSize = 2048;
            Byte[] buf = new Byte[bufSize]; //To store the received data.

            SerialPort sp = new SerialPort("COM10", 115200);
            sp.DataReceived += port_OnReceiveDatazz; // Add DataReceived Event Handler

            sp.Open();
            sp.WriteLine("$"); //Command to start Data Stream

            // Wait for data or user input to continue.
            Console.ReadLine();

            sp.WriteLine("!"); //Stop Data Stream Command
            sp.Close();
        }

       // My Event Handler Method
        private static void port_OnReceiveDatazz(object sender, 
                                   SerialDataReceivedEventArgs e)
        {
            SerialPort spL = (SerialPort) sender;
            const int bufSize = 12;
            Byte[] buf = new Byte[bufSize];
            Console.WriteLine("DATA RECEIVED!");
            Console.WriteLine(spL.Read(buf, 0, bufSize));
        }
    }
}

1voto

Bart de Boer Points 196

Cela pourrait très bien être le Console.ReadLine en bloquant l'appel de votre Console.Writeline en fait. L'exemple sur MSDN est PRESQUE identique, sauf qu'ils utilisent ReadKey (qui ne verrouille pas la console).

0voto

MikeZ Points 98

Sachez que l'utilisation de .NET/C# et de tout port COM supérieur à COM9 pose des problèmes.

Ver: HOWTO : Spécifier des ports série plus grands que COM9

Il existe une solution de contournement dans le format : " \\.\COM10 "qui est pris en charge par la méthode CreateFile sous-jacente, mais .NET empêche l'utilisation de ce format de contournement ; ni le constructeur SerialPort ni la propriété PortName ne permettent un nom de port qui commence par "\".

Je me suis battu pour obtenir des communications fiables vers COM10 en C#/.NET. Par exemple, si j'ai un appareil sur COM9 et COM10, le trafic destiné à COM10 va vers l'appareil sur COM9 ! Si je supprime le périphérique sur COM9, le trafic COM10 va vers le périphérique sur COM10.

Je n'ai toujours pas compris comment utiliser le handle renvoyé par CreateFile pour créer un objet SerialPort de style C#/.NET. Si je savais comment faire, je pense que je pourrais utiliser COM10+ très bien à partir de C#.

0voto

DR.Kotikoff Points 1
switch(e.EventType)
{
  case SerilData.Chrs:
  {
    // means you receives something
    break;
  }
  case SerialData.Eo:
  {
    // means reciving ended
    break;
  }
}

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