Question

Quelqu'un connaît-il une bonne classe (espérons-le gratuite) pour remplacer la classe .net SerialPort? Cela me cause des problèmes et j'en ai besoin d'un qui soit légèrement plus flexible.

Voir mon autre sujet à propos de mes problèmes , mais je dois essentiellement supprimer IOCTL_SERIAL_SET_DTR et Les commandes IOCTL_SERIAL_CLR_DTR étant émises lorsque j'ouvre le port, j'ai besoin de quelque chose de plus flexible que la classe fournie par le framework .net.

Était-ce utile?

La solution

Il y a plusieurs années, j'avais utilisé OpenNETCF.IO.Serial avant que le support série ne soit ajouté à .net. C'est pour le cadre compact, mais je l'ai utilisé à la fois pour les appareils compacts et les applications Windows classiques. Vous obtenez le code source afin de pouvoir le modifier vous-même, ce que j'ai fait.

Il crée essentiellement un wrapper c # autour de la fonction série importée hors de kernel32.dll.

Vous pouvez également consulter Comment capturer un port série qui disparaît car le câble USB est débranché

Voici le code que je l'appelais

     using OpenNETCF.IO.Serial;

     public static Port port;
     private DetailedPortSettings portSettings;
     private Mutex UpdateBusy = new Mutex();

     // create the port
     try
     {
        // create the port settings
        portSettings = new HandshakeNone();
        portSettings.BasicSettings.BaudRate=BaudRates.CBR_9600;

        // create a default port on COM3 with no handshaking
        port = new Port("COM3:", portSettings);

        // define an event handler
        port.DataReceived +=new Port.CommEvent(port_DataReceived);

        port.RThreshold = 1;    
        port.InputLen = 0;      
        port.SThreshold = 1;    
        try
        {
           port.Open();
        }
        catch
        {
           port.Close();
        }
     }
     catch
     {
        port.Close();
     }

     private void port_DataReceived()
     {

        // since RThreshold = 1, we get an event for every character
        byte[] inputData = port.Input;

        // do something with the data
        // note that this is called from a read thread so you should 
        // protect any data pass from here to the main thread using mutex
        // don't forget the use the mutex in the main thread as well
        UpdateBusy.WaitOne();
        // copy data to another data structure
        UpdateBusy.ReleaseMutex();

     }

     private void port_SendBuff()
     {
        byte[] outputData = new byte[esize];
        crc=0xffff;
        j=0;
        outputData[j++]=FS;
        //  .. more code to fill up buff
        outputData[j++]=FS;
        // number of chars sent is determined by size of outputData
        port.Output = outputData;
     }

     // code to close port
     if (port.IsOpen)
     {
        port.Close();
     }
     port.Dispose();

Autres conseils

Je n'ai pas essayé, mais vous pouvez peut-être:

  • Obtenez le code source de System.IO.Ports.SerialPort en utilisant Reflector ou similaire
  • Modifiez le code source à votre guise
  • Reconstruisez la copie modifiée dans un espace de noms différent et utilisez-la

Le port série standard .NET n'est pas une classe scellée. Vous avez-vous une chance d'obtenir le comportement souhaité dans une sous-classe?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top