Pregunta

¿Alguien sabe de una buena clase (con suerte gratis) para reemplazar la clase .net SerialPort? Me está causando problemas y necesito uno que sea un poco más flexible.

Ver mi otro hilo sobre mis problemas , pero esencialmente necesito suprimir el IOCTL_SERIAL_SET_DTR y Los comandos IOCTL_SERIAL_CLR_DTR no se emiten cuando abro el puerto, por lo que necesito algo más flexible que la clase proporcionada por el marco .net.

¿Fue útil?

Solución

Hace varios años usé OpenNETCF.IO.Serial antes de que se agregara soporte en serie a .net. Es para el marco compacto, pero lo usé tanto para dispositivos compactos como para aplicaciones normales de Windows. Obtiene el código fuente para que pueda modificarlo usted mismo, que es lo que hice.

Básicamente crea un contenedor de C # alrededor de la función serial importada de kernel32.dll.

También es posible que desee echar un vistazo a Cómo capturar un puerto serie que desaparece porque el cable usb se desenchufa

Aquí está el código que solía llamarlo

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

Otros consejos

No lo he intentado, pero tal vez puedas:

  • Obtenga el código fuente de System.IO.Ports.SerialPort utilizando Reflector o similar
  • Cambia ese código fuente como quieras
  • Reconstruyó la copia modificada en un espacio de nombres diferente y úsela

El .NET SerialPort estándar no es una clase sellada: ¿hay alguna posibilidad de que pueda obtener el comportamiento que necesita de una subclase?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top