Mercurial > ecos-v2_0-branch
diff host/tools/Utils/common/eCosSerial.cpp @ 115:6ed91473a1cd ecos-sw-2000-08-21
Merge from eCos master repository on 2000-08-21-22:40:54-BST
| author | jlarmour |
|---|---|
| date | Fri, 25 Aug 2000 17:32:38 +0000 |
| parents | 6736c52df507 |
| children |
line wrap: on
line diff
--- a/host/tools/Utils/common/eCosSerial.cpp +++ b/host/tools/Utils/common/eCosSerial.cpp @@ -50,6 +50,9 @@ CeCosSerial::CeCosSerial(): m_pHandle(0), m_nDataBits(8), m_nStopBits(ONE_STOP_BIT), + m_bXONXOFFFlowControl(0), + m_bRTSCTSFlowControl(0), + m_bDSRDTRFlowControl(0), m_bParity(false), m_nBaud(0), m_nTotalReadTimeout(10*1000), @@ -70,6 +73,9 @@ CeCosSerial::CeCosSerial(LPCTSTR pszPort m_pHandle(0), m_nDataBits(8), m_nStopBits(ONE_STOP_BIT), + m_bXONXOFFFlowControl(0), + m_bRTSCTSFlowControl(0), + m_bDSRDTRFlowControl(0), m_bParity(false), m_nTotalReadTimeout(10*1000), m_nTotalWriteTimeout(10*1000), @@ -110,6 +116,24 @@ bool CeCosSerial:: SetStopBits(StopBitsT return 0==m_pHandle || !bApplySettingsNow || ApplySettings(); } +bool CeCosSerial:: SetXONXOFFFlowControl(bool b,bool bApplySettingsNow/*=true*/) +{ + m_bXONXOFFFlowControl=b; + return 0==m_pHandle || !bApplySettingsNow || ApplySettings(); +} + +bool CeCosSerial:: SetRTSCTSFlowControl(bool b,bool bApplySettingsNow/*=true*/) +{ + m_bRTSCTSFlowControl=b; + return 0==m_pHandle || !bApplySettingsNow || ApplySettings(); +} + +bool CeCosSerial:: SetDSRDTRFlowControl(bool b,bool bApplySettingsNow/*=true*/) +{ + m_bDSRDTRFlowControl=b; + return 0==m_pHandle || !bApplySettingsNow || ApplySettings(); +} + bool CeCosSerial:: SetReadTimeOuts(int nTotal,int nBetweenChars,bool bApplySettingsNow/*=true*/) // mSec { m_nTotalReadTimeout=nTotal; @@ -185,15 +209,37 @@ bool CeCosSerial::ApplySettings() arpszStopbits[dcb.StopBits], dcb.ByteSize); - // No control over the following yet - dcb.fDtrControl=DTR_CONTROL_ENABLE; + if (m_bDSRDTRFlowControl) { + dcb.fDtrControl = DTR_CONTROL_HANDSHAKE; + dcb.fOutxDsrFlow = 1; + } else { + dcb.fDtrControl = DTR_CONTROL_ENABLE; + dcb.fOutxDsrFlow = 0; + } + + if (m_bRTSCTSFlowControl) { + dcb.fRtsControl = RTS_CONTROL_HANDSHAKE; + dcb.fOutxCtsFlow = 1; + } else { + dcb.fRtsControl = RTS_CONTROL_ENABLE; + dcb.fOutxCtsFlow = 0; + } + dcb.fTXContinueOnXoff=1; - dcb.fRtsControl=RTS_CONTROL_ENABLE; - dcb.fAbortOnError=1; - dcb.XonLim=2048; - dcb.XoffLim=512; dcb.XonChar=17; dcb.XoffChar=19; + if (m_bXONXOFFFlowControl) { + dcb.XonLim=512; + dcb.XoffLim=512; + dcb.fOutX=1; + dcb.fInX=1; + } else { + dcb.XonLim=2048; + dcb.XoffLim=512; + dcb.fOutX=0; + dcb.fInX=0; + } + dcb.fAbortOnError=1; HANDLE hCom=(HANDLE)m_pHandle; if (!SetCommState(hCom, &dcb)) { @@ -422,6 +468,33 @@ bool CeCosSerial::ApplySettings() if (m_bParity) // even parity. buf.c_cflag |= PARENB; } + + // Set flow control + { + buf.c_iflag &= ~(IXON|IXOFF); +#ifdef CRTSCTS + buf.c_cflag &= ~CRTSCTS; +#endif + if ( m_bXONXOFFFlowControl ) { + buf.c_iflag |= (IXON|IXOFF); + } + if ( m_bRTSCTSFlowControl ) { +#ifdef CRTSCTS + buf.c_cflag |= CRTSCTS; +#else + return false; +#endif + } + if ( m_bDSRDTRFlowControl ) { +#ifdef CDSRDTR + buf.c_cflag |= CDSRDTR; +#else + return false; +#endif + } + + + } // Set the new settings if (tcsetattr((int) m_pHandle, TCSADRAIN, &buf)) { @@ -468,6 +541,15 @@ bool CeCosSerial::Read (void *pBuf,unsig return false; } nRead = n; +#if 0 + if (n>0) { + unsigned int i; + fprintf(stderr, "%d:", nRead); + for (i = 0; i < nRead; i++) + fprintf(stderr, "%02x!", ((unsigned char *)pBuf)[i]); + fprintf(stderr, "\n"); + } +#endif return true; } @@ -497,9 +579,18 @@ bool CeCosSerial::Read (void *pBuf,unsig ERROR(_T("Read failed: %d\n"), errno); return false; // FAILED } - nRead += n; - pData += n; - nSize -= n; + else if (n > 0) { +#if 0 + unsigned int i; + fprintf(stderr, "%d:", nRead); + for (i = 0; i < nRead; i++) + fprintf(stderr, "%02x!", ((unsigned char *)pBuf)[i]); + fprintf(stderr, "\n"); +#endif + nRead += n; + pData += n; + nSize -= n; + } // Now use inter-char timeout. tv.tv_sec = m_nInterCharReadTimeout / 1000;
