Qt-串列埠
阿新 • • 發佈:2019-01-11
一次除錯轉檯裝置時,需要用到串列埠除錯,便使用了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");
除錯串列埠時,可以使用串列埠試助手和串列埠模擬工具。