目的: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))//这里也错了。
{ //事件处理 }
[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))//这里也错了。
{ //事件处理 }
if (CommEvent & EV_RXCHAR)
{
//事件处理
}