хороший класс последовательного порта для .NET Framework?

Кто-нибудь знает хороший (надеюсь, бесплатный) класс для замены класса .net SerialPort? Это вызывает у меня проблемы, и мне нужен более гибкий вариант.

См. другую ветку о моих проблемах, но по сути мне нужно подавить команды IOCTL_SERIAL_SET_DTR и IOCTL_SERIAL_CLR_DTR из выдается, когда я открываю порт, поэтому мне нужно что-то более гибкое, чем класс, предоставляемый фреймворком .net.


person Jeremy    schedule 01.02.2009    source источник


Ответы (3)


Несколько лет назад я использовал OpenNETCF.IO.Serial до того, как в .net была добавлена ​​последовательная поддержка. Он предназначен для компактного фреймворка, но я использовал его как для компактных устройств, так и для обычных приложений Windows. Вы получаете исходный код, чтобы вы могли изменить его самостоятельно, что и сделал я.

По сути, он создает оболочку C # для последовательной функции, импортированной из kernel32.dll.

Вы также можете ознакомиться с Как захватить последовательный порт, который исчезает из-за отсоединения кабеля USB

Вот код, который я использовал, чтобы называть это

     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();
person Rex Logan    schedule 01.02.2009
comment
Спасибо. Я проверил это. Я не был большим поклонником использования альтернативного пакета, потому что я не хочу его поддерживать, но похоже, что я был вынужден это сделать. Этот пакет довольно хорош, хотя я внес несколько незначительных изменений для улучшения отчетов об ошибках. Спасибо. - person Jeremy; 03.02.2009

Я не пробовал это делать, но, возможно, вы сможете:

  • Получите исходный код от System.IO.Ports.SerialPort с помощью Reflector или аналогичного
  • Измените исходный код по своему усмотрению
  • Восстановите измененную копию в другом пространстве имен и используйте ее
person ChrisW    schedule 01.02.2009

Стандартный .NET SerialPort не является запечатанным классом - есть ли шанс получить нужное поведение от подкласса?

person Bevan    schedule 01.02.2009
comment
Нет, но SerialPort использует класс SerialStream для выполнения фактической работы, который является внутренним и запечатанным, и класс UnsafeNativeMethods, который является внутренним. - person Jeremy; 02.02.2009