在CommProc()函数的实现上面添加下面这句:
#include "commDoc.h"

解决方案 »

  1.   

    我的全局函数实现实在commDoc.cpp文件的最下面,它上面就是commDoc.cpp
    在上面有#include "commDoc.h"语句
      

  2.   

    // commDoc.cpp : implementation of the CCommDoc class
    //#include "stdafx.h"
    #include "comm.h"
    #include "SetupDlg.h"
    #include "commDoc.h"#ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif/////////////////////////////////////////////////////////////////////////////
    // CCommDocIMPLEMENT_DYNCREATE(CCommDoc, CDocument)BEGIN_MESSAGE_MAP(CCommDoc, CDocument)
    //{{AFX_MSG_MAP(CCommDoc)
    ON_COMMAND(ID_FILE_CONNECTION, OnFileConnection)
    ON_COMMAND(ID_FILE_CLOSE, OnFileClose)
    ON_UPDATE_COMMAND_UI(ID_FILE_CLOSE, OnUpdateFileClose)
    ON_UPDATE_COMMAND_UI(ID_FILE_CONNECTION, OnUpdateFileConnection)
    ON_COMMAND(ID_FILE_SETTINGS, OnFileSettings)
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
    // CCommDoc construction/destructionCCommDoc::CCommDoc()
    {
    // TODO: add one-time construction code here
    m_bConnected=FALSE;//
    m_pThread=NULL;//线程
    m_nBaud=9600;//波特率
    m_nCheckout=0;//奇偶效验
    m_nStop=0;//停止位
    m_sPort="COM1";//端口控制
    m_nFlow=0;//流控制
    m_nData=8;//数据控制
    }CCommDoc::~CCommDoc()
    {
    if(m_bConnected)
    CloseConnection();
    if(m_osRead.hEvent)
    CloseHandle(m_osRead.hEvent);
    }BOOL CCommDoc::OnNewDocument()
    {
    if (!CDocument::OnNewDocument())
    return FALSE; // TODO: add reinitialization code here
    // (SDI documents will reuse this document)
    memset(&m_osRead,0,sizeof(OVERLAPPED));
    if((m_osRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL))==NULL)
    return FALSE;//初始化事件为无信号状态
    return TRUE;
    }/////////////////////////////////////////////////////////////////////////////
    // CCommDoc serializationvoid CCommDoc::Serialize(CArchive& ar)
    {
    if (ar.IsStoring())
    {
    // TODO: add storing code here
    }
    else
    {
    // TODO: add loading code here
    }
    }/////////////////////////////////////////////////////////////////////////////
    // CCommDoc diagnostics#ifdef _DEBUG
    void CCommDoc::AssertValid() const
    {
    CDocument::AssertValid();
    }void CCommDoc::Dump(CDumpContext& dc) const
    {
    CDocument::Dump(dc);
    }
    #endif //_DEBUG/////////////////////////////////////////////////////////////////////////////
    // CCommDoc commandsBOOL CCommDoc::OpenConnection()
    {
    COMMTIMEOUTS TimeOuts;
    //POSITION firstViewPos;
    //CView *pView;
    //firstViewPos=GetFirstViewPosition();
    //m_hThread=pView->GetSafeHwnd(); if(m_bConnected)
    return FALSE;
    m_hCom=CreateFile(m_sPort,GENERIC_READ,0,NULL,OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL);
    if(m_hCom=INVALID_HANDLE_VALUE)
    return FALSE;
    SetupComm(m_hCom,MAXBLOCK,MAXBLOCK);
    SetCommMask(m_hCom,EV_RXCHAR);
    TimeOuts.ReadIntervalTimeout=MAXBLOCK;
    TimeOuts.ReadTotalTimeoutConstant=0;
    TimeOuts.ReadTotalTimeoutMultiplier=0;
    SetCommTimeouts(m_hCom,&TimeOuts);
    if(ConfigConneciton())
    {
    m_pThread=AfxBeginThread(CommProc,this,THREAD_PRIORITY_NORMAL,
    0,CREATE_SUSPENDED,NULL);//挂起线程
    if(m_pThread=NULL)
    {
    CloseHandle(m_hCom);
    return FALSE;
    }
    else
    {
    m_bConnected=TRUE;
    m_pThread->ResumeThread();
    }
    }
    else
    {
    CloseHandle(m_hCom);
    }
    return TRUE;
    }
    void CCommDoc::CloseConnection()
    {
    if(!m_bConnected)
    return;
    m_bConnected=FALSE;
    SetCommMask(m_hCom,0);//为0全部事件终止
    WaitForSingleObject(m_pThread->m_hThread,INFINITE);//等待辅助线程终止
    m_pThread=NULL;
    CloseHandle(m_hCom);
    }DWORD CCommDoc::ReadComm(char *buf, DWORD dwlength)
    {
    DWORD length=0;
    COMSTAT ComStat;
    DWORD dwErrorFlags;
    ClearCommError(m_hCom,&dwErrorFlags,&ComStat);
    length=ComStat.cbInQue;
    ReadFile(m_hCom,buf,length,&length,&m_osRead);
    return length;
    }void CCommDoc::OnFileConnection() 
    {
    // TODO: Add your command handler code here
    if(!OpenConnection())
    AfxMessageBox("不能连接,请联系技术人员处理");
    }void CCommDoc::OnFileClose() 
    {
    // TODO: Add your command handler code here
    CloseConnection();
    }void CCommDoc::OnUpdateFileClose(CCmdUI* pCmdUI) 
    {
    // TODO: Add your command update UI handler code here
    pCmdUI->Enable(m_bConnected);
    }void CCommDoc::OnUpdateFileConnection(CCmdUI* pCmdUI) 
    {
    // TODO: Add your command update UI handler code here
    pCmdUI->Enable(!m_bConnected);
    }void CCommDoc::OnFileSettings() 
    {
    // TODO: Add your command handler code here
    CSetupDlg dlg;
    CString str;
    dlg.m_sPort=m_sPort;
    str.Format("%d",m_nBaud);
    dlg.m_sBaud=str;
    str.Format("%d",m_nData);
    dlg.m_sData=str;
    dlg.m_nStop=m_nStop;
    dlg.m_nCheckout=m_nCheckout;
    dlg.m_nFlow=m_nFlow;
    if(dlg.DoModal()==IDOK)
    {
    m_sPort=dlg.m_sPort;
    m_nBaud=atoi(dlg.m_sBaud);
    m_nData=atoi(dlg.m_sData);
    m_nStop=dlg.m_nStop;
    m_nCheckout=dlg.m_nCheckout;
    m_nFlow=dlg.m_nFlow;
    if(!m_bConnected)
    if(!ConfigConneciton())
    AfxMessageBox("不能设置串口");
    }
    }BOOL CCommDoc::ConfigConneciton()
    {
    DCB dcb;
    if(!GetCommState(m_hCom,&dcb))
    return FALSE;
    dcb.fBinary=TRUE;
    dcb.BaudRate=m_nBaud;
    dcb.ByteSize=m_nData;
    dcb.fParity=TRUE;
    switch(m_nCheckout)
    {
    case 0: dcb.Parity=NOPARITY;
    break;
    case 1: dcb.Parity=EVENPARITY;
    break;
    case 2: dcb.Parity=ODDPARITY;
    break;
    default:;
    }
    switch(m_nStop)
    {
    case 0: dcb.StopBits=ONESTOPBIT;
    break;
    case 1: dcb.StopBits=ONE5STOPBITS;
    break;
    case 2: dcb.StopBits=TWOSTOPBITS;
    break;
    default:;
    }
    //switch(m_nFlow)
    //{
    //case 1: dcb.fOutxCtsFlow=TRUE;//为真清除发送暂缓
    //流控制没有写代码
    return SetCommState(m_hCom,&dcb);
    }UINT CommProc(LPVOID pParam)
    {
    OVERLAPPED os;
    int m_nLength;
    DWORD dwMask;//,dwTrans;
    //COMSTAT comStat;
    //DWORD dwErrorFlags;
    CCommDoc *pDoc=(CCommdoc *)pParam;
    //SetCommMask(m_hCom,EV_RXCHAR);
    dwMask=0;
    WaitCommEvent(pDoc->m_hCom,&dwMask,&os);
    if((dwMask&EV_RXCHAR)==EV_RXCHAR)
    {
    m_nLength=pDoc->ReadComm(pDoc->buf,100);
    if(m_nLength)
    {
    for(int i=0;i<m_nLength;i++)
    //switch(buf[i])
    //case ';':*/
    pDoc->str+=pDoc->buf[i];
    }
    }
    }
      

  3.   

    检查CCommDoc *pDoc=(CCommdoc *) pParam 此行语句的拼写 其中两个CCommDoc 是否一致,并且是否与你定义的CDocument类是否一致.
       我看主要问题是拼写的问题.
      

  4.   

    请将  CCommDoc *pDoc=(CCommdoc *)pParam;
    改为:CCommDoc *pDoc=(CCommDoc *)pParam;如何?
      

  5.   

    行了,谢谢 sdjnlf(bnxf)和MyLoverVc(中国软件),是拼写的问题,我真是粗心大意.该打.