【问题标题】:Which unmanaged API should I use to control a serial port?我应该使用哪个非托管 API 来控制串行端口?
【发布时间】:2011-04-13 14:27:38
【问题描述】:

saga 继续...

我很快就得出结论,我的串行设备太苛刻了,不能很好地与System.IO.Ports 提供的SerialPort 类配合使用。

为了令人信服地将自己伪装成供应商提供的软件,我试图匹配Portmon (logs 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(厕所)。

    SerialPort.WriteTimeout(int)SerialPort.ReadTimeout(int) 只改变WC 和RC 设置,这是一个小问题,但它并没有将其他设置为0,而是将RI 和RM 设置为-1。

  3. 端口开放期间的查询。在打开端口和设置波特率之间,我的 (.NET) 应用程序和供应商提供的应用程序都会执行一系列查询,例如 IOCTL_SERIAL_GET_LINE_CONTROL。 .NET 添加了一些供应商的应用程序没有做的事情,例如IOCTL_SERIAL_GET_MODEMSTATUS。我希望能够阻止这种情况。

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

就像我上面所说的,我不知道这些差异是否是导致我陷入困境的原因,但我希望能够找出答案。更重要的是,我认为更好地控制流程将使我能够真正解决问题,无论结果如何。

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

【问题讨论】:

  • 直接处理串口的Win32 API很丑。虽然我为你接受挑战而鼓掌,但我可能会在你冒险之前推荐一个第 3 部分组件。我使用 CommStudio 已经有一段时间了,它非常适合我对定制硬件的需求。 commstudio.com/commstudio
  • 感谢您的好意,但我买不起。
  • 哈哈!太好了-谢谢布拉德!我会试试看的。

标签: .net api serial-port unmanaged


【解决方案1】:

很久没做连续剧了,不过我记得这个人是个很好的资源——网站http://www.lvr.com/serport.htm。希望对您有所帮助。

【讨论】:

    【解决方案2】:

    这个话题似乎已经有一段时间了,但由于它没有解决方案,我想我会回答这个问题的完整性。

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

    我在 C# 中创建了一个类,其中包含 SerialPort 类的扩展方法,看看我的回答over here on CodeProject

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-19
      • 1970-01-01
      • 1970-01-01
      • 2022-12-07
      • 2016-09-28
      • 2014-04-21
      • 1970-01-01
      相关资源
      最近更新 更多