http://expert.csdn.net/Expert/topic/1751/1751755.xml?temp=.4780847

解决方案 »

  1.   

    //---------------------------
    //a.cpp
    #include < windows.h >
    #include <winbase.h>HANDLE m_hCom ;
    BOOL m_bOpend ;OVERLAPPED m_OverlappedRead;
    OVERLAPPED m_OverlappedWrite;
    WINAPI int OpenCom(int com)
    {

    char szPort[15];
    DCB dcb;
    wsprintf(szPort ,"com%d",com);
    m_hCom = CreateFile(szPort,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL);
    if (m_hCom==NULL)return(1);
    memset( &m_OverlappedRead,0,sizeof(OVERLAPPED));
    memset( &m_OverlappedWrite,0,sizeof(OVERLAPPED));
    COMMTIMEOUTS CommTimeOuts;
    CommTimeOuts.ReadIntervalTimeout=0xFFFFFFFF;
    CommTimeOuts.ReadTotalTimeoutMultiplier=0;
    CommTimeOuts.ReadTotalTimeoutConstant=0;
    CommTimeOuts.WriteTotalTimeoutMultiplier=0;
    CommTimeOuts.WriteTotalTimeoutConstant=500;
    m_OverlappedRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
    m_OverlappedWrite.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
    dcb.DCBlength=sizeof(DCB);
    GetCommState(m_hCom,&dcb);
    dcb.BaudRate=9600;
    dcb.ByteSize=8;
    if (!SetCommState(m_hCom,&dcb)||!SetupComm(m_hCom,10000,10000)
    ||m_OverlappedRead.hEvent==NULL||m_OverlappedWrite.hEvent==NULL)
    {
    DWORD dwError=GetLastError();
    if(m_OverlappedRead.hEvent !=NULL) CloseHandle(m_OverlappedRead.hEvent);
    if(m_OverlappedWrite.hEvent !=NULL) CloseHandle(m_OverlappedWrite.hEvent);
    CloseHandle(m_hCom);
    return (1);
    }
    //CloseHandle(m_hCom);
    return(0);
    }
    WINAPI int InBufferCount( void)
    {
    if (!m_bOpend||m_hCom==NULL) return (1);
    DWORD dwErrorFlags;
    COMSTAT ComStat;
    ClearCommError(m_hCom,&dwErrorFlags,&ComStat);
    return (int)ComStat.cbInQue;
    }WINAPI int ReadData(void *buffer,DWORD dwBytesRead)
    {
    if (!m_bOpend||m_hCom==NULL) return (1);
    BOOL bReadStatus;
    DWORD dwErrorFlags;
    COMSTAT ComStat;
    ClearCommError(m_hCom,&dwErrorFlags,&ComStat);
    if(!ComStat.cbInQue) return (1);
    dwBytesRead=min(dwBytesRead,(DWORD) ComStat.cbInQue);
    bReadStatus=ReadFile(m_hCom,buffer,dwBytesRead,&dwBytesRead,&m_OverlappedRead);
    if (!bReadStatus)
    {
    if(GetLastError()==ERROR_IO_PENDING)
    {
    WaitForSingleObject(m_OverlappedRead.hEvent,2000);
    return (1);
    }
    return dwBytesRead;
    }

    return (0);
    }
    WINAPI int SendData(const char *buffer,DWORD bwBytesWritten)
    {
    if(m_bOpend||m_hCom==NULL) return (1);
    BOOL bWriteStat;
    bWriteStat=WriteFile(m_hCom,buffer,bwBytesWritten,&bwBytesWritten,&m_OverlappedWrite);
    if(!bWriteStat)
    {
    if (GetLastError()==ERROR_IO_PENDING)
    {
    return bwBytesWritten;
    }
    return (0);
    }
    return bwBytesWritten;
    }
    WINAPI int CloseCom()
    {
    CloseHandle(m_hCom);
    return (1);
    }
      

  2.   

    //---------------------------
    //a.hHANDLE m_hCom ; OVERLAPPED m_OverlappedRead;
    OVERLAPPED m_OverlappedWrite;
    WINAPI int OpenCom(int com);
    WINAPI int ReadData(void *buffer,DWORD dwBytesRead);
    WINAPI int SendData(const char *buffer,DWORD cwBytesWritten);
    WINAPI int InBufferCount( void);
    WINAPI int CloseCom();
      

  3.   

    //---------------------------
    //a.def
    LIBRARY      "ComDll" ;//指出DLL的名字
    DESCRIPTION  'ComDll Windows Dynamic Link Library'
    EXPORTS          OpenCom ;
    EXPORTS ReadData;
    EXPORTS SendData;
    EXPORTS InBufferCount;
    EXPORTS CloseCom;
      

  4.   

    大家帮看看这个DLL有什么错?
    编译过去了,可是发不了数据。
    (线用测试软件测过了,串口也没有问题)