1#include <QSerialPortInfo> 
    2#include <QLoggingCategory> 
    3#include "OperateSerialPort.h" 
    4#include "DlgSettingsSerialPort.h" 
    7static Q_LOGGING_CATEGORY(log, 
"SerialPort.Operate")
 
   12    SetParameter(&m_Parameter);
 
   15COperateSerialPort::~COperateSerialPort()
 
   28int COperateSerialPort::Start()
 
   33    slotUpdateParameter(
this);
 
   36    check = connect(m_pTerminal, &QTermWidget::sendData,
 
   37                    this, [&](
const char* buf, 
int len){
 
   38                        if(!m_SerialPort.isOpen()) 
return;
 
   39                        QByteArray data(buf, len);
 
   41                        qint64 nLen = m_SerialPort.write(data);
 
   43                            GetStats()->AddSends(nLen);
 
   46    check = connect(&m_SerialPort, SIGNAL(readyRead()),
 
   47                    this, SLOT(slotReadyRead()));
 
   49    check = connect(&m_SerialPort, &QSerialPort::errorOccurred,
 
   50                    this, [&](QSerialPort::SerialPortError error) {
 
   51        qCritical(log) << m_SerialPort.errorString() << error;
 
   52        if(m_SerialPort.isOpen())
 
   53            emit 
sigError(error, m_SerialPort.errorString());
 
   57    if(-1 == m_Parameter.GetSerialPort()
 
   58        && m_Parameter.GetSerialPortName().isEmpty()) {
 
   59        qCritical(log) << 
"Serial port is invalid";
 
   63    int index = m_Parameter.GetSerialPort();
 
   64    if(0 < index && index < QSerialPortInfo::availablePorts().size()) {
 
   65        QSerialPortInfo info = QSerialPortInfo::availablePorts().at(index);
 
   66        if(info.portName() == m_Parameter.GetSerialPortName())
 
   67            m_SerialPort.setPort(info);
 
   69            m_SerialPort.setPortName(m_Parameter.GetSerialPortName());
 
   71        if(m_Parameter.GetSerialPortName().isEmpty()) {
 
   72            qCritical(log) << 
"Serial port is invalid";
 
   76            m_SerialPort.setPortName(m_Parameter.GetSerialPortName());
 
   78    m_SerialPort.setBaudRate(m_Parameter.GetBaudRate());
 
   79    m_SerialPort.setParity(m_Parameter.GetParity());
 
   80    m_SerialPort.setDataBits(m_Parameter.GetDataBits());
 
   81    m_SerialPort.setStopBits(m_Parameter.GetStopBits());
 
   82    m_SerialPort.setFlowControl(m_Parameter.GetFlowControl());
 
   83    if(!m_SerialPort.open(QIODevice::ReadWrite)) {
 
   85        szError = tr(
"Open Serial port [%1] fail errno[%2]: %3").
 
   86                  arg(m_Parameter.GetSerialPortName(),
 
   87                      QString::number(m_SerialPort.error()), m_SerialPort.errorString());
 
   88        qCritical(log) << szError;
 
   89        emit 
sigError(m_SerialPort.error(), szError);
 
   93    m_pTerminal->startTerminalTeletype();
 
   98int COperateSerialPort::Stop()
 
  101        m_pTerminal->close();
 
  103    m_SerialPort.close();
 
  108void COperateSerialPort::slotReadyRead()
 
  110    if(!m_SerialPort.isOpen())
 
  112    auto data = m_SerialPort.readAll();
 
  114        GetStats()->AddReceives(data.length());
 
  115    WriteTerminal(data.data(), data.length());
 
  122    if(!m_Parameter.GetName().isEmpty())
 
  123        return m_Parameter.GetName();
 
  125    if(!m_Parameter.GetSerialPortName().isEmpty())
 
  126        szName = m_Parameter.GetSerialPortName();
 
 
  135    QString szDescription;
 
  136    if(!
Name().isEmpty())
 
  137        szDescription = tr(
"Name: ") + 
Name() + 
"\n";
 
  140        szDescription += tr(
"Type: ") + 
GetTypeName() + 
"\n";
 
  143        szDescription += tr(
"Protocol: ") + 
Protocol();
 
  145        if(!
GetPlugin()->DisplayName().isEmpty())
 
  148        szDescription += 
"\n";
 
  151    if(!m_Parameter.GetSerialPortName().isEmpty())
 
  152        szDescription += tr(
"Serial port: ") + m_Parameter.GetSerialPortName() + 
"\n";
 
  154    if(GetSecurityLevel() != SecurityLevel::No)
 
  155        szDescription += tr(
"Security level: ") + GetSecurityLevelString() + 
"\n";
 
  160    return szDescription;
 
 
virtual QDialog * OnOpenDialogSettings(QWidget *parent) override
Open settgins dialog.
 
const QString Name() override
Name.
 
const QString Description() override
Description.
 
virtual CBackend * InstanceBackend() override
New CBackend.
 
Terminal operate interface.
 
virtual const QString Name() override
Name.
 
void sigFinished()
Successful disconnection signal.
 
void sigRunning()
Start success signal.
 
void sigError(const int nError, const QString &szError)
Triggered when an error is generated.
 
virtual const QString Protocol() const
Protocol.
 
Q_INVOKABLE CPlugin * GetPlugin() const
Get plugin.
 
virtual const QString GetTypeName() const
Get type name.
 
virtual const QString DisplayName() const
The plugin display name.
 
virtual const QString Description() const =0
Plugin description.