bool CComPort::open( const char *port, ePortSpeed speed, int params ){ if( !port || isOpened() ) return false; m_parms = 0; m_pd = ::open(port, O_RDWR|O_NDELAY|O_NOCTTY); if(m_pd < 0)return false; if(lockf(m_pd, F_TLOCK, 0) == -1){ // already locked ::close(m_pd); m_pd = -1; return false; // return error } long flags = 0; fcntl(m_pd, F_GETFL, flags); if(m_type & PT_Async) flags |= O_ASYNC; if(m_type & PT_NonBlock) flags |= O_NONBLOCK; fcntl(m_pd, F_SETFL, flags); changeParms( speed, params ); m_parms = params; return true;}void CComPort::changeParms( ePortSpeed speed, int params ){ if( !isOpened() ) return; tcgetattr(m_pd, &m_oldtio); m_newtio = m_oldtio; m_newtio.c_cflag|=CREAD|CLOCAL; m_newtio.c_lflag&=~(ICANON|ECHO|ECHOE|ECHOK|ECHONL|ISIG); m_newtio.c_iflag&=~(INLCR|IGNCR|ICRNL|INPCK|IGNPAR|PARMRK|ISTRIP|IXANY); m_newtio.c_oflag&=~OPOST; m_newtio.c_cc[VMIN]=1; m_newtio.c_cc[VINTR] = _POSIX_VDISABLE; m_newtio.c_cc[VQUIT] = _POSIX_VDISABLE; m_newtio.c_cc[VSTART] = _POSIX_VDISABLE; m_newtio.c_cc[VSTOP] = _POSIX_VDISABLE; m_newtio.c_cc[VSUSP] = _POSIX_VDISABLE; cfsetispeed(&m_newtio, speed); cfsetospeed(&m_newtio, speed); m_newtio.c_cflag = (params & PP_StopBits) ? m_newtio.c_cflag | CSTOPB : m_newtio.c_cflag & (~CSTOPB); m_newtio.c_cflag = (params & PP_Parity) ? m_newtio.c_cflag | PARENB : m_newtio.c_cflag & (~PARENB); m_newtio.c_cflag = (params & PP_ParityOdd) ? m_newtio.c_cflag | PARODD : m_newtio.c_cflag & (~PARODD); m_newtio.c_cflag = (params & (PP_7bit | PP_8bit )) ? m_newtio.c_cflag & (~CSIZE) : m_newtio.c_cflag | CSIZE; if( params & PP_8bit ) m_newtio.c_cflag |= CS8; else if( params & PP_7bit ) m_newtio.c_cflag |= CS7; //flow_hardware //m_newtio.c_cflag|=CRTSCTS; m_newtio.c_iflag&=(~(IXON|IXOFF|IXANY)); tcflush(m_pd, TCIFLUSH); tcflush(m_pd, TCOFLUSH); tcsetattr(m_pd, TCSANOW, &m_newtio); m_parms = params;}
CMySerialObject::open(......){ // Открываем файл и т.д. ... // пусть fd открытый файловый дескриптор, и настроенный на асинхронную передачу QSocketNotifier* pSNRead = new QSocketNotifier (fd, QSocketNotifier::Read, this); QSocketNotifier* pSNWrite = new QSocketNotifier (fd, QSocketNotifier::Write, this); QSocketNotifier* pSNError = new QSocketNotifier (fd, QSocketNofifier::Exception, this); connect(pSNRead, SIGNAL(activated(int)), this, SLOT(slotReadyRead(int))); connect(pSNWrite, SIGNAL(activated(int)), this, SLOT(slotReadyWrite(int))); connect(pSNError, SIGNAL(activated(int)), this, SLOT(slotError(int)));}CMySerialObject::slotReadyRead(int fd){ // Читаем новые данные, желательно вс а то опять сработает :) ...}CMySerialObject::slotReadyWrite(int fd){ // Можно посылать новые данные ...}CMySerialObject::slotError(int fd){ // Ошибочка вышла :) ...}