2

有没有人知道一个好的(希望是免费的)类来代替 .net SerialPort 类?它给我带来了问题,我需要一个稍微灵活一点的。

请参阅有关我的问题的其他线程,但基本上我需要在打开端口时禁止发出 IOCTL_SERIAL_SET_DTR 和 IOCTL_SERIAL_CLR_DTR 命令,因此我需要比 .net 框架提供的类更灵活的东西。

4

3 回答 3

4

几年前,在将串行支持添加到 .net之前,我使用了OpenNETCF.IO.Serial 。它适用于紧凑型框架,但我将它用于紧凑型设备和常规 Windows 应用程序。你得到源代码,这样你就可以自己修改它,这就是我所做的。

它基本上围绕从 kernel32.dll 导入的串行函数创建 ac# 包装器。

您可能还想看看如何捕获由于 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();
于 2009-02-01T05:10:21.547 回答
1

我没有尝试过,但也许你可以:

  • System.IO.Ports.SerialPort使用Reflector或类似工具获取源代码
  • 根据需要更改该源代码
  • 在不同的命名空间中重建修改后的副本,并使用它
于 2009-02-01T05:22:28.307 回答
0

标准的 .NET SerialPort 不是一个密封的类——你有没有机会从一个子类中获得你需要的行为?

于 2009-02-01T09:29:45.423 回答