串口检查CTS
SerialPort check CTS
如何查看打开的SerialPort
的CTS
行值?想法是在使用不握手的 3 线串行接口时从另一侧的设备设置此值。
这里是开始讨论的一些代码(改编自 msdn 示例):
[DllImport("kernel32.dll")]
static extern bool SetCommMask(IntPtr hFile, uint dwEvtMask);
[DllImport("kernel32.dll")]
static extern bool WaitCommEvent(IntPtr hFile, out uint lpEvtMask, IntPtr lpOverlapped);
SerialPort _port = null;
bool _exit;
public Form1()
{
InitializeComponent();
_port = new SerialPort("COM2");
_port.Open();
// getting handle is tricky
var handle = ((SafeFileHandle)_port.BaseStream.GetType().GetField("_handle", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(_port.BaseStream)).DangerousGetHandle();
// set mask to listen to change of CTS signal
if (!SetCommMask(handle, 0x0008)) // EV_CTS
throw ...
// start listener
Task.Run(() =>
{
while (!_exit)
{
uint mask = 0;
if (WaitCommEvent(handle, out mask, IntPtr.Zero))
if ((mask & 0x0008) != 0)
Task.Run(() => MessageBox.Show("smth happenz"));
});
_port.Close();
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
_exit = true;
}
此代码可以告诉我 CTS
线上是否有 信号变化 ,但无法弄清楚如何获得实际 value (高还是低?).
除此之外还有一些奇怪的问题。 WaitCommEvent
returns false
立即(使用 Marshal.GetLastError() = 0
)除非 CTS
设置为 与打开 com 端口时的设置相反。此外,我看到 MessageBox
的值 等于打开 com 端口时的值 。这真的很奇怪,因为我无法使用这种方法计算出一个值。
另一件事是WaitCommEvent
块。我可以关闭表单并且应用程序终止而没有可见的(但是?)问题,但我真的很喜欢在这里进行非阻塞轮询。
3线串口不包含CTS信号,不能使用
关于读取CTS的值,文档在这里:https://msdn.microsoft.com/en-us/library/windows/desktop/aa363194%28v=vs.85%29.aspx你要看GetCommMask()
和GetCommModemStatus()
。
您需要使用 GetCommModemStatus
来检索 CTS 的状态。
您可以在非阻塞模式下使用重叠 IO WaitCommEvent
。也就是说,打开重叠的端口并提供 WaitCommEvent
.
的第 3 个参数
如何查看打开的SerialPort
的CTS
行值?想法是在使用不握手的 3 线串行接口时从另一侧的设备设置此值。
这里是开始讨论的一些代码(改编自 msdn 示例):
[DllImport("kernel32.dll")]
static extern bool SetCommMask(IntPtr hFile, uint dwEvtMask);
[DllImport("kernel32.dll")]
static extern bool WaitCommEvent(IntPtr hFile, out uint lpEvtMask, IntPtr lpOverlapped);
SerialPort _port = null;
bool _exit;
public Form1()
{
InitializeComponent();
_port = new SerialPort("COM2");
_port.Open();
// getting handle is tricky
var handle = ((SafeFileHandle)_port.BaseStream.GetType().GetField("_handle", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(_port.BaseStream)).DangerousGetHandle();
// set mask to listen to change of CTS signal
if (!SetCommMask(handle, 0x0008)) // EV_CTS
throw ...
// start listener
Task.Run(() =>
{
while (!_exit)
{
uint mask = 0;
if (WaitCommEvent(handle, out mask, IntPtr.Zero))
if ((mask & 0x0008) != 0)
Task.Run(() => MessageBox.Show("smth happenz"));
});
_port.Close();
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
_exit = true;
}
此代码可以告诉我 CTS
线上是否有 信号变化 ,但无法弄清楚如何获得实际 value (高还是低?).
除此之外还有一些奇怪的问题。 WaitCommEvent
returns false
立即(使用 Marshal.GetLastError() = 0
)除非 CTS
设置为 与打开 com 端口时的设置相反。此外,我看到 MessageBox
的值 等于打开 com 端口时的值 。这真的很奇怪,因为我无法使用这种方法计算出一个值。
另一件事是WaitCommEvent
块。我可以关闭表单并且应用程序终止而没有可见的(但是?)问题,但我真的很喜欢在这里进行非阻塞轮询。
3线串口不包含CTS信号,不能使用
关于读取CTS的值,文档在这里:https://msdn.microsoft.com/en-us/library/windows/desktop/aa363194%28v=vs.85%29.aspx你要看GetCommMask()
和GetCommModemStatus()
。
您需要使用 GetCommModemStatus
来检索 CTS 的状态。
您可以在非阻塞模式下使用重叠 IO WaitCommEvent
。也就是说,打开重叠的端口并提供 WaitCommEvent
.