串口QT界面设计常见问题

.pro文件修改

QT          += serialport

.h头文件

#include <QtSerialPort/QSerialPort>//提供访问串口的功能
#include <QtSerialPort/QSerialPortInfo>//提供系统中存在的串口的信息

串口端口刷新

   int index=0;
   foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
       QSerialPort serial;
       serial.setPort(info);
       if(serial.open(QIODevice::ReadWrite))
       {
           comPortCB->addItem(serial.portName());// comPortCB 端口选择框
           if(!comValue.isEmpty())
           {
               if(serial.portName() == comValue)// comValue 默认端口名
               {
                   comPortCB->setCurrentIndex(index);
               }
           }
           serial.close();
           index++;
       }
   } 

textBrowser自动滚屏

	// 把textBrowser的光标设置到最后,从而实现自动滚屏
	QTextCursor text_cursor(acceptAreaTB->textCursor());//设置光标的位置
	text_cursor.movePosition(QTextCursor::End);
	acceptAreaTB->setTextCursor(text_cursor);//acceptAreaTB 接收显示窗口

启动自动选择历史port

通过定义一个 com_cfg.ini 文件

baud=115200
com=COM3
  1. 在每次启动时,通过判断历史端口是否为可以打开(availablePorts)。若该历史端口为有效的端口,则将该端口设置为当前端口,否则设为COM1。
  2. 在每次修改端口后,自动保存当前端口信息到com_cfg.ini配置文档中。

启动串口

该部分实现了串口的配置和启动问题,通过信号槽的方法读取串口数据!

  1. QObject::connect(serial,SIGNAL(readyRead()),this,SLOT(readData()));
    try{
    if(openComPB->text()==tr("打开串口"))
    {
        serial = new QSerialPort;
        // [1]设置串口名
        serial->setPortName(comPortCB->currentText());
        // [2]打开串口
        serial->open(QIODevice::ReadWrite);
        // [3]设置波特率
        serial->setBaudRate(comBaudCB->currentText().toInt());
        // [4]设置数据位数
        switch(comDataBitCB->currentIndex())
        {
            case 8: serial->setDataBits(QSerialPort::Data8); break;
            case 7: serial->setDataBits(QSerialPort::Data7); break;
            default: break;
        }
        // [5]设置奇偶校验
        if(comParityBitCB->currentText()==tr("none")){
            serial->setParity(QSerialPort::NoParity);}
        else if(comParityBitCB->currentText()==tr("odd")){
            serial->setParity(QSerialPort::OddParity);}
        else{
            serial->setParity(QSerialPort::EvenParity);}

        // [6]设置停止位
        if(comStopBitCB->currentText()==tr("1")){
            serial->setStopBits(QSerialPort::OneStop);}
        else if(comStopBitCB->currentText()==tr("1.5")){
            serial->setStopBits(QSerialPort::OneAndHalfStop);}
        else{
            serial->setStopBits(QSerialPort::TwoStop);}
        // [7]设置流控制
        serial->setFlowControl(QSerialPort::NoFlowControl);
        //关闭设置菜单使能
        comPortCB->setEnabled(false);
        comBaudCB->setEnabled(false);
        comDataBitCB->setEnabled(false);
        comParityBitCB->setEnabled(false);
        comStopBitCB->setEnabled(false);
        openComPB->setText(tr("关闭串口"));
        openComPB->setDown(true);
        sendPB->setEnabled(true);

        // [8]连接信号槽
        QObject::connect(serial,SIGNAL(readyRead()),this,SLOT(readData()));        
        //保存数据历史数据以便下次使用(使用键值对操作)
        UserInfoUtils::clearInfo(configFileName);
        UserInfoUtils::saveInfo(configFileName,baudKey,comBaudCB->currentText());
        UserInfoUtils::saveInfo(configFileName,comKey,comPortCB->currentText());
    }
    else
    {
        //关闭串口
        serial->clear();
        serial->close();
        serial->deleteLater();
        //恢复设置使能
        comPortCB->setEnabled(true);
        comBaudCB->setEnabled(true);
        comDataBitCB->setEnabled(true);
        comParityBitCB->setEnabled(true);
        comStopBitCB->setEnabled(true);
        openComPB->setText(tr("打开串口"));
        openComPB->setDown(false);
        sendPB->setEnabled(false);
        if(timer&&timer->isActive())
        {
            timer->stop();
        }

    }

    }catch(QException e)
    {
        qDebug()<<"ERROR";
        e.raise();

    }

最终界面

其中各功能形成模块以方便管理和布局。终于可以方便对串口数据进行处理啦!
串口GUI

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值