[程序源码] 开源一个Qt串口助手,自己编写,请大佬们指点。

[复制链接]
3129|33
 楼主 | 2019-5-15 12:27 | 显示全部楼层 |阅读模式
本帖最后由 一路向北lm 于 2019-5-15 12:37 编辑

界面如下图所示:
QQ截图20190515122635.png
工程源码打包: serial.zip (9.08 KB, 下载次数: 98)

使用特权

评论回复

评论

一路向北lm 2019-5-21 12:38 回复TA
@21ic小喇叭 :谢谢喇叭姐姐 
21ic小喇叭 2019-5-20 16:15 回复TA
支持 
 楼主 | 2019-5-15 12:29 | 显示全部楼层
mainwindow.cpp 文件
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"


  3. unsigned char i =0;    //串口打开标志重绘图像变量

  4. MainWindow::MainWindow(QWidget *parent) :
  5.     QMainWindow(parent),
  6.     ui(new Ui::MainWindow)
  7. {
  8.     ui->setupUi(this);
  9.     setWindowTitle("串口调试助手V1.0");
  10.     Serial_Port_Init();  //串口初始化
  11.    // QwtPlot_Init();      //QwtPlot初始化
  12.     //InitTimer0();        //定时器初始化
  13. }

  14. MainWindow::~MainWindow()
  15. {
  16.     delete ui;
  17. }


  18. // 串口初始化函数
  19. void MainWindow::Serial_Port_Init()
  20. {
  21.     connect(&serial,SIGNAL(readyRead()),this,SLOT(serialRead())); //连接槽
  22.     //获取计算机上所有串口并添加到comboBox中
  23.     QList<QSerialPortInfo>  infos = QSerialPortInfo::availablePorts();
  24.     if(infos.isEmpty())
  25.      {
  26.         ui->comboBox->addItem("无串口");
  27.         return;
  28.      }
  29.      foreach (QSerialPortInfo info, infos)
  30.      {
  31.          ui->comboBox->addItem(info.portName());
  32.          qDebug() << info.portName();
  33.      }

  34.      // 为波特率下拉框添加数据
  35.      QStringList baund_strList;
  36.      baund_strList<<"300"<<"1200"<<"2400"<<"4800"<<"9600"<<"19200"<<"38400"<<"56000"<<"57600"<<"115200"<<"128000";
  37.      ui->ComBox_BaudRate->addItems(baund_strList);
  38.      ui->ComBox_BaudRate->setCurrentText("9600");
  39.      // 为数据位下拉框添加数据
  40.      QStringList Data_strList;
  41.      Data_strList<<"5"<<"6"<<"7"<<"8";
  42.      ui->ComBox_DataBits->addItems(Data_strList);
  43.      ui->ComBox_DataBits->setCurrentText("8");
  44.      // 为校验位下拉框添加数据
  45.      QStringList Check_strList;
  46.      Check_strList<<"None"<<"Odd"<<"Even"<<"Mark"<<"Space";
  47.      ui->ComBox_CheckBits->addItems(Check_strList);
  48.      ui->ComBox_CheckBits->setCurrentText("None");
  49.     // 为停止位下拉框添加数据
  50.      QStringList Stop_strList;
  51.      Stop_strList<<"1"<<"2";
  52.      ui->ComBox_StopBits->addItems(Stop_strList);
  53.      ui->ComBox_StopBits->setCurrentText("1");

  54.      // 控件颜色初始化
  55.      ui->textBrowser->setStyleSheet("color:white;background:black;");
  56.      ui->textEdit->setStyleSheet("color:white;background:black;");

  57.      //第一个属性是字体(微软雅黑),第二个是大小,第三个是加粗(权重是75)
  58.      //常见权重
  59.      //QFont::Light - 25 高亮
  60.      //QFont::Normal - 50 正常
  61.      //QFont::DemiBold - 63 半粗体
  62.      //QFont::Bold - 75 粗体
  63.      //QFont::Black - 87 黑体
  64.      QFont font1("Microsoft YaHei",11,50);
  65.      ui->label_port->setFont(font1);
  66.      ui->label_baund->setFont(font1);
  67.      ui->label_data->setFont(font1);
  68.      ui->label_check->setFont(font1);
  69.      ui->label_stop->setFont(font1);


  70.      QFont font2("Microsoft YaHei",10,50);
  71.      ui->comboBox->setFont(font2);
  72.      ui->ComBox_BaudRate->setFont(font2);
  73.      ui->ComBox_DataBits->setFont(font2);
  74.      ui->ComBox_CheckBits->setFont(font2);
  75.      ui->ComBox_StopBits->setFont(font2);
  76.      ui->open_serial_Button->setFont(font2);
  77.      ui->Clear_RC_Button->setFont(font2);
  78.      ui->Clear_Send_Button->setFont(font2);
  79.      ui->Send_Button->setFont(font2);
  80. }
  81. // 串口打开按钮处理函数
  82. void MainWindow::on_open_serial_Button_clicked()
  83. {
  84.    if(ui->comboBox->isEnabled()) // 串口端口下拉框已使能
  85.    {
  86.       serial.setPortName(ui->comboBox->currentText()); //设置COM口
  87.       serial.setBaudRate(ui->ComBox_BaudRate->currentText().toInt()); //设置波特率
  88.       //设置数据位
  89.       switch(ui->ComBox_DataBits->currentText().toInt())
  90.       {
  91.        case 5: serial.setDataBits(QSerialPort::Data5);  break;
  92.        case 6: serial.setDataBits(QSerialPort::Data6);  break;
  93.        case 7: serial.setDataBits(QSerialPort::Data7);  break;
  94.        case 8: serial.setDataBits(QSerialPort::Data8);  break;
  95.        default :                                        break;
  96.       }
  97.        //设置校验位
  98.       if(ui->ComBox_CheckBits->currentText() == "None")
  99.       {
  100.           serial.setParity(QSerialPort::NoParity);
  101.       }
  102.       else if(ui->ComBox_CheckBits->currentText() == "Odd")
  103.       {
  104.            serial.setParity(QSerialPort::OddParity);
  105.       }
  106.       else if(ui->ComBox_CheckBits->currentText() == "Even")
  107.       {
  108.            serial.setParity(QSerialPort::EvenParity);
  109.       }
  110.       else if(ui->ComBox_CheckBits->currentText() == "Mark")
  111.       {
  112.            serial.setParity(QSerialPort::MarkParity);
  113.       }
  114.       else if(ui->ComBox_CheckBits->currentText() == "Space")
  115.       {
  116.            serial.setParity(QSerialPort::SpaceParity);
  117.       }
  118.       //设置停止位
  119.       if(ui->ComBox_StopBits->currentText() == "1")
  120.       {
  121.           serial.setStopBits(QSerialPort::OneStop);
  122.       }
  123.       else if(ui->ComBox_StopBits->currentText() == "2")
  124.       {
  125.            serial.setStopBits(QSerialPort::TwoStop);
  126.       }
  127.       //设置硬件流控制:无控制
  128.       serial.setFlowControl(QSerialPort::NoFlowControl);

  129.       serial.close(); //先关串口,再打开,可以保证串口不被其它函数占用。
  130.       if(serial.open(QIODevice::ReadWrite)) //以读写的方式打开串口
  131.       {
  132.          ui->open_serial_Button->setText("关闭串口"); //按下打开串口后,显示为关闭串口
  133.          ui->comboBox->setDisabled(true);            //端口选择下拉框被禁止
  134.          ui->ComBox_BaudRate->setDisabled(true);     //波特率选择下拉框被禁止
  135.          ui->ComBox_DataBits->setDisabled(true);     //数据位选择下拉框被禁止
  136.          ui->ComBox_CheckBits->setDisabled(true);    //校验位选择下拉框被禁止
  137.          ui->ComBox_StopBits->setDisabled(true);     //停止位选择下拉框被禁止
  138.          connect(&serial,SIGNAL(readyRead()),this,SLOT(Serial_Read()));        //把串口的readyRead()信号绑定到serialRead()这个槽函数上

  139.          i=1;     //重绘串口打开标志图像
  140.          update();
  141.       }
  142.       else ///串口打开失败
  143.       {
  144.           qDebug("串口已经被占用");
  145.           QMessageBox::information(NULL, "错误", "串口已经被占用", QMessageBox::Yes | QMessageBox::No);


  146.       }
  147.    }
  148.    else // 串口端口下拉框被禁用
  149.    {
  150.       ui->open_serial_Button->setText("打开串口"); //按下“关闭串口”后,按键显示为“打开串口”
  151.       ui->comboBox->setEnabled(true);                       //按下“关闭串口”后,COM口可被修改
  152.       ui->ComBox_BaudRate->setEnabled(true);     //波特率选择下拉框可被修改
  153.       ui->ComBox_DataBits->setEnabled(true);     //数据位选择下拉框可被修改
  154.       ui->ComBox_CheckBits->setEnabled(true);    //校验位选择下拉框可被修改
  155.       ui->ComBox_StopBits->setEnabled(true);     //停止位选择下拉框可被修改
  156.       serial.close();                                                   //关串口
  157.       i = 0;         //重绘串口打开标志图像
  158.       update();
  159.    }
  160. }

  161. // 串口读取数据函数
  162. void MainWindow:: Serial_Read()
  163. {
  164.     QByteArray buf;
  165.     buf = serial.readAll();
  166.     if(!buf.isEmpty())//如果读到的数据不为空
  167.     {
  168.        ui->textBrowser->insertPlainText(buf);
  169.      }
  170.      buf.clear();
  171. }

  172. // 串口发送数据函数
  173. void MainWindow::on_Send_Button_clicked()
  174. {
  175.     serial.write(ui->textEdit->toPlainText().toLatin1()); //以ASC码形式发送
  176.     serial.write("\r\n");
  177. }

  178. void MainWindow::paintEvent(QPaintEvent *)
  179. {

  180.     QPainter painter(this);
  181.     if(i ==0)
  182.     {
  183.        painter.setPen(QPen(Qt::gray,4));//设置画笔形式
  184.        painter.drawEllipse(25,206,20,20);//画圆
  185.     }
  186.     if(i==1)
  187.     {
  188.         painter.setBrush(QBrush(Qt::red));
  189.         painter.drawEllipse(25,206,20,20);//画圆
  190.     }

  191. }




  192. //// QwtPlot初始化函数
  193. //// 初始化 标题title
  194. //// 初始化 yLeft yRight xBottom xTop 及其titile
  195. //void MainWindow::QwtPlot_Init()
  196. //{


  197. ////    QwtText t;

  198. ////    t.setColor(QColor(255,0,0));
  199. ////    QBrush brush(QColor(0,0,255));
  200. ////    ui->qwtPlot->setTitle("温度曲线函数图像");

  201. //    QwtText t;

  202. //    t.setText("温度曲线函数图像"); //设置标题名
  203. ////    QFont font;//设置字体
  204. ////    font.setBold(true); //设置粗体
  205. ////    t.setFont(font);
  206. //    t.setColor(QColor(255,0,0));  //设置颜色
  207. ////    //设置标题背景色
  208. ////    QBrush brush(QColor(255,255,255));
  209. ////    t.setBackgroundBrush(brush);
  210. //     ui->qwtPlot->setTitle(t);

  211. ////     ui->qwtPlot->setAxisScale(QwtPlot::yLeft,0,100,10);
  212. ////     ui->qwtPlot->setAxisScale(QwtPlot::xBottom,0,100,10);
  213. ////     ui->qwtPlot->setAxisTitle(QwtPlot::yLeft,"温度C");
  214. ////     ui->qwtPlot->setAxisTitle(QwtPlot::xBottom,"时间t/s");
  215. //     //ui->qwtPlot->setAxisScale(QwtPlot::yRight,0,100,10);
  216. //     //ui->qwtPlot->setAxisScale(QwtPlot::xTop,0,100,10);
  217. //     //ui->qwtPlot->setAxisTitle(QwtPlot::xTop,QObject::trUtf8("Top"));
  218. //     //ui->qwtPlot->setAxisTitle(QwtPlot::yRight,QObject::trUtf8("Right"));

  219. //     //QwtPlot 绘制曲线图像(静态)
  220. //     QwtPlotCurve *curve;
  221. //     double time[]={1,2,3,4,5,6,7,8,9,10};
  222. //     double val[10]={0,0,1.5,2.6,3.8,5.7,5.9,4.2,3.5,0};
  223. //     curve = new QwtPlotCurve("Acc_X");
  224. //     curve->setSamples(time,val,10);
  225. //     curve->attach(ui->qwtPlot);
  226. //    // QwtPlot 绘制曲线图像(动态)




  227. ////     //数据x,y值保存
  228. ////     QVector<QPointF> vector;
  229. ////     for(int i =0;i<100;i++)
  230. ////     {
  231. ////         QPointF point;
  232. ////         point.setX(i);
  233. ////         int y = 20*sin(i*M_PI/10) + 50;
  234. ////         point.setY(y);
  235. ////         vector.append(point);
  236. ////     }
  237. ////     //构造曲线数据
  238. ////     QwtPointSeriesData* series = new QwtPointSeriesData(vector);

  239. ////     //create plot item
  240. ////     QwtPlotCurve* curve1 = new QwtPlotCurve("Curve 1");
  241. ////     curve1->setData(series);      //设置数据
  242. ////     curve1->attach(ui->qwtPlot); //把曲线附加到qwtPlot上

  243. ////     ui->qwtPlot->replot();
  244. ////     ui->qwtPlot->show();


  245. //}

  246. //void MainWindow::on_qwtPlot_legendDataChanged(const QVariant &itemInfo, const QList<QwtLegendData> &data)
  247. //{

  248. //}

  249. //// 定时器初始化函数
  250. //void MainWindow:: InitTimer0()
  251. //{
  252. //    timer0->start(2000);//启动或重启定时器, 并设置定时器时间:毫秒
  253. //    connect(timer0, SIGNAL(timeout()), this, SLOT(Timer0TimeOut()));
  254. //}

  255. //// 定时器溢出处理函数
  256. //void MainWindow::Timer0TimeOut()
  257. //{

  258. //}

  259. // 清除接收数据单选按钮处理函数

  260. void MainWindow::on_Clear_RC_Button_clicked()
  261. {
  262.        ui->textBrowser->clear();
  263. }

  264. void MainWindow::on_Clear_Send_Button_clicked()
  265. {
  266.     ui->textEdit->clear();
  267. }
复制代码


使用特权

评论回复
 楼主 | 2019-5-15 12:30 | 显示全部楼层
mainwindow.h 文件

  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H

  3. #include <QMainWindow>
  4. #include <QDebug>
  5. //#include <QTimer>
  6. #include <QPainter>
  7. #include <QMessageBox>


  8. // qwt 第三方组件
  9. //#include <qwt_plot.h>
  10. //#include <qwt_plot_curve.h>









  11. //串口头文件
  12. #include <QSerialPort>      //提供访问串口的功能
  13. #include <QSerialPortInfo>  //提供系统中存在的串口的信息


  14. namespace Ui {
  15. class MainWindow;
  16. }

  17. class MainWindow : public QMainWindow
  18. {
  19.     Q_OBJECT

  20. public:
  21.     explicit MainWindow(QWidget *parent = 0);
  22.     ~MainWindow();

  23. private:
  24.     Ui::MainWindow *ui;

  25. /************************串口部分*********************/
  26. public:
  27. QSerialPort serial;       //串口实例
  28. void Serial_Port_Init();  //初始化串口函数
  29. private slots:
  30. void on_open_serial_Button_clicked(); //串口打开按钮处理函数
  31. void Serial_Read();                    //串口读取数据函数
  32. void on_Send_Button_clicked();
  33. /*****************************************************/
  34. /************************QPainter部分*****************/


  35. void on_Clear_RC_Button_clicked();
  36. void on_Clear_Send_Button_clicked();

  37. private:
  38.     void paintEvent(QPaintEvent *); //画图函数

  39. /*****************************************************/





  40. /************************QwtPlot部分******************/
  41. // void QwtPlot_Init();      //QwtPlot初始化
  42. // void on_qwtPlot_legendDataChanged(const QVariant &itemInfo, const QList<QwtLegendData> &data);
  43. /*****************************************************/


  44. /************************定时器部分*********************/
  45. //private:
  46. //    QTimer *timer0;
  47. //    void InitTimer0();
  48. //private slots:
  49. //    void Timer0TimeOut();


  50. /*****************************************************/

  51. };


  52. #endif // MAINWINDOW_H
复制代码


使用特权

评论回复
 楼主 | 2019-5-15 12:36 | 显示全部楼层
serial.pro文件
  1. #-------------------------------------------------
  2. #
  3. # Project created by QtCreator 2019-05-11T17:20:42
  4. #
  5. #-------------------------------------------------

  6. QT       += core gui

  7. QT       += serialport   #添加串口
  8. greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

  9. TARGET = serial
  10. TEMPLATE = app

  11. # The following define makes your compiler emit warnings if you use
  12. # any feature of Qt which as been marked as deprecated (the exact warnings
  13. # depend on your compiler). Please consult the documentation of the
  14. # deprecated API in order to know how to port your code away from it.
  15. DEFINES += QT_DEPRECATED_WARNINGS


  16. # You can also make your code fail to compile if you use deprecated APIs.
  17. # In order to do so, uncomment the following line.
  18. # You can also select to disable deprecated APIs only up to a certain version of Qt.
  19. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0


  20. SOURCES += main.cpp\
  21.         mainwindow.cpp

  22. HEADERS  += mainwindow.h

  23. FORMS    += mainwindow.ui



  24. #Qwt设置
  25. DEFINES += QT_DLL QWT_DLL
  26. LIBS += -L"D:\QT\5.8\mingw53_32\lib" -lqwtd      #qwtd.a 库路径
  27. LIBS += -L"D:\QT\5.8\mingw53_32\lib" -lqwt       #qwt.a 库路径
  28. INCLUDEPATH += D:\QT\5.8\mingw53_32\include\qwt  #qwtd 头文件路径
  29. #end qwt




复制代码




使用特权

评论回复
| 2019-5-15 12:42 | 显示全部楼层
支持下!

使用特权

评论回复
| 2019-5-15 15:04 | 显示全部楼层
支持一下

使用特权

评论回复
 楼主 | 2019-5-15 20:01 | 显示全部楼层

使用特权

评论回复
 楼主 | 2019-5-15 20:01 | 显示全部楼层

谢谢啦

使用特权

评论回复
| 2019-5-16 07:08 | 显示全部楼层
支持一下

使用特权

评论回复
| 2019-5-16 12:05 | 显示全部楼层
历害

使用特权

评论回复
 楼主 | 2019-5-16 14:59 | 显示全部楼层

哈哈,一般般

使用特权

评论回复
| 2019-5-17 19:59 | 显示全部楼层
试用了,还不错!

使用特权

评论回复
 楼主 | 2019-5-18 12:23 | 显示全部楼层
lxa0 发表于 2019-5-17 19:59
试用了,还不错!

一般般 拿来练手的

使用特权

评论回复
| 2019-5-20 12:37 | 显示全部楼层
哇,好棒棒~

使用特权

评论回复
 楼主 | 2019-5-21 12:36 | 显示全部楼层

一般吧,哈哈哈,谦虚

使用特权

评论回复
| 2019-5-27 11:36 | 显示全部楼层
QT开发的话,用C++的较多,用c的话是不是也可以啊,老兄

使用特权

评论回复
 楼主 | 2019-5-27 21:14 | 显示全部楼层
lihui567 发表于 2019-5-27 11:36
QT开发的话,用C++的较多,用c的话是不是也可以啊,老兄

一般是C++ 你非要用C也可以

使用特权

评论回复
| 2019-6-2 14:15 | 显示全部楼层
学习学习  谢谢

使用特权

评论回复
 楼主 | 2019-6-2 19:44 | 显示全部楼层
莫家良 发表于 2019-6-2 14:15
学习学习  谢谢

不用客气

使用特权

评论回复
| 2019-6-8 13:27 | 显示全部楼层
看一下~~~

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

关闭

热门推荐上一条 /6 下一条

在线客服 快速回复 返回顶部 返回列表