首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SerialPort检查CTS

SerialPort检查CTS
EN

Stack Overflow用户
提问于 2015-02-09 16:13:39
回答 2查看 1.6K关注 0票数 0

如何检查打开的CTS行值SerialPort?其思想是在使用三线串行接口而不握手的情况下,从另一边的设备中设置这个值。

下面是一些开始讨论的代码(改编后的msdn )

代码语言:javascript
运行
复制
[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;
}

这段代码可以告诉我,在线路上是否有信号的,但是无法知道如何获得实际的(是高还是低?)

除此之外,还有一些奇怪的问题。WaitCommEvent立即返回false (与Marshal.GetLastError() = 0一起),除非CTS设置为与com-端口打开时相反的位置。此外,我看到MessageBox的值等于com-端口打开时的值。这真的很奇怪,因为我无法用这种方法计算出一个值。

另一件事是WaitCommEvent阻止的东西。我可以关闭表单和应用程序终止,而不是可见的(还?)有问题,但我真的很喜欢这里的非阻塞投票。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-09 16:28:55

您需要使用GetCommModemStatus检索CTS的状态。

您可以在非阻塞模式下使用WaitCommEvent和重叠IO。也就是说,以重叠的方式打开端口,并提供WaitCommEvent的第三个参数。

票数 2
EN

Stack Overflow用户

发布于 2015-02-09 16:20:41

三线串行接口不包括CTS信号,所以您不能使用它.

至于读取CTS的值,文档如下:https://msdn.microsoft.com/en-us/library/windows/desktop/aa363194%28v=vs.85%29.aspx --您想要查看GetCommMask()GetCommModemStatus()

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28414178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档