目的:c#中kernel32.dll进行串口通讯时,怎么查询特定通信事件(DSR线电平改变)思想:串口查询法。具体过程如下:首先设置通信事件掩码SetCommMask以决定对哪些通信事件进行监视;侦测到一个事件后,就有必要用API函数GetCommMask判断到底是哪个事件发生了,并将那个事件清除,以便这个事件下一次能正常发生;更进一步的作法是直接用WaitCommEvent函数专门等待特定通信事件的发生并对其进行处理。这实际上就对特定的通信事件做了一个消息挂钩,充分体现了事件驱动的优点。 问题:请大家帮忙,怎么用getCommMask方法判断DSR事件发生?附上声明代码:

        [DllImport("kernel32.dll")]
        internal static extern Boolean SetCommMask(IntPtr hFile, UInt32 dwEvtMask);
        /*dwEvtMask即通讯时间的掩码*/        [DllImport("kernel32.dll")]
        internal static extern Boolean GetCommMask(IntPtr hFile,out UInt32 lpEvtMask);        [DllImport("kernel32.dll")]
        internal static extern Boolean WaitCommEvent(IntPtr hFile, UInt32 lpEvtMask, IntPtr lpOverlapped);
SetCommMask声明的通讯时间集:(lpEvtMask可能的掩码)
EV_BREAK 0x0040 在输入过程中发生中断) 
EV_CTS 0x0008 (CTS线上的信号改变状态) 
EV_DSR 0x0010 (DSR 线上的信号改变状态) 
EV_RXCHAR 0x0001 (输入缓冲区不为空) 
EV_TXEMPTY 0x0004 (输出缓冲区的数据全部发送出去) 

我写的部分编码:getCommMask肯定用错了,但是我没查到应该是怎么用的
            if (!Win32Com.SetCommMask(hPort, Win32Com.EV_RXCHAR | Win32Com.EV_TXEMPTY | Win32Com.EV_CTS | Win32Com.EV_DSR
                        | Win32Com.EV_BREAK | Win32Com.EV_RLSD | Win32Com.EV_RING | Win32Com.EV_ERR))
            {
                throw new CommPortException("IO Error [001]");
            }
            UInt32 commEvent;
            Win32Com.GetCommMask(hPort,out commEvent);
            if (commEvent == Win32Com.EV_DSR)//错误!!!
            {
                //事件处理                
            }
            Win32Com.OVERLAPPED ov = new Win32Com.OVERLAPPED();
   IntPtr unmanagedOv;
   unmanagedOv = Marshal.AllocHGlobal(Marshal.SizeOf(ov));
            if (Win32Com.WaitCommEvent(hPort, Win32Com.EV_DSR, unmanagedOv))//这里也错了。
            {  //事件处理 }