📄 qserial.cpp
字号:
/**************************************************************************** ** $Id: qt/examples/lineedits/lineedits.cpp 2.3.2 edited 2001-01-26 $ ** ** Copyright (C) 1992-2000 Trolltech AS. All rights reserved. ** ** This file is part of an example program for Qt. This example ** program may be used, distributed and modified without limitation. ** *****************************************************************************/#include "qserial.h"int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300, B38400, B19200, B9600, B4800, B2400, B1200, B300, };int name_arr[] = {38400, 19200, 9600, 4800, 2400, 1200, 300, 38400, 19200, 9600, 4800, 2400, 1200, 300, };QSerial::QSerial( ){ len = 0; fd = 0;}QSerial::~QSerial( ){ close(fd);}int QSerial::init(QSerialSt *st){ int ret; ret = openDev(st->dev); if( -1 == ret ) { return -1; } setSpeed(st->speed); ret = setParity(st->databits, st->stopbits, st->parity); if( -1 == ret) { return -1; } return 1; }int QSerial::openDev(const char* dev){ fd = open( dev, O_RDWR ); //| O_NOCTTY | O_NDELAY if(-1 == fd) { perror("Can't Open Serial Port"); return -1; } return 1;}void QSerial::setSpeed(int speed){ int i; int status; struct termios Opt; tcgetattr(fd, &Opt); for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++) { if (speed == name_arr[i]) { tcflush(fd, TCIOFLUSH); cfsetispeed(&Opt, speed_arr[i]); cfsetospeed(&Opt, speed_arr[i]); status = tcsetattr(fd, TCSANOW, &Opt); if (status != 0) perror("tcsetattr fd1"); return; } tcflush(fd,TCIOFLUSH); }}int QSerial::setParity(int databits,int stopbits,int parity){ struct termios options; if ( tcgetattr( fd,&options) != 0) { perror("SetupSerial 1"); return -1; } options.c_cflag &= ~CSIZE; switch (databits) { case 7: options.c_cflag |= CS7; break; case 8: options.c_cflag |= CS8; break; default: printf("Unsupported data size\n"); return -1; } switch (parity) { case 'n': case 'N': options.c_cflag &= ~PARENB; /* Clear parity enable */ options.c_iflag &= ~INPCK; /* Enable parity checking */ break; case 'o': case 'O': options.c_cflag |= (PARODD | PARENB); options.c_iflag |= INPCK; /* Disnable parity checking */ break; case 'e': case 'E': options.c_cflag |= PARENB; /* Enable parity */ options.c_cflag &= ~PARODD; options.c_iflag |= INPCK; /* Disnable parity checking */ break; case 'S': case 's': /*as no parity*/ options.c_cflag &= ~PARENB; options.c_cflag &= ~CSTOPB; break; default: printf("Unsupported parity\n"); return -1; } switch (stopbits) { case 1: options.c_cflag &= ~CSTOPB; break; case 2: options.c_cflag |= CSTOPB; break; default: printf("Unsupported stop bits\n"); return -1; } /* Set input parity option */ if (parity != 'n') options.c_iflag |= INPCK; options.c_cc[VTIME] = 0; options.c_cc[VMIN] = 1;//block read until 1 char read options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); /*Input*/ options.c_oflag &= ~OPOST; /*Output*/ tcflush(fd,TCIFLUSH); /* Update the options and do it NOW */ if (tcsetattr(fd,TCSANOW,&options) != 0) { perror("SetupSerial 3"); return 0; } return 1;}void QSerial::setNotifier(){ sn = new QSocketNotifier( fd, QSocketNotifier::Read ); QObject::connect( sn, SIGNAL(activated(int)), this, SLOT(dataRead()) );}void QSerial::writeBlock(const char* data, int len){ int i; i = write(fd, data, len); printf("\n%d write", i);}void QSerial::dataRead(){ len = read(fd, sbuf, 100); emit readyRead(sbuf, len);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -