2009-02-01 8 views
2

Quelqu'un connaît-il une bonne classe (espérons-le) pour remplacer la classe .net SerialPort? Cela me cause des problèmes et j'en ai besoin d'un peu plus flexible.bonne classe de port série pour le framework .net?

See my other thread about my issues, mais essentiellement j'ai besoin de supprimer la IOCTL_SERIAL_SET_DTR et IOCTL_SERIAL_CLR_DTR commandes d'être émis quand j'ouvre le port, donc je besoin de quelque chose plus souple que la classe fournie par le framework .NET.

Répondre

4

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

Il crée fondamentalement un wrapper C# autour de la fonction série importée de kernel32.dll.

Vous pouvez également jeter un oeil à How to capture a serial port that disappears because the usb cable gets unplugged

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(); 
+0

Merci. J'ai vérifié celui-ci. Je n'étais pas un grand fan de l'utilisation d'un paquet alternatif, parce que je ne veux pas le maintenir, mais on dirait que j'ai été forcé de le faire. Ce paquet est plutôt bon même si j'ai apporté quelques modifications mineures pour améliorer le rapport d'erreurs. Merci. – Jeremy

0

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

  • Obtenir le code source de System.IO.Ports.SerialPort en utilisant Reflector ou similaire
  • Modifier cette source le code que vous aimez
  • Reconstruit la copie modifiée dans un autre espace de noms, et l'utiliser
0

La norme SerialPort .NET n'est pas une classe scellée - une chance que vous pouvez obtenir le comportement que vous avez besoin d'une sous-classe?

+0

Non, mais SerialPort utilise la classe SerialStream pour effectuer le travail réel, qui est interne et scellé, et la classe UnsafeNativeMethods qui est interne. – Jeremy

Questions connexes