You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

149 lines
4.3 KiB

#include "serialport.h"
#include "util/commonutil.h"
#include <QtCore>
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();
}
}