Pergunta

Alguém sabe de uma boa classe (espero livre) para substituir a classe SerialPort .net? É causando-me problemas e eu preciso de um que é um pouco mais flexível.

Veja meu outro segmento sobre as minhas questões , mas essencialmente eu preciso suprimir o IOCTL_SERIAL_SET_DTR e comandos IOCTL_SERIAL_CLR_DTR de ser emitido quando eu abrir a porta, então eu preciso de algo mais flexível do que a classe fornecido pelo framework .NET.

Foi útil?

Solução

Vários anos atrás eu costumava OpenNETCF.IO.Serial antes de o suporte serial foi adicionado em .net. É para o quadro compacto, mas eu usei-o para ambos os dispositivos compactos e aplicativos janelas regulares. Você obter o código fonte para que você possa modificá-lo a si mesmo que é o que eu fiz.

Ele basicamente cria um c # wrapper em torno da função de série importados fora do kernel32.dll.

Você também pode querer ter um olhar para Como capturar uma porta serial que desaparece porque o cabo USB é desconectado

Aqui está o código que eu costumava chamá-lo

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

Outras dicas

Eu não tentei tentei isso, mas, talvez, você pode:

  • Obter o código-fonte do System.IO.Ports.SerialPort usando refletor ou similar
  • Alterar esse código-fonte como você gosta
  • Reconstruído a cópia modificada em um namespace diferente, e usá-lo

O padrão .NET SerialPort não é uma classe selada -? Qualquer chance que você pode obter o comportamento que você precisa de uma subclasse

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top