为什么串口发送超过8000bytes的数据,下位机就接收失败?解决方法
为什么串口发送超过8000bytes的数据,下位机就接收失败?
我是这样设置串口的,当发送数据大小是7000byte的时候就ok,
为什么串口发送超过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; } } }