boa classe de porta serial para o .NET framework?
-
20-08-2019 - |
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.
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 ??li>
- 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