为什么串口发送超过8000bytes的数据,下位机就接收失败?解决方法

为什么串口发送超过8000bytes的数据,下位机就接收失败?
C/C++ code
/**
* 打开串口,USB的时候不需要该函数
**/
HANDLE CSerialPort::OpenPort(LPCTSTR sPort,DWORD dwBaudRate,BYTE byDataBits,
                             BYTE byParity,BYTE byStopBits,BOOL bSynchronization)
{
    bool bFlagTry = FALSE; //指示是否正常退出了try块
    TCHAR szPort[10] = {0};
    _tcscpy(szPort,_T("\\\\.\\"));//在COM10以上的必须这样写
    _tcscat(szPort,sPort);

    DWORD dwFlag = 0;
    if (bSynchronization)
    {
        dwFlag = 0;
    }
    else
    {
        dwFlag = FILE_FLAG_OVERLAPPED;
    }

    if (m_hCom!=INVALID_HANDLE_VALUE)
    {
        m_hCom=INVALID_HANDLE_VALUE;
        ::CloseHandle(m_hCom);
    }

    __try
    {
        m_hCom = CreateFile(szPort,//szPort,
        GENERIC_READ|GENERIC_WRITE,
        0,                        //独占模式
        NULL,
        OPEN_EXISTING,
        dwFlag,
        NULL);

        if (m_hCom==INVALID_HANDLE_VALUE)
        {
            __leave;
        }

        if (SetupComm(m_hCom,2048,1024)==0)
        {
            __leave;
        }

        if (PurgeComm( m_hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR| PURGE_RXCLEAR )==0)
        {
            __leave;
        }


        DCB dcb;                         //定义dcb对象
        if (!GetCommState(m_hCom,&dcb))
        {
            __leave;
        }

        COMMTIMEOUTS ct;
        GetCommTimeouts(m_hCom, &ct);
        ct.ReadIntervalTimeout = 500;
        ct.ReadTotalTimeoutConstant = 1000;
        ct.ReadTotalTimeoutMultiplier = 1000;
        ct.WriteTotalTimeoutConstant = 0;
        ct.WriteTotalTimeoutMultiplier = 0;

        if (!SetCommTimeouts(m_hCom, &ct))
        {
            __leave;
        }


        dcb.Parity = byParity;                //获得校验方式
        if (byParity!=NOPARITY)
        {
            dcb.fBinary = TRUE;                //允许校验
        }
        dcb.BaudRate = dwBaudRate;            //获得通信速率
        dcb.ByteSize = byDataBits;            //数据位数
        dcb.StopBits = byStopBits;            //停止位

        dcb.fOutxCtsFlow = FALSE;            //流量控制
        dcb.fOutxDsrFlow = FALSE;
        dcb.fOutX = FALSE;
        dcb.fInX = FALSE;

        /*    dcb.BaudRate=dwBaudRate;                 //波特率为9600
            dcb.ByteSize=byDataBits;                     //每个字节有8位
            dcb.Parity=NOPARITY;                   //无奇偶校验位
            dcb.StopBits=TWOSTOPBITS;        //两个停止位
        */    //SetCommState(m_hCom,&dcb);



        // 将设定的参数值用于该串口
        if (!SetCommState(m_hCom,&dcb))
        {
            __leave;
        }
        bFlagTry = TRUE;
    }//end try
    __finally
    {
        //        if(AbnormalTermination())
        if (!bFlagTry)
        {
            m_dwError = GetLastError();
            TRACE(L"%d\r\n",m_dwError);
            if (m_hCom!=INVALID_HANDLE_VALUE)
            {
                ::CloseHandle(m_hCom);
                m_hCom=INVALID_HANDLE_VALUE;
            }
        }
    }

    return m_hCom;
}


我是这样设置串口的,当发送数据大小是7000byte的时候就ok,
为什么串口发送超过8000bytes的数据,下位机就接收失败?

------解决方案--------------------
接收的缓存太小?
------解决方案--------------------
没有那么大的空间
------解决方案--------------------
// 缓存满了吧?
// 加个握手。
------解决方案--------------------
貌似是溢出了
------解决方案--------------------
C/C++ code
inline void WINAPI OpenOutputHandles ()
{
    if (!hCom && !(gTracesFlags & TRACES_NO_COM_OUTPUT))
    {   
        hCom = CreateFile (COM_PORT_STRING,
                           GENERIC_WRITE | GENERIC_READ,
                           0,
                           NULL,
                           OPEN_EXISTING,
                           0,
                           NULL); 
        if (INVALID_HANDLE_VALUE == hCom)
        {
            hCom = NULL;
        }
        else
        {
            DCB dcb;
            GetCommState (hCom, &dcb);
            dcb.BaudRate    = COM_BAUD_RATE;
            dcb.ByteSize    = COM_DATA_BYTE_SIZE;
            dcb.Parity      = COM_PARITY;
            dcb.StopBits    = COM_STOP_BIT;
            SetCommState (hCom, &dcb);
            if (!fComInit)
            {
                DWORD dwBytes;
                for (int i=0; i<55; i++)
                {
                    WriteFile (hCom, "\r\n", 2, &dwBytes, NULL);
                }
                fComInit = TRUE;
            }
        }
    }

    if (!hLogFile && (gTracesFlags & TRACES_LOG_FILE))
    {    
        hLogFile = CreateFile (LOG_FILE_NAME,
                               GENERIC_WRITE,
                               FILE_SHARE_READ | FILE_SHARE_WRITE,
                               NULL,
                               OPEN_ALWAYS,
                               0,
                               NULL);
        if (INVALID_HANDLE_VALUE == hLogFile)
        {
            hLogFile = NULL;
        }
        if (!fFileInit)
        {
            DWORD dwFileSize = GetFileSize (hLogFile, NULL);
            SetFilePointer (hLogFile, dwFileSize, NULL, FILE_BEGIN);

            char szTmpStr[64];
            DWORD dwBytes, nChars = wsprintf (szTmpStr, 
            "======================================================\r\n");
            WriteFile (hLogFile, szTmpStr, nChars, &dwBytes, NULL);
            SYSTEMTIME st;
            GetSystemTime (&st);
            nChars = wsprintf (szTmpStr, "Log Date: %d/%d/%d - %d:%d\r\n",
            st.wMonth, st.wDay, st.wYear, st.wHour, st.wMinute);
            WriteFile (hLogFile, szTmpStr, nChars, &dwBytes, NULL);
            nChars = wsprintf (szTmpStr, 
            "======================================================\r\n");
            WriteFile (hLogFile, szTmpStr, nChars, &dwBytes, NULL);
            fFileInit = TRUE;
        }
    }
}