1. 程式人生 > >Qt-串列埠

Qt-串列埠

一次除錯轉檯裝置時,需要用到串列埠除錯,便使用了Qt的serialport模組。這裡記錄下,

  • pro QT += serialport 
  • 關鍵,裝置的結束符,eg:本次除錯的裝置為:"\r\n"
  • 常規初始化基本沒問題
class SerPort:public QObject
{
    Q_OBJECT
public:
    SerPort(QString portName,QObject *parent = nullptr);
    ~SerPort();

signals:
    void sig_messageSend(QString str);

public:
    void initSerialPort();
    void portClose();

public slots:
    void slot_readData();
    void writeData(QString data);

private:
    QSerialPort *m_serialPort;
    QString m_portName;
};
void SerPort::writeData(QString data)
{
    qint64 writeLen = m_serialPort->write(data.toLocal8Bit());
    m_serialPort->flush();
    m_serialPort->waitForBytesWritten();
}

void SerPort::initSerialPort()
{
    m_serialPort = new QSerialPort(this);
    // 設定串列埠名
    m_serialPort->setPortName(m_portName);

    // 開啟串列埠
    m_serialPort->open(QIODevice::ReadWrite);

    // 設定波特率
    m_serialPort->setBaudRate(QSerialPort::Baud9600);

    // 設定資料位,Data8與單字元剛好匹配,char
    m_serialPort->setDataBits(QSerialPort::Data8);

    // 設定校驗位
    m_serialPort->setParity(QSerialPort::NoParity); 

    // 設定停止位
    m_serialPort->setStopBits(QSerialPort::OneStop);

    // 設定流控制
    m_serialPort->setFlowControl(QSerialPort::NoFlowControl);

    QObject::connect(m_serialPort,&QSerialPort::readyRead,this,&SerPort::slot_readData);
    connect(m_serialPort, &QSerialPort::errorOccurred,[this](QSerialPort::SerialPortError error){
        emit sig_messageSend("error");
    });

}

void SerPort::portClose()
{
    m_serialPort->close();
}

void SerPort::slot_readData()
{
    static QByteArray bytesAll;
    QByteArray bytes = m_serialPort->readAll();
    if(!bytes.isEmpty())
    {
        bytesAll.append(bytes);
        QString itemStr(bytes);
        // 接收到完整反饋
        if((itemStr.contains("\r"))||(itemStr.contains("\n")))
        {
            QString str(bytesAll);
            emit sig_messageSend(QString("%1").arg(str));
            bytesAll.clear();
        }
    }
}
    QString strCmd;
    // key 結束符
    m_portFirst->writeData(strCmd +"\r\n");

除錯串列埠時,可以使用串列埠試助手和串列埠模擬工具。