zoukankan      html  css  js  c++  java
  • QT 串口通讯软件编写

      因项目需要编写一个上位机软件,前段时间刚接触Qt,觉着这个框架类库会比MFC更好用,并且具有跨平台的特性,所以采用Qt5.2写了一个基于串行通讯的调试上位机。

      遇到的主要问题:

    1、串口能接收数据,但接收速度很慢,工作不正常?

    问题:程序只在开始的时候设置了COM口和参数,但是如果预设的COM口不存在,那么新设置好com口后,并没有再次进行初始化操作,所以会导致串口工作不正常。

    2、窗口布局如何是空间跟随主窗口的大小变化而变化?

    首先sizepolicy要采用 “Expanding”模式;

    其次,使用gridlayout spacer groupbox等空间,先从整体上布局,再着眼于细节,一层一层的布局即可。同时还需要注意有些控件大小需要设置成fixed固定长度。

    3、中文显示问题?

    目前试了两种方法

    1. :QStringLiteral
    setWindowTitle(QStringLiteral("我是中文"));
    QTextCodec *codec = QTextCodec::codecForName("GB18030");
    setWindowTitle(codec->toUnicode("我是中文"));

    4、程序打包发布问题

    新版本的Qt自带了一个文件打包工具windeployqt.exe ,路径在D:Qtmsvc32in下。我们可以使用其为我们找到exe所依赖的dll文件。

    • 添加环境变量: path D:Qtmsvc32in,如此才能在cmd命令中使用windeplot.exe 程序。
    • 改变cmd路径到exe所在路径 cmd命令行中输入: cd /d D:SerialPort
    • 路径修改完成后,在cmd中输入命令 windeployqt myCom.exe,运行完后会发现exe所需的dll文件已经查找完毕并添加到了exe所在文件夹中
    • 使用Depends软件查找可能还缺少的dll文件(黄色感叹号的就是缺少的dll),将缺失的dll添加到exe所在文件夹中
    • 将所有需要的dll文件查找完毕后,使用enigma virtual box软件打包exe+dll文件,生成一个独立的exe文件。
    • 将生成的exe在其他电脑上运行测试,如果没有问题,表示打包成功。

    5、Qt界面更新后运行出来的结果界面并没有更新

    mainwindow.ui 编译生成的ui_mainwidow.h文件位置不对,导致引用的是旧版.h界面,所以会导致界面显示未更新。解决办法:删除原来的.h文件,clear-> qmake->rebuild,OK!

    6、怎么实现自动搜索串口功能?

    一开始呢,是使用Qextserialportenumerator来做的,结果呢,这个文件运行需要.lib文件,于是我就开始在VS中配置终于生成了lib文件(后来发现直接把.cpp .h文件加到现在工程不就可以了么。。。绕了个大弯,坑爹),然而并没有能够搜索到系统已有的串口,一直显示零个串口。于是在网上找其他方法,结果发现在Qt5中自带QtSerialPort类和QSerialPortInfo类,前者用于设置串口,读出数据等,后者用于枚举出系统已有的串口。got it,Qt的安装包example中有各种关于串口操作的例程,运行后发现可以枚举出系统已有串口,问题解决。

    文件地址:D:QtExamplesQt-5.4serialport

    7、图片显示?

    (1)添加Resource -> picture.png

    (2)点击resource 中的图片,右键 copy path,即可以获得图片的相对地址。

    对应程序:

    void MainWindow::Init_COM()
    {
        QList<QSerialPortInfo> ports = QSerialPortInfo::availablePorts();
        QStringList strList;
        strList.clear();
    
        QChar *serialNum =  new QChar [ports.size()];
        //get the number in array
        for (int i = 0; i < ports.size(); i++) {
    
          serialNum[i] = ports.at(i).portName().at(3);
        }
    
    //    //Bubble_Sort
        for (int j = ports.size()-1; j>0; j--) {
                for(int i=0;i<j;i++)
                {
                    if(serialNum[i]>serialNum[i+1])
                    {
                          QChar temp = serialNum[i];
                          serialNum[i] = serialNum[i+1];
                          serialNum[i+1] = temp;
                    }
                }
        }
        //set the COMx
        for(int i=0;i<ports.size();i++)
        {
            strList.append(QString::number(serialNum[i].toLatin1()-0x30));
        }
    
        ui->comCombo->clear();
        ui->comCombo->addItems(strList);
        //显示下拉菜单
        ui->comCombo->showPopup();
        free(serialNum);
    }
    

      

     8、环境变量设置问题

    由于更改了环境变量,导致Qt工程无法编译。这里主要是系统环境变量设置问题

    打开 计算机-属性-高级设置-环境变量设置

    编辑

    INCLUDE C:Program Files (x86)Microsoft Visual StudioVC98atlinclude;C:Program Files (x86)Microsoft Visual StudioVC98mfcinclude;C:Program Files (x86)Microsoft Visual StudioVC98include;C:Program Files (x86)Microsoft Visual Studio 12.0VCinclude
    PATH C:WindowsSystem32;C:QtQt5.4.15.4msvc2013in;C:Program Files (x86)Microsoft Visual Studio 12.0Common7IDE;C:QtQt5.4.1ToolsQtCreatorin;C:QtQt5.4.15.4msvc2013in;C:Program Files (x86)Windows Kits8.1Windows Performance Toolkit
    LIB C:Program Files (x86)Microsoft Visual Studio 12.0VCin
    VS120COMNTOOLS C:Program Files (x86)Microsoft Visual Studio 12.0Common7Tools
    VCINSTALLDIR C:Program Files (x86)Microsoft Visual Studio 12.0VC

    主要设置C:WindowsSystem32     C:QtQt5.4.15.4msvc2013in等,

    如果提示cl不是内部命令也不是外部命令时,表明path环境变量设置有误,可以通过cmd命令框中输入ipconfig 等命令来测试,如果显示不是内部或外部命令,则表明环境变量设置有误,那么需要在path中重新正确设置参数。

    9、如何在多窗口之间共享数据?

    1. signal/slot方法,在一个dialog中定义signals,在mainwindow中接收,并编写槽函数,注意connect建立之间一定要初始化dlg对象。
    2. signals函数不能有返回值,并且不能有实现,slot函数的参数不能比signals函数的参数多。
    3. signals/slot是Qt中用于消息传递的一种策略。
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        //信号槽方式下父子窗体传值的测试
        dlg = new Dialog2();
        //dlg->show();
        //关联信号和槽函数
        connect(dlg,SIGNAL(SendString(QString)),this,SLOT(SetString(QString)));
       // dlg->setModal(true); 不论是模态或者非模态都可以正常传值
        //dlg->show();
    }
    MainWindow::~MainWindow()
    {
    
    }
    
    void MainWindow::on_pushButton_clicked()
    {
         dlg->show();
         qDebug() << "open a new dialog succeed" << endl;
    }
    void MainWindow::SetString(QString str)
    {
        ui->textEdit->setText("Hello");
        qDebug() << "signal received" << endl;
    }
    class Dialog2 : public QDialog
    {
        Q_OBJECT
    
    public:
        explicit Dialog2(QWidget *parent = 0);
        ~Dialog2();
    signals:
        void SendString(QString str);
    private slots:
        void on_buttonBox_accepted();
    
    private:
        Ui::Dialog2 *ui;
    };

    界面如如下:

    附源码:https://files.cnblogs.com/files/wll-zju/%281%29SerialPort%E5%8A%A0%E5%85%A5%E6%8C%87%E7%A4%BA%E7%81%AF%EF%BC%8C%E4%B8%B2%E5%8F%A3%E8%87%AA%E5%8A%A8%E6%90%9C%E7%B4%A2%E5%8A%9F%E8%83%BD.zip

    开发环境:VS2013 32bit + Qt5.2.1 32bit

  • 相关阅读:
    GAE 1.5.1 SDK Prerelease
    GAE 1.5.1 SDK Prerelease
    SVN 分支更新与合并
    暂时告别 CSDN 博客,移居 GAE(http://88250.b3log.org)
    暂时告别 CSDN 博客,移居 GAE(http://88250.b3log.org)
    NetBeans 时事通讯(刊号 # 152 Jun 22, 2011)
    NetBeans 时事通讯(刊号 # 152 Jun 22, 2011)
    NetBeans 时事通讯(刊号 # 151 Jun 15, 2011)
    SVN 分支更新与合并
    NetBeans 时事通讯(刊号 # 151 Jun 15, 2011)
  • 原文地址:https://www.cnblogs.com/wll-zju/p/4703360.html
Copyright © 2011-2022 走看看