主要是藉助第三方庫 qextserialport
#include "qextserialport.h"
QextSerialPort *com; //串口通信對象
/**
* @brief 讀取串口數據
*/
void frmComTool::readData()
{
if (com->bytesAvailable() <= 0) {
return;
}
QUIHelper::sleep(sleepTime);
QByteArray data = com->readAll();
int dataLen = data.length();
if (dataLen <= 0) {
return;
}
if (isShow) {
QString buffer;
if (ui->ckHexReceive->isChecked()) {
buffer = QUIHelper::byteArrayToHexStr(data);
} else {
//buffer = QUIHelper::byteArrayToAsciiStr(data);
buffer = QString::fromLocal8Bit(data);
}
//啓用調試則模擬調試數據
if (ui->ckDebug->isChecked()) {
int count = App::Keys.count();
for (int i = 0; i < count; i++) {
if (buffer.startsWith(App::Keys.at(i))) {
sendData(App::Values.at(i));
break;
}
}
}
append(1, buffer);
receiveCount = receiveCount + data.size();
ui->btnReceiveCount->setText(QString("接收 : %1 字節").arg(receiveCount));
}
}
/**
* @brief 發送串口數據帶參數
*/
void frmComTool::sendData(QString data)
{
if (com == 0 || !com->isOpen()) {
return;
}
//短信貓調試
if (data.startsWith("AT")) {
data += "\r";
}
QByteArray buffer;
if (ui->ckHexSend->isChecked()) {
buffer = QUIHelper::hexStrToByteArray(data);
} else {
buffer = QUIHelper::asciiStrToByteArray(data);
}
com->write(buffer);
append(0, data);
sendCount = sendCount + buffer.size();
ui->btnSendCount->setText(QString("發送 : %1 字節").arg(sendCount));
}
/**
* @brief 打開串口
*/
void frmComTool::on_btnOpen_clicked()
{
if (ui->btnOpen->text() == "打開串口") {
com = new QextSerialPort(ui->cboxPortName->currentText(), QextSerialPort::Polling);
comOk = com->open(QIODevice::ReadWrite);
if (comOk) {
//清空緩衝區
com->flush();
//設置波特率
com->setBaudRate((BaudRateType)ui->cboxBaudRate->currentText().toInt());
//設置數據位
com->setDataBits((DataBitsType)ui->cboxDataBit->currentText().toInt());
//設置校驗位
com->setParity((ParityType)ui->cboxParity->currentIndex());
//設置停止位
com->setStopBits((StopBitsType)ui->cboxStopBit->currentIndex());
com->setFlowControl(FLOW_OFF);
com->setTimeout(10);
changeEnable(true);
ui->btnOpen->setText("關閉串口");
timerRead->start();
}
} else {
timerRead->stop();
com->close();
com->deleteLater();
changeEnable(false);
ui->btnOpen->setText("打開串口");
on_btnClear_clicked();
comOk = false;
}
}