34.QT-制作串口助手(并动态检测在线串口,附带源码)


#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    setWindowTitle(("简易串口工具"));
    ui->recvEdit->setReadOnly(true);
    initBtn();
    initComboBoxs();
    initSerial();
    qApp->setStyleSheet("QComboBox::item{text-align: center; }");
}

void Widget::initBtn()                   //初始化按钮
{
    Change_btn_isOn(false);
}

void Widget::initComboBoxs()           //初始化下拉列表框
{
    BaudRateType RateTypes[12]={
    BAUD1200,BAUD2400 ,BAUD4800,BAUD9600 ,
    BAUD14400,BAUD19200,BAUD38400,BAUD56000,
    BAUD57600,BAUD115200,BAUD128000, BAUD256000};
    DataBitsType BitsTypes[4]={DATA_5,DATA_6, DATA_7, DATA_8};
    for(int i=0;i<12;i++)
    {
        ui->serial_baud->addItem(QString("%1").arg((int)RateTypes[i]),RateTypes[i]);
    }

    for(int i=0;i<4;i++)
    {
        ui->serial_data->addItem(QString("%1").arg((int)BitsTypes[i]),BitsTypes[i]);
    }

    ui->serial_parity->addItem("无",PAR_NONE);
    ui->serial_parity->addItem("奇校验",PAR_ODD);
    ui->serial_parity->addItem("偶校验",PAR_EVEN);

    ui->serial_stop->addItem("1",STOP_1);
    ui->serial_stop->addItem("1.5",STOP_1_5);
    ui->serial_stop->addItem("2",STOP_2);
}

void Widget::initSerial()               //初始化串口
{
    onPortAddedOrRemoved();
    enumerator =new QextSerialEnumerator();
    enumerator->setUpNotifications();

    connect(enumerator, SIGNAL(deviceDiscovered(QextPortInfo)),this, SLOT(onPortAddedOrRemoved()));  //发现有串口
    connect(enumerator, SIGNAL(deviceRemoved(QextPortInfo)), this, SLOT(onPortAddedOrRemoved()));     //发现没有串口了

     port =new QextSerialPort(QextSerialPort::EventDriven,this);
     connect(port, SIGNAL(readyRead()), this,SLOT(readLineData()));   //连接信号
}

void Widget::on_btn_send_clicked()  //发送数据
{
    if (port->isOpen() && !ui->sendEdit->toPlainText().isEmpty())
      {
        QString data =ui->sendEdit->toPlainText();
        data+="\r\n";
      }
}

void Widget::on_betn_clear_clicked()//清除接收数据
{
    ui->recvEdit->clear();
}

void Widget::on_btn_switch_clicked()//串口开关
{if(!port->isOpen())     //当前未打开
    {
       Change_btn_isOn(true);
       port->setPortName(ui->serial_name->itemData(ui->serial_name->currentIndex()).toString());
       port->setBaudRate((BaudRateType)ui->serial_baud->itemData(ui->serial_baud->currentIndex()).toInt());
       port->setDataBits((DataBitsType)ui->serial_data->itemData(ui->serial_data->currentIndex()).toInt());
       port->setParity((ParityType)ui->serial_parity->itemData(ui->serial_parity->currentIndex()).toInt());
       port->setStopBits((StopBitsType)ui->serial_stop->itemData(ui->serial_stop->currentIndex()).toInt());
       port->open(QIODevice::ReadWrite);
    }
    else
    {
        Change_btn_isOn(false);
        port->close();
    }
}

void Widget::closeEvent(QCloseEvent *)
{
    if(port->isOpen())
        port->close();
}

void Widget::readLineData()                         //读数据
{
   while(port->canReadLine()) {
        ui->recvEdit->moveCursor(QTextCursor::End);
        ui->recvEdit->insertPlainText(QString::fromLocal8Bit(port->readLine()));
    }
}

void Widget::onPortAddedOrRemoved()              //刷新串口号
{
    QString current =ui->serial_name->currentText();
    ui->serial_name->blockSignals(true);        //阻塞信号
    ui->serial_name->clear();

    foreach (QextPortInfo info, QextSerialEnumerator::getPorts())
    {
      QString friendname = info.friendName;
     int end=friendname.lastIndexOf(" ");
     if(end!=-1)
     {
         ui->serial_name->addItem(QString("%1:%2").arg(info.portName).arg(info.friendName.left(end)),info.portName);
     }
     else
     {
        ui->serial_name->addItem(QString("%1:%2").arg(info.portName).arg(info.friendName),info.portName);
     }
   }

    ui->serial_name->setCurrentIndex(ui->serial_name->findText(current));
    if(ui->serial_name->currentIndex()==-1)
        ui->serial_name->setCurrentIndex(0);
    ui->serial_name->blockSignals(false);       //关闭阻塞
}

void Widget::Change_btn_isOn(bool ison)
{
    if(!ison)
    {
        ui->btn_switch->setStyleSheet("color:blue;border: 1px solid blue");
        ui->btn_switch->setText("打开串口");
    }
    else
    {
        ui->btn_switch->setStyleSheet("color:red;border: 1px solid red");
        ui->btn_switch->setText("关闭串口");
    }
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_serial_name_currentIndexChanged(int index)
{
    if (port->isOpen()) {           //如果是开启的,则关闭串口
        port->close();
        Change_btn_isOn(false);
    }
}

文章来源:https://www.cnblogs.com/lifexy/p/9273352.html


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM