我应该使用哪种非托管API来控制串口?

时间:2011-04-13 14:27:39

标签: .net api serial-port unmanaged

saga继续......

我很快得出的结论是,我的串口设备过于苛刻,无法与SerialPort提供的System.IO.Ports类完美匹配。

为了令人信服地将自己作为供应商提供的软件,我试图匹配Portmonlogs here)和HHD's Free Serial Monitor所记录的对话的每个方面。使用托管(.NET)库,我无法复制以下内容:

  1. 特殊字符。如a separate question中所述,SerialPort不允许更改特殊字符集。它是likely that it's irrelevant,但我希望能够断然拒绝它。
  2. 细粒度超时。作为described on MSDN,有5个超时设置决定了最终的行为:

    • ReadIntervalTimeout(RI)
    • ReadTotalTimeoutMultiplier(RM)
    • ReadTotalTimeoutConstant(RC)
    • WriteTotalTimeoutMultiplier(WM)
    • WriteTotalTimeoutConstant(WC)。

    SerialPort.WriteTimeout(int)SerialPort.ReadTimeout(int)仅更改WC和RC设置,这是一个小问题,但它不是将其他设置保留为0,.NET设置将RI和RM设置为-1。 / p>

  3. 端口打开期间的查询。在打开端口和设置波特率之间,我的(.NET)应用程序和供应商提供的应用程序都会执行一堆查询,例如IOCTL_SERIAL_GET_LINE_CONTROL。 .NET增加了一些供应商的应用程序无法做到的事情,例如IOCTL_SERIAL_GET_MODEMSTATUS。我希望能够阻止这一点。

  4. 多余的重复。在端口打开期间,.NET会出于某种原因重复命令块(设置线路控制,波特,特殊字符和握手,清除RTS和DTR)。运行此块后,供应商提供的软件会直接跳转。

  5. 就像我上面说过的那样,我不知道这些差异是否是造成我困境的原因,但我希望能够找到答案。更重要的是,我认为对这个过程有更大的控制权,这将使我能够真正磨练这个问题,无论结果如何。

    我的问题是,如何直接挂钩到正确的API来控制串口的螺母和螺栓?任何建议或指导赞赏!

2 个答案:

答案 0 :(得分:0)

自从我完成连续剧以来已经很长时间了,但我记得这个人是一个非常好的资源 - 网站http://www.lvr.com/serport.htm。希望有所帮助。

答案 1 :(得分:0)

由于此主题处于活动状态似乎已经有一段时间了,但由于它没有解决方案,我认为我会回答完整性问题。

重新初始化的问题是因为SerialPort类使用的默认握手,我不知道它为什么这样做,但它真的很烦人,你可以通过跳过SerialPort属性并直接钻研来解决这个问题进入DCB结构。

我已经在C#中创建了一个完整的SerialPort类扩展方法的类,看一下我的回答over here on CodeProject

如果你决定走这条路,我建议直接跳过SerialPort.Write到SerialPort.BaseStream.Write,它们采用相同的参数,但我很确定SerialPort类会做额外不必要的初始化东西在那里,对SerialPort.Read做同样的事。