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

问题描述 投票:0回答:2

传奇仍在继续...

我很快得出结论,我的串行设备太挑剔了,无法与

SerialPort
提供的
System.IO.Ports
类很好地配合。

为了令人信服地将自己冒充为供应商提供的软件,我尝试匹配由 Portmon此处记录)和 HHD 的免费串行监视器 记录的对话的各个方面。使用托管 (.NET) 库,我无法复制以下内容:

  1. 特殊字符。如一个单独的问题中所述,SerialPort 不允许更改特殊字符集。 可能是无关紧要的,但我希望能够断然拒绝它。
  2. 细粒度超时。正如 MSDN 上所描述的,有 5 种超时设置决定了结果行为:

      ReadIntervalTimeout
    • (RI)
    • ReadTotalTimeoutMultiplier
    • (RM)
    • ReadTotalTimeoutConstant
    • (RC)
    • WriteTotalTimeoutMultiplier
    • (西马)
    • WriteTotalTimeoutConstant
    • (厕所)。
      
      
      
    SerialPort.WriteTimeout(int)

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

  3. 开港期间查询

    。在打开端口和设置波特之间,我的 (.NET) 应用程序和供应商提供的应用程序都会执行一系列查询,例如 IOCTL_SERIAL_GET_LINE_CONTROL。 .NET 添加了一些供应商的应用程序不具备的功能,例如

    IOCTL_SERIAL_GET_MODEMSTATUS
    。我希望能够阻止这一切。
    
    

  4. 多余的重复

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

  5. 就像我上面说的,我不知道这些差异是否是造成我痛苦的原因,但我希望能够找出答案。更重要的是,我认为对过程有更好的控制将使我能够真正解决问题,无论结果是什么。

我的问题是,如何直接连接到正确的 API 以在具体层面上控制串行端口?任何建议或指导表示赞赏!

.net serial-port unmanaged
2个回答
0
投票
http://www.lvr.com/serport.htm

。希望有帮助。


0
投票

您的重新初始化问题是由于 SerialPort 类使用的默认握手而发生的,我不知道为什么会这样做,但这真的很烦人,您可以通过跳过 SerialPort 属性并直接深入研究来解决这个问题DCB结构。

我在 C# 中创建了一个类,其中包含 SerialPort 类的扩展方法,请查看我的答案

在 CodeProject 上

如果您确实决定走这条路,我建议直接跳过 SerialPort.Write 到 SerialPort.BaseStream.Write,它们采用相同的参数,但我很确定 SerialPort 类在那里做了额外不必要的初始化工作,对 SerialPort.Read 执行相同操作。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.