⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ecostestserial.cpp

📁 ecos为实时嵌入式操作系统
💻 CPP
字号:
//=================================================================////        eCosTestSerial.cpp////        Serial test class////=================================================================//####COPYRIGHTBEGIN####//// -------------------------------------------// The contents of this file are subject to the Cygnus eCos Public License// Version 1.0 (the "License"); you may not use this file except in// compliance with the License.  You may obtain a copy of the License at// http://sourceware.cygnus.com/ecos// // Software distributed under the License is distributed on an "AS IS"// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.  See the// License for the specific language governing rights and limitations under// the License.// // The Original Code is eCos - Embedded Cygnus Operating System, released// September 30, 1998.// // The Initial Developer of the Original Code is Cygnus.  Portions created// by Cygnus are Copyright (C) 1998, 1999 Cygnus Solutions.// All Rights Reserved.// -------------------------------------------////####COPYRIGHTEND####//=================================================================//#####DESCRIPTIONBEGIN####//// Author(s):     sdf// Contributors:  sdf// Date:          1999-04-01// Description:   This class abstracts the serial port for use in the //                testing infrastructure// Usage://// To Do://  o Unix body////####DESCRIPTIONEND#####include "stdafx.h"#include "eCosTestUtils.h"#include "eCosTestSerial.h"#include "eCosTestSocket.h"CeCosTestSerial::CeCosTestSerial():    m_pHandle(0),    m_nBaud(0),    m_bParity(false),    m_nDataBits(8),    m_nStopBits(ONE),    m_nTotalReadTimeout(10*1000),    m_nTotalWriteTimeout(10*1000),    m_nInterCharReadTimeout(500),    m_nInterCharWriteTimeout(500) {}CeCosTestSerial::~CeCosTestSerial(){    Close();}bool CeCosTestSerial::Close(){    bool rc=m_pHandle && (-1!=close((int)m_pHandle));    m_pHandle=0;    return rc;}CeCosTestSerial::CeCosTestSerial(const char *pszPort,int nBaud):    m_pHandle(0),    m_bParity(false),    m_nDataBits(8),    m_nStopBits(ONE),    m_nTotalReadTimeout(10*1000),    m_nTotalWriteTimeout(10*1000),    m_nInterCharReadTimeout(500),    m_nInterCharWriteTimeout(500),    m_bBlockingReads(true){    Open(pszPort,nBaud);}bool CeCosTestSerial::Open(const char *pszPort,int nBaud){	bool rc=false;    m_nBaud=nBaud,    m_strPort=pszPort;	int fd = open(pszPort,O_RDWR|O_NONBLOCK);	if (-1==fd) { 		TRACE("Failed to open port %s\n",pszPort);                return false;	} else {            m_pHandle=(void *)fd;            if(ApplySettings()){                rc=true;            } else {                Close();                TRACE("Failed to apply settings.\n");                return false;            }	}    return rc;}bool CeCosTestSerial::ApplySettings(){    struct termios buf;    int rate;    const char *arpszStopbits[3]={"1","1.5","2"};    TRACE("Applysettings baud=%d bParity=%d stopbits=%s databits=%d\n",        m_nBaud,         m_bParity,         arpszStopbits[m_nStopBits],        m_nDataBits);    switch(m_nBaud) {    case 110:        rate = B110;        break;    case 150:        rate = B150;        break;    case 300:        rate = B300;        break;    case 600:        rate = B600;        break;    case 1200:        rate = B1200;        break;    case 2400:        rate = B2400;        break;    case 4800:        rate = B4800;        break;    case 9600:        rate = B9600;        break;    case 19200:        rate = B19200;        break;    case 38400:        rate = B38400;        break;    case 57600:        rate = B57600;        break;    case 115200:        rate = B115200;        break;    default:        return false;    };    TRACE("Changing configuration...\n");    // Get current settings.    if (tcgetattr((int) m_pHandle, &buf)) {	fprintf(stderr, "Error: tcgetattr\n");	return false;    }    // Reset to raw.    buf.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP                     |INLCR|IGNCR|ICRNL|IXON);    buf.c_oflag &= ~OPOST;    buf.c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);    buf.c_cflag &= ~(CSIZE|PARENB);    buf.c_cflag |= CS8;    // Set baud rate.    cfsetispeed(&buf, rate);    cfsetospeed(&buf, rate);    // Set data bits.    {        int data_bits[9] = {0, 0, 0, 0, 0, CS5, CS6, CS7, CS8};        buf.c_cflag &= ~CSIZE;        buf.c_cflag |= data_bits[m_nDataBits];    }    // Set stop bits.    {        buf.c_cflag &= ~CSTOPB;        if (ONE != m_nStopBits)            buf.c_cflag |= CSTOPB;    }    // Set parity.    {        buf.c_cflag &= ~(PARENB | PARODD); // no parity.        if (m_bParity)                  // even parity.            buf.c_cflag |= PARENB;    }        tcdrain((int) m_pHandle);    usleep(1000000/10*2);    // Set the new settings    if (tcsetattr((int) m_pHandle, TCSADRAIN, &buf)) {	fprintf(stderr, "Error: tcsetattr\n");	return false;    }    tcdrain((int) m_pHandle);    usleep(1000000/10*2);    TRACE("Done.\n");    return true;}bool CeCosTestSerial::Flush (void){    return 0==tcflush((int) m_pHandle, TCIOFLUSH);}bool CeCosTestSerial::Read (CeCosTestUtils::String &str){    char *c=str.GetBuffer();    unsigned int nRead=0;    bool rc=Read(c,str.GetLength(),nRead);    c[nRead]='\0';    str.ReleaseBuffer();    return rc;}bool CeCosTestSerial::Write(const CeCosTestUtils::String &str){    unsigned int nWritten=0;    return Write((void *)(const char *)str,str.GetLength(),nWritten) && nWritten==str.GetLength();}bool CeCosTestSerial::Read (void *pBuf,unsigned int nSize,unsigned int &nRead){    if (!m_bBlockingReads) {        nRead = 0;        int n = read((int)m_pHandle, pBuf, nSize);        if (-1 == n) {            if (EAGAIN == errno)                return true;            TRACE("Read failed: %d\n", errno);            return false;        }        nRead = n;        return true;    }    // Blocking reads: emulate the Windows semantics:    //  If m_nTotalReadTimeout elapses before we see the first char,     //   return.    //  If m_nInterCharReadTimeout elapses after reading any    //   subsequent char, return.    fd_set rfds;    FD_ZERO(&rfds);    FD_SET((int)m_pHandle, &rfds);    // Start with total timeout.    struct timeval tv;    tv.tv_sec = m_nTotalReadTimeout / 1000;    tv.tv_usec = (m_nTotalReadTimeout % 1000) * 1000;    unsigned char* pData = (unsigned char*) pBuf;    nRead = 0;    while (nSize) {        switch(select((int)m_pHandle + 1, &rfds, NULL, NULL, &tv)) {        case 1:        {            int n = read((int)m_pHandle, pData, nSize);            if (-1 == n && EAGAIN != errno) {                TRACE("Read failed: %d\n", errno);                return false;           // FAILED            }            nRead += n;            pData += n;            nSize -= n;            // Now use inter-char timeout.            tv.tv_sec = m_nInterCharReadTimeout / 1000;            tv.tv_usec = (m_nInterCharReadTimeout % 1000) * 1000;        }        break;        case 0:            return true;                // Timeout         case -1:            TRACE("Select failed: %d\n", errno);            return false;        }    }    return true;}bool CeCosTestSerial::Write(void *pBuf,unsigned int nSize,unsigned int &nWritten){    bool rc;    int n=write((int)m_pHandle,pBuf,nSize);    if(-1==n){        nWritten=0;        if (errno == EAGAIN)            rc = true;        else            rc=false;    } else {        nWritten=n;        rc=true;    }    return rc;}bool CeCosTestSerial::ClearError(){    return false;}bool CeCosTestSerial:: SetBaud(unsigned int nBaud,bool bApplySettingsNow/*=true*/){    m_nBaud=nBaud;    return 0==m_pHandle || !bApplySettingsNow || ApplySettings();}bool CeCosTestSerial:: SetParity(bool bParityOn,bool bApplySettingsNow/*=true*/){    m_bParity=bParityOn;    return 0==m_pHandle || !bApplySettingsNow || ApplySettings();}bool CeCosTestSerial:: SetDataBits(int n,bool bApplySettingsNow/*=true*/){    m_nDataBits=n;    return 0==m_pHandle || !bApplySettingsNow || ApplySettings();}bool CeCosTestSerial:: SetStopBits(StopBitsType n,bool bApplySettingsNow/*=true*/){    m_nStopBits=n;    return 0==m_pHandle || !bApplySettingsNow || ApplySettings();}bool CeCosTestSerial:: SetReadTimeOuts(int nTotal,int nBetweenChars,bool bApplySettingsNow/*=true*/) // mSec{    m_nTotalReadTimeout=nTotal;    m_nInterCharReadTimeout=nBetweenChars;    return 0==m_pHandle || !bApplySettingsNow || ApplySettings();}bool CeCosTestSerial:: SetWriteTimeOuts(int nTotal,int nBetweenChars,bool bApplySettingsNow/*=true*/) // mSec{    m_nTotalWriteTimeout=nTotal;    m_nInterCharWriteTimeout=nBetweenChars;    return 0==m_pHandle || !bApplySettingsNow || ApplySettings();}bool CeCosTestSerial::SetBlockingReads(bool b,bool bApplySettingsNow/*=true*/){    m_bBlockingReads=b;    return 0==m_pHandle || !bApplySettingsNow || ApplySettings();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -