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

| 传奇继续... 我很快就得出结论,我的串行设备过于脆弱,无法与
System.IO.Ports
提供的
SerialPort
类一起很好地玩。 为了令人信服地成为供应商提供的软件,我试图匹配Portmon(在此处记录)和HHD的免费串行监视器记录的对话的各个方面。使用托管(.NET)库,我无法复制以下内容: 特殊的角色。如一个单独的问题所述,SerialPort不允许更改特殊字符集。它可能无关紧要,但是我希望能够断然拒绝它。 细粒度的超时。如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。 港口开放期间的查询。在打开端口和设置波特之间,我的(.NET)应用程序和供应商提供的应用程序都进行了诸如“ѭ9”之类的查询。 .NET添加了一些供应商的应用程序无法执行的功能,例如
IOCTL_SERIAL_GET_MODEMSTATUS
。我希望能够停止此操作。 多余的重复。在端口打开期间,由于某种原因,.NET会重复执行命令块(设置线路控制,波特,特殊字符和握手,清除RTS和DTR)。供应商提供的软件在运行该块一次后直接跳转。 就像我在上面说的那样,我不知道这些差异是否是造成我困境的原因,但是我希望能够找到答案。而且,我认为,对过程进行更好的控制将使我能够真正解决问题,无论结果如何。 那么我的问题是,我如何直接挂接到正确的API上,以控制螺母的水平控制串行端口?任何建议或指导表示赞赏!     
已邀请:
自完成串行工作以来已经有很长时间了,但是我记得这个人是一个很好的资源-网站http://www.lvr.com/serport.htm。希望能有所帮助。     
自从该线程处于活动状态以来,似乎已经有一段时间了,但是由于它没有解决方案,我认为我会回答完整性问题。 重新初始化的问题是由于SerialPort类使用默认的握手而发生的,我不知道为什么这样做,但这确实很烦人,您可以跳过SerialPort属性并进行钻研来解决此问题。直接进入DCB结构。 我在C#中创建了一个充满SerialPort类扩展方法的类,在CodeProject上查看我的回答 如果您决定走这条路,我建议直接跳过SerialPort.Write到SerialPort.BaseStream.Write,它们采用相同的参数,但是我很确定SerialPort类在那里做一些不必要的初始化工作,对SerialPort.Read执行相同操作。     

要回复问题请先登录注册