对于一个做嵌入式的人来讲,最熟悉的上位机软件就是串口调试助手了,所以开始学Qt的时候,就想着要实现一个串口调试肋手,今天终于写的差不多了,把他共享出来。也感谢那些网上开源的人们对我的帮助,谢谢!
1.开发环境ubuntu16.04+Qt5.6.1
2.串口调试助手效果图
如出现 permission denied请用sudo执行程序就可
3.源码
mainwindow.h文件
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> class QSerialPort; namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); signals: private slots: void on_openButton_clicked(); void on_sendButton_clicked(); void readyReadSlot(); void on_pushButtonClearR_clicked(); void on_pushButtonClearS_clicked(); private: QSerialPort *serialPort; Ui::MainWindow *ui; }; #endif // MAINWINDOW_H
mainwindow.c文件
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QtSerialPort/QtSerialPort> #include <QtSerialPort/QSerialPortInfo> #include <QDebug> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())//获取可用的串口 ui->serialPortComboBox->addItem(info.portName()); ui->radioButtonTextR->setChecked(true); ui->radioButtonTextS->setChecked(true); serialPort = new QSerialPort(); setWindowTitle(tr("串口助手")); } MainWindow::~MainWindow() { delete ui; delete serialPort; } void MainWindow::on_openButton_clicked() //打开串口槽函数 { serialPort->setPortName(ui->serialPortComboBox->currentText());//获取要打开的串口 if(!serialPort->isOpen()) //如果之前是没有打开的则进行open动作 { if(serialPort->open(QIODevice::ReadWrite))//如果打开成功了,则按钮显示“关闭” { //××××××××××××××××××××××××××设置默认串口参数××××××××××××××××××××××××××××××××// //serialPort->setBaudRate(QSerialPort::Baud115200); //波特率19200 serialPort->setBaudRate(ui->comboBoxBaud->currentText().toInt()); serialPort->setDataBits(QSerialPort::Data8); //数据位8位 serialPort->setFlowControl(QSerialPort::NoFlowControl);//无流控 switch (ui->comboBoxStop->currentIndex()) { case 0: serialPort->setStopBits(QSerialPort::OneStop); //1位停止位 break; case 1: serialPort->setStopBits(QSerialPort::OneAndHalfStop); //1.5位停止位 break; case 2: serialPort->setStopBits(QSerialPort::TwoStop); //2位停止位 break; default: serialPort->setStopBits(QSerialPort::UnknownStopBits); break; } switch (ui->comboBoxParity->currentIndex()) { case 0: serialPort->setParity(QSerialPort::NoParity); //无较验位 break; case 1: serialPort->setParity(QSerialPort::OddParity); //奇较验位 break; case 2: serialPort->setParity(QSerialPort::EvenParity); //偶较验位 break; default: break; } serialPort->setReadBufferSize(500); //设置数据缓冲区大小,以后可以写成宏的形式 //××××××××××××××××××××××××××设置默认串口参数××××××××××××××××××××××××××××××××// connect(serialPort, SIGNAL(readyRead()), this, SLOT(readyReadSlot())); ui->openButton->setText(tr("关闭")); } else { qDebug()<<serialPort->errorString(); this->statusBar()->showMessage(serialPort->errorString()); } } else //如果串口处于打开的状态,则关闭 { serialPort->close(); ui->openButton->setText(tr("打开")); } } void MainWindow::on_sendButton_clicked() { QString str = ui->sendTextEdit->toPlainText();//获取要发送的内容 if(serialPort->isOpen()) //如果之前是没有打开的则进行open动作 { if(ui->radioButtonTextS->isChecked()) { //sendData = str.toLatin1(); QByteArray sendData = str.toUtf8(); qDebug() << "发送文本"; serialPort->write(sendData); }else if(ui->radioButtonHexS->isChecked()) { QByteArray str2 = QByteArray::fromHex (str.toLatin1().data()); qDebug() << "发送十六进制"; serialPort->write(str2); } } } void MainWindow::readyReadSlot() //接收数据槽函数 { QByteArray arr = serialPort->readAll(); ui->receiveTextEdit->moveCursor(QTextCursor::EndOfLine); if(ui->radioButtonTextR->isChecked()) { ui->receiveTextEdit->insertPlainText(arr); qDebug() << "接收文本"; }else if(ui->radioButtonHexR->isChecked()) { qDebug() << "接收十六进制"; // ui->receiveTextEdit->toPlainText(); ui->receiveTextEdit->insertPlainText(arr.toHex()); } //ui->receiveTextEdit->setText(arr); //ui->receiveTextEdit->append(arr); } void MainWindow::on_pushButtonClearR_clicked() { ui->receiveTextEdit->clear(); } void MainWindow::on_pushButtonClearS_clicked() { ui->sendTextEdit->clear(); }
源码:https://download.csdn.net/download/maowendi/9620186