forked from ccsens_hardware/qt_qcp_show
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
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();
|
|
}
|
|
}
|
|
|