基于QT的串口调试助手制作

目录

1、创建文件

2、串口界面制作

3、代码

4、结果

5、改进

6、百度链接


1、创建文件

        创建带有ui界面的qt程序,可以点击文件-新建文件或项目就会出现上面的界面,选这Application(应用程序)创建项目,其中Qt Widgets Application是创建qt部件的应用程序,例如下面的Qt Console Application是创建控制台类型的应用,其他读者想要了解的可以创建后运行了解。

         选择Qt Widgets Application-choose后,出现上述界面,修改名称和创建路径后(点击设为默认的项目路径)点击下一步,剩下的步骤直接点下一步即可。

        项目创建完后,就会生成上图目录所示的文件,其中usart.pro文件是非常重要的,随意更改会出现编译出错的情况,但很多较为复杂的qt程序需要添加库文件的声明,包含路径、预处理器定义,生成目录,输出中间目录等设置,所以在不确定如何添加时可以搜索一下(注意备份,防止修改出错);mainwindow.h是主窗口的头文件,在这里可以添加自己的参数变量等;mainwindow.cpp是程序主要修改的部分;mainwindow.ui是界面编辑文件,可点击进入ui设计界面。

2、串口界面制作

        串口界面的制作主要包括:

        1、label标签类

        2、ComboBox类

        3、Plain text Edit

        4、Pushbutton

        5、Check Box

       以上部件设计简单的串口调试助手如图:

        串口的参数包括端口号、波特率、数据位、校验和停止位等,这里只选择图上这五项作为串口的主要配置,界面包括label标签类、QComboBox下拉框类、QPushButton按键类、QCheckBox单选框和QPlainTextEdit纯文本编辑类五种。端口号的下拉框可以通过程序读取到串口添加入下拉框内,其他下拉框(波特率、数据位、校验、停止位)可以在ui界面双击下拉框进行编辑。这样一个简单的串口调试的界面就完成了。

3、代码

        (1)修改usart.pro文件

        在usart.pro文件的如图位置插入 QT += serialport 这一句话,只有这样qt才能使用串口协议进行数据传输和接收。

        (2)修改mainwindow.h文件

         在mainwindow.h头文件中,添加如上几行代码,QTime和QTimer是qt中定时器的文件,QMessageBox是信息提示的文件,QSeralPort和QserialPortInfo是串口协议文件。

        (3)修改mainwindow.cpp文件

        mainwindow.cpp中主要包括串口的获取、串口参数设置、串口接收和发送数据处理等。

        部分代码如下:(完整代码备注邮箱、qq或微信,发送百度链接)

    timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(timer_serialsendandreceiveEvent()));
    timer->start(10);

        利用定时器的timeout触发串口助手的接受事件 ,可以有效的避免数据量过大导致的阻塞问题,并且可以修改timer定时器的触发时间,更加贴合数据传输过程。

QList<QSerialPortInfo> comList = QSerialPortInfo::availablePorts();//获取可用串口列表

    ui->cBox_SerialPortNum->clear();//清空item,避免搜索后重复添加
    ui->cBox_SerialPortBaud->clear();
    ui->CBox_SerialPortcheck->clear();
    ui->cBox_SerialPortStopBit->clear();
    ui->cBox_SerialPortDataNum->clear();

    if(comList.isEmpty())//若没有可用串口,则发送警告
    {
        QMessageBox::warning(this,"Waring!","There's no avalible COM to use, plese check your serialport!");
    }
    else//将可用串口显示到comboBox上以供选择
    {
        for(int i = 0; i < comList.size(); i ++)
        {
            ui->cBox_SerialPortNum->addItem(comList[i].portName());
            //ui->cBox_SerialPortNum->addItem(comList[i].description());//设备描述
        }
    }

    QStringList baudRateList = QStringList() << "1200" << "2400" << "4800"
                                             << "9600" << "14400" << "19200" << "38400" << "43000" << "57600"
                                             << "76800" << "115200" << "128000" << "230400" << "256000" <<"460800"
                                             << "921600" << "1382400";
    QStringList parityList = QStringList() << "无" << "奇校验" << "偶校验";
    QStringList stopBitsList = QStringList() << "1" << "1.5" << "2";
    QStringList dataBitsList = QStringList() << "8" << "7" << "6" << "5";

    ui->cBox_SerialPortBaud->addItems(baudRateList);
    ui->CBox_SerialPortcheck->addItems(parityList);
    ui->cBox_SerialPortStopBit->addItems(stopBitsList);
    ui->cBox_SerialPortDataNum->addItems(dataBitsList);
    ui->cBox_SerialPortBaud->setCurrentIndex(10);//设置115200为默认选项

      上述代码主要是获取到串口端口号并将其添加入下拉框、填充其他下拉框的内容,为后续工作做准备。

 QByteArray bufferHex = str_buffer_Serial.toHex();//转换成hex
    bufferHex=bufferHex.toUpper();//转换成大写
    QString str_buffer1;

    if(ui->cb_rechex->isChecked())//16进制显示
    {
      str_buffer1 = QString(bufferHex);//转换成字符
      for(int i = str_buffer1.count(); i > 0; i = i-2)
      {
        str_buffer1.insert(i," ");
      }
    }
    else//字符形式显示
    {
       str_buffer1 = QString(str_buffer_Serial);
    }
    if(ui->opencolse->text()=="关闭串口")
    {
       ui->SerialPortDataShow->insertPlainText(str_buffer1);
       ui->SerialPortDataShow->moveCursor(QTextCursor::End);
    }
    str_buffer1=ui->SerialPortDataShow->toPlainText();
    if(str_buffer1.size()>10000) ui->SerialPortDataShow->clear();

    str_buffer_Serial.clear();
//qDebug("getdata");
    qint64 byteLen_now = serialbasic->bytesAvailable();
    if(byteLen_now < 0)
    {
        return;
    }
    //qDebug()<<"当前缓存长度"<<byteLen_now<<endl;

    buffer_Serial+=serialbasic->readAll();

    QByteArray bufferHex = buffer_Serial.toHex();//转换成hex
    bufferHex=bufferHex.toUpper();//转换成大写
    str_buffer_Serial+=buffer_Serial;

    //ui->SerialPortDataShow->append(str_buffer_Serial);
    //QString str_buffer = QString(buffer_Serial);

    QString str_buffer = QString(bufferHex);//转换成字符
    for(int i = str_buffer.count(); i > 0; i = i-2)
    {
      str_buffer.insert(i," ");
    }

    buffer_Serial.clear();

4、结果

        因为手头没有硬件作为测试,所以使用的Vspd虚拟串口+sscom串口调试助手作为调试的方案。

        将两端串口的参数调整一致后,测试最终结果如图,经过一段时间的测试,效果良好,并且可以进行双向通信并转化成16进制传输 。

5、改进

        由于制作时间较短,无法进行例如画图的工作,附加数据库保存数据,修改串口通信为无线通信,与下位机进行互联通信等功能,之后考虑会添加代码。有需要可以联系博主。

        qq:3125201632    备注:逆流

        以上成果属于个人积累,有任何不足之处还望谅解,欢迎批评指正,我们一起学习进步。有任何问题,即使跟博主联系,欢迎欢迎!

6、百度链接

(求关注!!!)

链接:https://pan.baidu.com/s/16drrESWyYx32mprD2oxevA?pwd=55xk 
提取码:55xk

  • 8
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
QT提供了对串口通信的支持,可以方便地实现串口调试助手。下面是一个简单的QT串口调试助手的设计思路和功能描述: 1. 创建一个串口类,用来发送和接收数据; 2. 创建两个文本框和几个按钮来实现数据的接收和发送,并且设置串口通信的参数; 3. 实现针对串口数据的解析; 4. 实现波形数据绘制和文件操作。 具体实现步骤如下: 1. 创建一个QT工程,使用widget作为默认控件; 2. 在widget.h中添加相关的函数和变量,指针申明; 3. 在widget.cpp中实现具体的函数功能; 4. 实现定时接收串口数据的功能。 以下是一个简单的QT串口调试助手的示例代码,其中使用QSerialPort类实现了串口通信功能,并使用QTimer类实现了定时接收串口数据的功能: ```cpp #include "widget.h" #include "ui_widget.h" #include <QtSerialPort/QSerialPort> #include <QtSerialPort/QSerialPortInfo> #include <QTimer> Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); // 初始化串口 serialPort = new QSerialPort(this); serialPort->setBaudRate(QSerialPort::Baud9600); serialPort->setDataBits(QSerialPort::Data8); serialPort->setParity(QSerialPort::NoParity); serialPort->setStopBits(QSerialPort::OneStop); serialPort->setFlowControl(QSerialPort::NoFlowControl); // 显示可用串口列表 foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) { ui->comboBox_serialPort->addItem(info.portName() + " : " + info.description()); } // 连接信号槽 connect(ui->pushButton_openSerial, SIGNAL(clicked()), this, SLOT(openSerialPort())); connect(ui->pushButton_closeSerial, SIGNAL(clicked()), this, SLOT(closeSerialPort())); connect(ui->pushButton_sendData, SIGNAL(clicked()), this, SLOT(sendData())); connect(serialPort, SIGNAL(readyRead()), this, SLOT(readData())); connect(&timer, SIGNAL(timeout()), this, SLOT(timeout())); // 设置定时器 timer.start(100); } Widget::~Widget() { delete ui; } void Widget::openSerialPort() { // 打开串口 serialPort->setPortName(ui->comboBox_serialPort->currentText().split(" : ").first()); if (serialPort->open(QIODevice::ReadWrite)) { ui->label_status->setText("串口已打开"); } else { ui->label_status->setText("打开串口失败"); } } void Widget::closeSerialPort() { // 关闭串口 if (serialPort->isOpen()) { serialPort->close(); ui->label_status->setText("串口已关闭"); } } void Widget::sendData() { // 发送数据 serialPort->write(ui->lineEdit_sendData->text().toUtf8()); } void Widget::readData() { // 读取数据 QByteArray data = serialPort->readAll(); ui->textEdit_receiveData->append(data); } void Widget::timeout() { // 定时读取数据 readData(); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值