| 楼主 发表于: 2002-04-22 08:55:03 请问用vc对串口能进行中断接收吗?如何实现。在线等待立即给分 |
| #1得分:5 回复于: 2002-04-22 09:00:18 通过触发事件来中断呀 其实还不很懂你的意思 不过我现在写了个多线程的串口通讯程序. |
| #2得分:15 回复于: 2002-04-22 09:02:19 可以实现。 我的实现方法是起一个线程,在线程里等待串口中断,然后通过消息发给主进程,进行处理。 while( TRUE ) { bResult = WaitCommEvent(port->ComPort.GetHandle(), &Event, NULL); if (bResult) { bResult = ClearCommError(port->ComPort.GetHandle(), &dwError, &comstat); if (comstat.cbInQue == 0) continue; } // end if bResult GetCommMask(port->ComPort.GetHandle(), &CommEvent); AfxGetMainWnd()->SendMessage(WM_MY_GETCOMMMASK,CommEvent,0); |
| #3得分:0 回复于: 2002-04-22 09:16:33 哎呀,楼上朋友同我的观点一样呀! |
| #4得分:0 回复于: 2002-04-22 09:25:37 1、编制一个检测串口中断的VXD驱动,由该驱动检测中断,发消息给主程序。 2、在主程序的开始启动该VXD驱动程序。 3、具体过程见《window 9x 虚拟设备驱动程序》一书 |
| #5得分:0 回复于: 2002-04-22 09:26:27 用communication控件,它支持终端响应 |
| #6得分:0 回复于: 2002-04-22 09:28:54 但有可能不能象DOS下能作到实时性。 不知大家有没有发现这种情况。?? |
| #7得分:0 回复于: 2002-04-22 09:29:59 谢谢各位,请问linjiework(霖杰)你的意思是不是类似于监视线程,也就是利用SetCommMask先建立事件屏蔽,然后再用AfxBeginThread来启动线程,当有信号时就进行接收? |
| #8得分:0 回复于: 2002-04-22 09:33:09 可以的,在每一个数据包前打上标记,那一包断了重发那一包。 |
| #9得分:30 回复于: 2002-04-22 09:35:20 在线程中监视:AfxBeginThread() ....... // 主要等待事件函数(Main wait function): Event = WaitForMultipleObjects(3,m_hArrayEvents,FALSE,INFINITE); switch (Event) { case 0: // shutdown 结束 { CloseHandle(m_hCom); // 关闭串口 break; } case 1: // m_ov.hEvent 读数据 { GetCommMask(m_hCom,&CommEvent); // 根据发生的事件进行相就的处理 // 注: 这些事件中只有在InitPort()函数中显示定义了的事件才会发生 if (CommEvent & EV_BREAK) // 检测到输入的中止 SendMessage(::AfxGetApp()->m_pMainWnd->m_hWnd,WM_COMM_BREAK_DETECTED,0,0); if (CommEvent & EV_CTS) // CTS(清除发送)信号改变状态 SendMessage(::AfxGetApp()->m_pMainWnd->m_hWnd,WM_COMM_CTS_DETECTED,0,0); if (CommEvent & EV_DSR) // DSR(数据设备就绪)信号改变状态 SendMessage(::AfxGetApp()->m_pMainWnd->m_hWnd,WM_COMM_DSR_DETECTED,0,0); if (CommEvent & EV_ERR) // 发生了线路状态错误 SendMessage(::AfxGetApp()->m_pMainWnd->m_hWnd,WM_COMM_ERR_DETECTED,0,0); if (CommEvent & EV_RING) // 检测到振铃 SendMessage(::AfxGetApp()->m_pMainWnd->m_hWnd,WM_COMM_RING_DETECTED,0,0); if (CommEvent & EV_RLSD) // RLSD(接收线路信号检测)信号状态改变 SendMessage(::AfxGetApp()->m_pMainWnd->m_hWnd,WM_COMM_RLSD_DETECTED,0,0); if (CommEvent & EV_RXFLAG) // 接收到事件字符(DCB结构的EvtChar成员),并放入输入缓冲区 SendMessage(::AfxGetApp()->m_pMainWnd->m_hWnd,WM_COMM_RXFLAG_DETECTED,0,0); if (CommEvent & EV_TXEMPTY) // 输出缓冲区中最后一个字符发送出去 SendMessage(::AfxGetApp()->m_pMainWnd->m_hWnd,WM_COMM_TXEMPTY_DETECTED,0,0); if (CommEvent & EV_RXCHAR) // 接收到一个字符,并放入输入缓冲区 ReceiveChar(comstat); break; } case 2: // m_hWriteEvents 写数据 { WriteChar(); // 启动写数据函数 break; } } // end switch(Event) 这个很好的,我现在就用这个. |
| #10得分:0 回复于: 2002-04-22 09:44:34 qiuanhong(爱写程序) 的方法好! |
联系客服