void CCheckToolDlg::ClosePort()
{
     if(m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(FALSE);
}
执行上述程序时,关闭串口的操作执行不了;提示错误:只有在串口打开时,该操作才有效。void CCheckToolDlg::ClosePort()
{
      m_ctrlComm.SetPortOpen(TRUE);
      m_ctrlComm.SetPortOpen(FALSE);
}
执行上述程序时,提示错误:串口已经打开。这不是自相矛盾吗。我在timer事件里屏蔽了串口数据的发送,串口能够正常关闭。
出错地方是找到了,但不知道怎么改了。难道timer事件里不能用来发送串口数据吗??

解决方案 »

  1.   

    我在timer事件里屏蔽了串口数据的发送,串口能够正常关闭。 
    //串口正在操作的时候无法关闭。
    //timer中当然可以发送数据。不过MSCOMM是异步操作的,为什么要把发送数据放到timer中去?
      

  2.   

    你的Timer定的多久发送一次数据,会不会是因为数据发送过快,仍然在阻塞以至于无法关闭串口呢?
    我也是初学,帮你顶啦
      

  3.   

    这个控件是提供给 VB PB 等工具使用的;VC++ 编程最好直接用 Win32 API 读写串行口:
    CreateFileWriteFileReadFileCloseHandle
    使用Win32创建串口通讯程序http://vckbase.com/document/viewdoc/?id=1114
      

  4.   

    阻塞函数你用的是什么? 我在VC下用的是WaitForSingleObject
    if(!ReadFile(pparams->hcom, pparams->lpRedBuffer, cs.cbInQue, &dwBytesRead, &ol))
    {
     if(GetLastError()==ERROR_IO_PENDING)
    {
     WaitForSingleObject(ol.hEvent, INFINITE);
     bRead=GetOverlappedResult(hcom, &ol, &dwLength, TRUE);
    }
    }
    bRead的返回值可以表示是否接收完毕,非零表示成功,零表示失败。
      

  5.   


    我用mscomm控件的。
    VC开发人员都用API的吗?为什么呀?
      

  6.   

    我用mscomm控件的。 
    VC开发人员都用API的吗?为什么呀?//也不是都用API。喜欢把,自由,好控制。
      

  7.   


    嗯 不错 看了下 整理比较完整 顶下 
    建议以后编程还是用API好,毕竟控件是封装好的,灵活度没有原函数强