#include "portuart.h" #include PortUART::PortUART(QObject *parent) : QObject(parent) { baud_rate = QSerialPort::Baud115200; data_bits = QSerialPort::Data8; parity = QSerialPort::NoParity; stop_bits = QSerialPort::OneStop; // flow_control = QSerialPort::NoFlowControl; flow_control = QSerialPort::HardwareControl; serial = new QSerialPort(this); connect(serial, SIGNAL(readyRead()), this, SLOT(read())); connect(serial, SIGNAL(error(QSerialPort::SerialPortError)), this, SLOT(errorSerail(QSerialPort::SerialPortError))); pTimer = new QTimer; connect(pTimer, SIGNAL(timeout()), this, SLOT(timerOverflow())); } PortUART::~PortUART() { if (serial != nullptr) { if(serial->isOpen()) serial->close(); delete serial; } if (pTimer != nullptr) delete pTimer; } bool PortUART::setComData(QString name, QSerialPort::BaudRate baud, QSerialPort::DataBits databits, QSerialPort::Parity parbits, QSerialPort::StopBits stopbits, QSerialPort::FlowControl qflow_control) { port_name = name; baud_rate = baud; data_bits = databits; parity = parbits; stop_bits = stopbits; flow_control = qflow_control; timeInterval = static_cast((1000.0 / static_cast(baud_rate)) * 500); timeInterval < 50 ? timeInterval = 50 : timeInterval += 0; // пауза не меньше 50 мс timeInterval > 250 ? timeInterval = 1000 : timeInterval += 0; // пауза не больше 1000 мс return true; } bool PortUART::open(void) { try { //setup COM port serial->setPortName(port_name); serial->setBaudRate(baud_rate); serial->setDataBits(data_bits); serial->setParity(parity); serial->setStopBits(stop_bits); serial->setFlowControl(flow_control); serial->open(QIODevice::ReadWrite); if(serial->isWritable()) { qDebug() << "Yes, i can write to port!"; } serial->clear(); } catch(...) { return false; } return true; } bool PortUART::close(void) { if (serial->isOpen()) { serial->close(); return true; } else { return false; } } void PortUART::read() { if (pTimer->isActive()) pTimer->stop(); else rcBuffer.clear(); QByteArray bytes = serial->readAll(); qDebug() << QString(bytes.toHex().toUpper()); //qDebug() << QString(bytes); rcBuffer.append(bytes); //emit signalReadedPortIO(bytes); pTimer->start(timeInterval); } void PortUART::timerOverflow(void) { if (rcBuffer.size() > 0) { emit signalReadedPortIO(rcBuffer); } pTimer->stop(); } void PortUART::errorSerail(QSerialPort::SerialPortError err) { if (err != 0) { qDebug() << "Error: " << err; emit signalErrComPort(err); } } QString PortUART::getName(void) { return port_name; } bool PortUART::isOpen() { return serial->isOpen(); } bool PortUART::isWritable() { return serial->isOpen(); } bool PortUART::isReadable() { return serial->isOpen(); } qint64 PortUART::WriteToPort(QByteArray message) { if (serial->isWritable() == false) { return 0; } return serial->write(message); }