1 Star 0 Fork 3

cpp_workspace/qt 串口调试助手

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
serialdebuggingassistant.cpp 18.57 KB
一键复制 编辑 原始数据 按行查看 历史
冷一点更好 提交于 2022-12-06 22:12 +08:00 . 更新了图标,新增文件处理
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620
#include "serialdebuggingassistant.h"
#include "ui_serialdebuggingassistant.h"
const QString PortIni_0 = "portName";
const QString PortIni_1 = "baudRate";
const QString PortIni_2 = "parity";
const QString PortIni_3 = "dataBits";
const QString PortIni_4 = "stopBits";
const QString RxIni_0 = "ReceivingSteeringFile";
const QString RxIni_1 = "AutoWrapDisplay";
const QString RxIni_2 = "DisplayReceivingTime";
const QString RxIni_3 = "ItIsInHexadecimalFormat";
const QString RxIni_4 = "PauseReceivingDisplay";
const QString TxIni_0 = "EnablingFileDataSource";
const QString TxIni_1 = "AutomaticallySendsAdditionalBits";
const QString TxIni_2 = "ItClearsAutomaticallyAfterSending";
const QString TxIni_3 = "SendInHexadecimalFormat";
const QString TxIni_4 = "TheDataStreamIsSentInALoop";
const QString TxIni_5 = "CyclicTransmissionTime";
SerialDebuggingAssistant::SerialDebuggingAssistant(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::SerialDebuggingAssistant)
,m_port(new QSerialPort(this))
,m_settings(QDir::currentPath()+"/config.ini",QSettings::IniFormat)
,m_txNum(0)
,m_rxNum(0)
{
ui->setupUi(this);
Init();
// QString fileName;
// fileName = ":/Images/electrical-32.png";
// if(!fileName.isEmpty()){ //判断文件名是否为空
// QString saveName = QFileDialog::getSaveFileName(this,tr("Save File"),".",tr("Images (*.ico);;Images (*.icon)"));
// qDebug() << "saveName=" << saveName;
// if(!saveName.isEmpty()){
// QPixmap map(fileName);
// QPixmap newMap = map.scaled(32,32);
// newMap.save(saveName);
// }
// }
}
SerialDebuggingAssistant::~SerialDebuggingAssistant()
{
if(m_port->isOpen())
{
m_port->close();
}
delete m_port;
delete m_tableWidget;
delete ui;
}
void SerialDebuggingAssistant::Init()
{
QList<QSerialPortInfo> ports = QSerialPortInfo::availablePorts();
foreach (QSerialPortInfo port, ports) {
ui->cBox_port->addItem(port.portName());
}
m_baudRateEnum = QMetaEnum::fromType<QSerialPort::BaudRate>();
m_parityEnum = QMetaEnum::fromType<QSerialPort::Parity>();
m_dataBitsEnum = QMetaEnum::fromType<QSerialPort::DataBits>();
m_stopBitsEnum = QMetaEnum::fromType<QSerialPort::StopBits>();
for (int i = 0;i<m_baudRateEnum.keyCount()-1;i++)
{
ui->cBox_baudRate->addItem(m_baudRateEnum.key(i));
}
for (int i = 0;i<m_parityEnum.keyCount()-1;i++)
{
ui->cBox_parity->addItem(m_parityEnum.key(i));
}
for (int i = 0;i<m_dataBitsEnum.keyCount()-1;i++)
{
ui->cBox_dataBits->addItem(m_dataBitsEnum.key(i));
}
for (int i = 0;i<m_stopBitsEnum.keyCount()-1;i++)
{
ui->cBox_stopBits->addItem(m_stopBitsEnum.key(i));
}
//设置默认
ui->cBox_port->setCurrentText(m_settings.value(PortIni_0).toString());
ui->cBox_baudRate->setCurrentText(m_settings.value(PortIni_1).toString());
ui->cBox_parity->setCurrentText(m_settings.value(PortIni_2).toString());
ui->cBox_dataBits->setCurrentText(m_settings.value(PortIni_3).toString());
ui->cBox_stopBits->setCurrentText(m_settings.value(PortIni_4).toString());
//ui->cBox_turnOverFile->setChecked(m_settings.value(RxIni_0).toBool());
ui->cBox_0x0A0x0D->setChecked(m_settings.value(RxIni_1).toBool());
ui->cBox_timeStamp->setChecked(m_settings.value(RxIni_2).toBool());
ui->cBox_rxHex->setChecked(m_settings.value(RxIni_3).toBool());
ui->cBox_stopDisplay->setChecked(m_settings.value(RxIni_4).toBool());
//ui->cBox_dataSrc->setChecked(m_settings.value(TxIni_0).toBool());
ui->cBox_add->setChecked(m_settings.value(TxIni_1).toBool());
ui->cBox_clear->setChecked(m_settings.value(TxIni_2).toBool());
ui->cBox_txHex->setChecked(m_settings.value(TxIni_3).toBool());
ui->cBox_cycle->setChecked(m_settings.value(TxIni_4).toBool());
ui->lEdt_cycleTime->setText(m_settings.value(TxIni_5).toString());
ui->actionAboutQt->setIcon(QApplication::style()->standardIcon(QStyle::SP_TitleBarMenuButton));
m_txNumText = new QLabel(this);
m_rxNumText = new QLabel(this);
m_resetCount = new QPushButton(QIcon(":/Images/icons8_reset.ico"),"复位计数",this);
ui->statusbar->addWidget(m_txNumText);
ui->statusbar->addWidget(m_rxNumText);
ui->statusbar->addWidget(m_resetCount);
UpdataUiRxNum();
UpdataUiTxNum();
connect(m_resetCount,&QPushButton::clicked,[=]()
{
m_rxNum = 0;
m_txNum = 0;
UpdataUiRxNum();
UpdataUiTxNum();
});
if(m_settings.value(TxIni_3).toBool())
{
QString text = ui->pEdt_Tx->toPlainText().toLocal8Bit().toHex(' ').toUpper();
ui->pEdt_Tx->clear();
ui->pEdt_Tx->setPlainText(text);
}
connect(m_port,&QSerialPort::readyRead,[=]()
{
if(ui->cBox_turnOverFile->isChecked())
{
QFile file(m_savePath);
if(file.open(QFile::WriteOnly|QFile::Text|QFile::Append))
{
QByteArray data = m_port->readAll();
file.write(data);
m_rxNum+=data.length();
UpdataUiRxNum();
file.close();
}else
{
InputDisplay(file.errorString());
}
}
else
{
QByteArray data = m_port->readAll();
InputDisplay(data);
m_rxNum+=data.length();
UpdataUiRxNum();
}
});
m_timer = new QTimer(this);
connect(m_timer,&QTimer::timeout,[=]()
{
WriteData();
});
m_tableWidget = new QTableWidget();
m_tableWidget->setWindowTitle("附加位");
m_tableWidget->setRowCount(100);
m_tableWidget->setColumnCount(1);
m_tableWidget->setHorizontalHeaderLabels(QStringList()<<"data");
m_tableWidget->resize(600,500);
for (int i =0;i<m_tableWidget->rowCount();i++)
{
QTableWidgetItem *item = new QTableWidgetItem();
item->setFlags(Qt::ItemIsEnabled|Qt::ItemIsEditable|Qt::ItemIsUserCheckable);
item->setCheckState(Qt::Unchecked);
m_tableWidget->setItem(i,0,item);
m_tableWidget->setColumnWidth(i,m_tableWidget->size().width()-50);
//m_listWidget->openPersistentEditor(item);
}
}
void SerialDebuggingAssistant::InputDisplay(QString text, bool isData, bool isTx)
{
if(ui->cBox_stopDisplay->checkState() == Qt::Checked)return;
if(ui->cBox_timeStamp->checkState() == Qt::Checked && isData == true)
{
if(isTx)
{
text.prepend(QDateTime::currentDateTime().toString("发送: yyyy-MM-dd hh:mm:ss.zzz \r\n"));
}
else
{
text.prepend(QDateTime::currentDateTime().toString("接收: yyyy-MM-dd hh:mm:ss.zzz \r\n"));
}
}
if(ui->cBox_0x0A0x0D->checkState() == Qt::Checked)
{
if(isTx)
{
QTextCharFormat fmt;
fmt.setForeground(QBrush("green"));
ui->pEdt_Rx->mergeCurrentCharFormat(fmt);
}
else
{
QTextCharFormat fmt;
fmt.setForeground(QBrush("blue"));
ui->pEdt_Rx->mergeCurrentCharFormat(fmt);
}
ui->pEdt_Rx->appendPlainText(text.append("\r\n"));
}
else
{
if(isTx)
{
QTextCharFormat fmt;
fmt.setForeground(QBrush("green"));
ui->pEdt_Rx->mergeCurrentCharFormat(fmt);
}
else
{
QTextCharFormat fmt;
fmt.setForeground(QBrush("blue"));
ui->pEdt_Rx->mergeCurrentCharFormat(fmt);
}
ui->pEdt_Rx->insertPlainText(text.remove("\r\n"));
}
}
void SerialDebuggingAssistant::InputDisplay(QByteArray data)
{
if(data.right(2) == "\r\n")
{
data = QByteArray(data.data(),data.length()-2);
}
if(ui->cBox_rxHex->checkState() == Qt::Checked)
{
QString temp = QString(data.toHex(' ').data());
temp = temp.toUpper();
InputDisplay(temp,true);
}
else
{
InputDisplay(QString::fromLocal8Bit(data),true);
}
}
void SerialDebuggingAssistant::WriteData()
{
if(ui->cBox_dataSrc->isChecked())
{
QFile file(m_txDataSrcPath);
if(file.open(QFile::ReadOnly|QFile::Text))
{
QByteArray data;
data = file.readAll();
file.close();
m_port->write(data);
InputDisplay(QString::fromLocal8Bit(data),true,true);
m_txNum += data.length();
UpdataUiTxNum();
}else
{
InputDisplay(file.errorString().toLocal8Bit());
}
}else
{
if(ui->cBox_txHex->checkState() == Qt::Checked)
{
QString text =ui->pEdt_Tx->toPlainText();
m_port->write(QByteArray::fromHex(text.toStdString().c_str()).append("\r\n"));
InputDisplay(ui->pEdt_Tx->toPlainText(),true,true);
m_txNum += QByteArray::fromHex(text.toStdString().c_str()).append("\r\n").length();
qDebug()<<m_txNum;
UpdataUiTxNum();
}
else
{
m_port->write(ui->pEdt_Tx->toPlainText().toLocal8Bit().append("\r\n"));
InputDisplay(ui->pEdt_Tx->toPlainText(),true,true);
m_txNum += ui->pEdt_Tx->toPlainText().toLocal8Bit().append("\r\n").length();
UpdataUiTxNum();
}
if(ui->cBox_clear->checkState() == Qt::Checked)
{
ui->pEdt_Tx->clear();
}
}
}
void SerialDebuggingAssistant::UpdataUiTxNum()
{
m_rxNumText->setText("Tx:"+QString::number(m_txNum));
}
void SerialDebuggingAssistant::UpdataUiRxNum()
{
m_txNumText->setText("Rx:"+QString::number(m_rxNum));
}
void SerialDebuggingAssistant::on_pBtn_open_clicked()
{
m_port->setPortName(ui->cBox_port->currentText());
m_port->setBaudRate(m_baudRateEnum.keyToValue(ui->cBox_baudRate->currentText().toStdString().c_str()));
switch (ui->cBox_parity->currentIndex()) {
case 0:
m_port->setParity(QSerialPort::NoParity);
break;
case 1:
m_port->setParity(QSerialPort::EvenParity);
break;
case 2:
m_port->setParity(QSerialPort::OddParity);
break;
case 3:
m_port->setParity(QSerialPort::SpaceParity);
break;
case 4:
m_port->setParity(QSerialPort::MarkParity);
break;
default:
m_port->setParity(QSerialPort::UnknownParity);
break;
}
switch (ui->cBox_dataBits->currentIndex()) {
case 0:
m_port->setDataBits(QSerialPort::Data5);
break;
case 1:
m_port->setDataBits(QSerialPort::Data6);
break;
case 2:
m_port->setDataBits(QSerialPort::Data7);
break;
case 3:
m_port->setDataBits(QSerialPort::Data8);
break;
default:
m_port->setDataBits(QSerialPort::UnknownDataBits);
break;
}
switch (ui->cBox_stopBits->currentIndex()) {
case 0:
m_port->setStopBits(QSerialPort::OneStop);
break;
case 1:
m_port->setStopBits(QSerialPort::OneAndHalfStop);
break;
case 2:
m_port->setStopBits(QSerialPort::TwoStop);
break;
default:
m_port->setStopBits(QSerialPort::UnknownStopBits);
break;
}
if(ui->pBtn_open->text() == "打开串口")
{
m_port->open(QIODevice::ReadWrite);
if(m_port->error() == QSerialPort::NoError)
{
ui->pBtn_open->setText("关闭串口");
InputDisplay(QString("串口打开成功"));
ui->cBox_port->setEnabled(false);
ui->cBox_baudRate->setEnabled(false);
ui->cBox_parity->setEnabled(false);
ui->cBox_dataBits->setEnabled(false);
ui->cBox_stopBits->setEnabled(false);
ui->pBtn_open->setIcon(QIcon(":/Images/icons8_connected.ico"));
}
else
{
qDebug()<<m_port->error();
}
}
else
{
m_port->close();
ui->pBtn_open->setText("打开串口");
InputDisplay(QString("串口关闭成功"));
ui->cBox_port->setEnabled(true);
ui->cBox_baudRate->setEnabled(true);
ui->cBox_parity->setEnabled(true);
ui->cBox_dataBits->setEnabled(true);
ui->cBox_stopBits->setEnabled(true);
ui->pBtn_open->setIcon(QIcon(":/Images/icons8_disconnected.ico"));
}
}
void SerialDebuggingAssistant::on_pBtn_send_clicked()
{
if(!m_port->isOpen())
{
InputDisplay(QString("串口未打开"));
return;
}
if(ui->cBox_cycle->checkState() == Qt::Checked)
{
if(ui->pBtn_send->text() == "发送")
{
m_timer->setInterval(ui->lEdt_cycleTime->text().toInt(nullptr,10));
m_timer->start();
ui->pBtn_send->setText("停止");
ui->cBox_cycle->setEnabled(false);
ui->lEdt_cycleTime->setEnabled(false);
ui->pBtn_send->setIcon(QIcon(":/Images/icons8_stop.ico"));
}
else
{
m_timer->stop();
ui->pBtn_send->setText("发送");
ui->cBox_cycle->setEnabled(true);
ui->lEdt_cycleTime->setEnabled(true);
ui->pBtn_send->setIcon(QIcon(":/Images/icons8_email_send.ico"));
}
}
else
{
WriteData();
}
}
void SerialDebuggingAssistant::on_cBox_turnOverFile_clicked(bool checked)
{
//m_settings.setValue(RxIni_0,QVariant(checked));
if(checked)
{
m_savePath.append(QDir::currentPath());
m_savePath.append("/");
m_savePath.append(QDate::currentDate().toString("yyyy_MM_dd recive.txt"));
QMessageBox::information(
this,
"保存文件",
QString("文件保存路径:%1")
.arg(m_savePath)
);
}
}
void SerialDebuggingAssistant::on_cBox_0x0A0x0D_clicked(bool checked)
{
m_settings.setValue(RxIni_1,QVariant(checked));
}
void SerialDebuggingAssistant::on_cBox_timeStamp_clicked(bool checked)
{
m_settings.setValue(RxIni_2,QVariant(checked));
}
void SerialDebuggingAssistant::on_cBox_rxHex_clicked(bool checked)
{
m_settings.setValue(RxIni_3,QVariant(checked));
}
void SerialDebuggingAssistant::on_cBox_stopDisplay_clicked(bool checked)
{
m_settings.setValue(RxIni_4,QVariant(checked));
}
void SerialDebuggingAssistant::on_cBox_dataSrc_clicked(bool checked)
{
//m_settings.setValue(TxIni_0,QVariant(checked));
if(checked)
{
m_txDataSrcPath = QFileDialog::getOpenFileName(this,"启用文件数据源",QDir::currentPath(),"All(*.*)TXT(*.txt)");
if(m_txDataSrcPath.isEmpty())
{
QMessageBox::warning(this,"启用文件数据源","文件路径为空");
ui->cBox_dataSrc->setChecked(false);
}
}
}
void SerialDebuggingAssistant::on_cBox_add_clicked(bool checked)
{
// m_settings.setValue(TxIni_1,QVariant(checked));
if(checked)
{
m_tableWidget->show();
}
}
void SerialDebuggingAssistant::on_cBox_clear_clicked(bool checked)
{
m_settings.setValue(TxIni_2,QVariant(checked));
}
void SerialDebuggingAssistant::on_cBox_txHex_clicked(bool checked)
{
m_settings.setValue(TxIni_3,QVariant(checked));
if(checked)
{
QString text = ui->pEdt_Tx->toPlainText().toLocal8Bit().toHex(' ').toUpper();
ui->pEdt_Tx->clear();
ui->pEdt_Tx->setPlainText(text);
}
else
{
QString text =ui->pEdt_Tx->toPlainText();
text = QString::fromLocal8Bit(QByteArray::fromHex(text.toStdString().c_str()));
ui->pEdt_Tx->clear();
ui->pEdt_Tx->setPlainText(text);
}
}
void SerialDebuggingAssistant::on_cBox_cycle_clicked(bool checked)
{
m_settings.setValue(TxIni_4,QVariant(checked));
}
void SerialDebuggingAssistant::on_cBox_port_activated(const QString &arg1)
{
m_settings.setValue(PortIni_0,QVariant(arg1));
}
void SerialDebuggingAssistant::on_cBox_baudRate_activated(const QString &arg1)
{
m_settings.setValue(PortIni_1,QVariant(arg1));
}
void SerialDebuggingAssistant::on_cBox_parity_activated(const QString &arg1)
{
m_settings.setValue(PortIni_2,QVariant(arg1));
}
void SerialDebuggingAssistant::on_cBox_dataBits_activated(const QString &arg1)
{
m_settings.setValue(PortIni_3,QVariant(arg1));
}
void SerialDebuggingAssistant::on_cBox_stopBits_activated(const QString &arg1)
{
m_settings.setValue(PortIni_4,QVariant(arg1));
}
void SerialDebuggingAssistant::on_lEdt_cycleTime_editingFinished()
{
m_settings.setValue(TxIni_5,QVariant(ui->lEdt_cycleTime->text()));
}
void SerialDebuggingAssistant::on_actionExit_triggered()
{
exit(0);
}
void SerialDebuggingAssistant::on_actionAbout_triggered()
{
QMessageBox::about(this,"关于串口调试助手",
"<p><a href=\"https://blog.csdn.net/qq_42815643?type=blog\">CSDN:努力向前爬的蜗牛</p>"
"<p><a href=\"https://github.com/danqingpro\">github:danqingpro</p>"
"<p><a href=\"https://gitee.com/danqpro\">gitee:danqpro</p>"
);
}
void SerialDebuggingAssistant::on_actionAboutQt_triggered()
{
//QMessageBox::aboutQt(this,"关于QT");
QApplication::aboutQt();
}
void SerialDebuggingAssistant::on_actionOpenFile_triggered()
{
QString path = QFileDialog::getOpenFileName(this,"打开文件",QDir::currentPath(),"All(*.*)TXT(*.txt)");
QFile file(path);
if(file.open(QFile::ReadOnly|QFile::Text))
{
QByteArray data;
data = file.readAll();
file.close();
InputDisplay(data);
}
else
{
InputDisplay(file.errorString().toLocal8Bit());
}
}
void SerialDebuggingAssistant::on_pBtn_save_clicked()
{
// if(m_port->isOpen())
// {
// on_pBtn_open_clicked();
// }
QString savePath = QFileDialog::getSaveFileName(this,"保存文件",QDir::currentPath(),"All(*.*)TXT(*.txt)");
QFile file(savePath);
if(file.open(QFile::WriteOnly|QFile::Text))
{
file.write(ui->pEdt_Rx->toPlainText().toLocal8Bit());
file.close();
}
}
void SerialDebuggingAssistant::on_pBtn_loadFile_clicked()
{
on_actionOpenFile_triggered();
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C++
1
https://gitee.com/cpp_workspace/MyQtProject.git
git@gitee.com:cpp_workspace/MyQtProject.git
cpp_workspace
MyQtProject
qt 串口调试助手
master

搜索帮助