#include "serialport.h" #include "util/commonutil.h" #include SerialPort::SerialPort(QObject *parent) :QObject(parent) { m_serial = Q_NULLPTR; m_connected = false; m_rbuffer.clear(); m_wbuffer.clear(); m_currentPortName = ""; m_currentBaudRate = ""; } SerialPort::~SerialPort(){} /** * 8N1 (8个数据位,1个停止位,无校验) * @brief SerialPort::openSerialPort * @param serialName * @param baudrate */ #if 0 bool SerialPort::openSerialPort(QString serialName, quint32 baudrate) { qDebug() << "QSeriaport Attempting connect to " << serialName << "," << baudrate; //如果已经打开,先执行关闭操作 disConnected(); //记录当前正在使用的串口信息 m_currentPortName = serialName; m_currentBaudRate = QString::number(baudrate); //设置串口属性,并且打开 m_serial = new QSerialPort(); //connect(m_serial,SIGNAL(readyRead()),this,SLOT(readData)); connect(m_serial,&QSerialPort::readyRead,this,&SerialPort::readData); connect(m_serial,SIGNAL(error(QSerialPort::SerialPortError)),this, SLOT(onError(QSerialPort::SerialPortError))); m_serial->setPortName((serialName)); m_serial->setBaudRate(baudrate); m_serial->setDataBits(QSerialPort::Data8); m_serial->setParity(QSerialPort::NoParity); m_serial->setStopBits(QSerialPort::OneStop); m_serial->setFlowControl(QSerialPort::NoFlowControl); if(!m_serial->open(QIODevice::ReadWrite)){ qCritical() << "Open Serial failed: " << m_serial->errorString(); return false; } m_connected = true; qDebug() << "QSerialPort connected to " << serialName << "," << baudrate; return true; } #else bool SerialPort::openSerialPort(QString serialName, quint32 baudrate, QSerialPort::DataBits dataBits, QSerialPort::StopBits stopbits, QSerialPort::Parity parity, QSerialPort::FlowControl flowControl) { qDebug() << "QSeriaport Attempting connect to " << serialName << "," << baudrate; //如果已经打开,先执行关闭操作 disConnected(); //记录当前正在使用的串口信息 m_currentPortName = serialName; m_currentBaudRate = QString::number(baudrate); //设置串口属性,并且打开 m_serial = new QSerialPort(); //connect(m_serial,SIGNAL(readyRead()),this,SLOT(readData)); connect(m_serial,&QSerialPort::readyRead,this,&SerialPort::readData); connect(m_serial,SIGNAL(error(QSerialPort::SerialPortError)),this, SLOT(onError(QSerialPort::SerialPortError))); m_serial->setPortName((serialName)); m_serial->setBaudRate(baudrate); m_serial->setDataBits(dataBits); m_serial->setParity(parity); m_serial->setStopBits(stopbits); m_serial->setFlowControl(flowControl); // if(dataBits == QSerialPort::Data6){ // qDebug()<<"Data6"; // } if(!m_serial->open(QIODevice::ReadWrite)){ qCritical() << "Open Serial failed: " << m_serial->errorString(); return false; } m_connected = true; qDebug() << "QSerialPort connected to " << serialName << "," << baudrate; return true; } #endif void SerialPort::disConnected() { m_connected = false; if(m_serial != Q_NULLPTR) { if(m_serial->isOpen()){ m_serial->close(); } m_serial->deleteLater(); m_serial = Q_NULLPTR; qDebug() << "disconnect from " << m_currentPortName << "," << m_currentBaudRate; } } bool SerialPort::isConnected() { return m_connected; } qint64 SerialPort::writeData(QByteArray &data) { if(m_connected == false) { return 0; } //write本身并不保证将数据全部写入,它只返回实际写入的字节数 qint64 total = data.size(), writed = 0,n = 0; while(writed < total) { if((n = m_serial->write(data.mid(writed))) < 0){ break; } writed += n; } qDebug() << QDateTime::currentMSecsSinceEpoch() << " " << "Serial send: " << writed << "," << CommonUtil::ByteArrayToHexString(data); return writed; } void SerialPort::readData() { QByteArray ba = m_serial->readAll(); emit serialReadData(ba); //添加协议 //qDebug() << ba; } void SerialPort::onError(QSerialPort::SerialPortError error) { if(error != QSerialPort::NoError) { qCritical() << "SerialError:" << m_serial->errorString(); } }