C# 中的 DTR 握手

DTR handshake in C#

在 win32 中 API 可以使用 C# SerialPort DCB struct. However, the Handshake 属性 的 fDtrControl 启用 DTR 握手 class 仅允许 RTS 流控制。

如何在 C# 中进行 DTR 握手?

如你所想,大概有两种可能。


一种是在.NET SerialPort范围内处理API.

ReadBufferSize 指定一个非常大的尺寸。规格中最多可指定 2GB。

The buffer size, in bytes. The default value is 4096; the maximum value is that of a positive int, or 2147483647.

如果您以某种方式确定您的应用程序具有足够的处理能力,请将 DtrEnable 设置为 true。如果您的应用程序执行繁重的操作,请在此期间将 DtrEnable 设置为 false。
不可能像设备驱动控制的那样及时处理,但是如果缓冲区大的话,数据丢失的可能性不大。

如果通信协议规范定义了双向 DTR/DSR 握手,请在从应用程序写入之前检查 DsrHolding

This property is used in Data Set Ready/Data Terminal Ready (DSR/DTR) handshaking. The Data Set Ready (DSR) signal is usually sent by a modem to a port to indicate that it is ready for data transmission or data reception.


另一种是使用P/Invoke调用communication function of Win32API

DCB specified by SetCommState里面有一个叫做fDtrControl的设置,可以指定DTR_CONTROL_HANDSHAKE。

fDtrControl
The DTR (data-terminal-ready) flow control. This member can be one of the following values.

  • DTR_CONTROL_DISABLE 0x00 Disables the DTR line when the device is opened and leaves it disabled.
  • DTR_CONTROL_ENABLE 0x01 Enables the DTR line when the device is opened and leaves it on.
  • DTR_CONTROL_HANDSHAKE 0x02 Enables DTR handshaking. If handshaking is enabled, it is an error for the application to adjust the line by using the EscapeCommFunction function.

这里如果要使用双向DTR/DSR握手,也可以指定fOutXDsrFlow。

fOutxDsrFlow
If this member is TRUE, the DSR (data-set-ready) signal is monitored for output flow control. If this member is TRUE and DSR is turned off, output is suspended until DSR is sent again.

如果正确实现了设备驱动程序,则应启用 DTR 流控制。
但是不能在Windows以外的平台上使用,所有串口处理包括其他功能都必须使用Win32API和P/Invoke.

比如有这样一篇文章
Use P/Invoke to Develop a .NET Base Class Library for Serial Device Communications
但是,下载 link 似乎被禁用了。可能是这样。
netserialcomm - default
sntcz/SnT.IO.Ports

类似的方法是创建一个库,该库可以使用 C++/CLI 中的 Win32 通信函数 API 从 C# 调用。