发新帖本帖赏金 10.00元(功能说明)我要提问
返回列表
打印

QT编写的串口助手最新版开源了-全网独一无二

[复制链接]
8870|129
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 gaoyang9992006 于 2021-1-25 16:12 编辑

该项目是本版块----镇版之宝
UI设计过程
成品下载地址https://bbs.21ic.com/icview-3051934-1-1.html
代码下载地址请回复后可见
https://gitee.com/gaoyang9992006主要文件源码
#include "mainwindow.h"
#include "ui_mainwindow.h"


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //添加所有串口到comboBox_1里,(串口下拉菜单的名字是comBox_1,可以修改)
    foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
    {
        ui->comboBox_1->addItem(info.portName());
    }
    serial=new QSerialPort(this);//为serial开辟空间
    //设置默认显示的波特率为9600
    ui->comboBox_2->setCurrentIndex(3);
    //给2个单选按钮分成一个组。
    groupButton1=new QButtonGroup(this);
    groupButton1->addButton(ui->radioButton,0);
    groupButton1->addButton(ui->radioButton_2,1);
    ui->radioButton->setChecked(1);
    //给2个单选按钮分成一个组。
    groupButton2=new QButtonGroup(this);
    groupButton2->addButton(ui->radioButton_3,0);
    groupButton2->addButton(ui->radioButton_4,1);
    ui->radioButton_3->setChecked(1);


}

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

void MainWindow::recv_data(void)
{
    qDebug() << "Recv Data" << endl;
    QByteArray buf = serial->readAll();
    qDebug() << buf << endl;
    if(!buf.isEmpty())
    {
        /*
QT默认的编码是unicode,不能显示中文的
windows默认使用(GBK/GB2312/GB18030)
使用fromLocal8Bit()函数,实现了从本地字符集GB到Unicode的转换,用于处理汉语显示乱码等问题
*/
        switch (groupButton1->checkedId()) {
        case 0:
            qDebug()<<"ASCII"<<endl;
        {

            QString myStrTemp = QString::fromLocal8Bit(buf); //转化到本地编码格式GB2312支持中文显示

            //如果换行被勾选将会在每次接收显示前换行,另外判断是不是为空,确保第一行不会先给显示个回车符
            if((ui->checkBox_3->isChecked())&&(!ui->textEdit_1->toPlainText().isEmpty()))
                ui->textEdit_1->insertPlainText("\n");

            ui->textEdit_1->insertPlainText(myStrTemp);

        }
            break;

        case 1:
            qDebug()<<"Hex  "<<endl;
        {

            QDataStream out(&buf,QIODevice::ReadWrite);    //将字节数组读入
            //如果换行被勾选将会在每次接收前换行
            if(ui->checkBox_3->isChecked())
                ui->textEdit_1->insertPlainText("\n");
            while (!out.atEnd())
            {

                qint8 outChar =0;
                out>>outChar;
                QString str =QString("%1").arg(outChar&0xFF,2,16,QLatin1Char('0'));

                //插入空格

                if(ui->checkBox_4->isChecked())
                    ui->textEdit_1->insertPlainText(str+' ');
                else
                    ui->textEdit_1->insertPlainText(str);
            }

        }

            break;

        }

    }
}

//单击搜索串口按钮,重新获取可用的串口
void MainWindow::on_pushButton_1_clicked()
{
    ui->comboBox_1->clear();
    foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
    {
        QSerialPort serial;
        serial.setPort(info);
        if(serial.open(QIODevice::ReadWrite))
            ui->comboBox_1->addItem(info.portName());
    }
}

void MainWindow::on_pushButton_2_clicked()
{
    if(ui->pushButton_2->text()==tr("打开串口"))
    {
        ui->pushButton_2->setText(tr("关闭串口"));
        serial->setPortName(ui->comboBox_1->currentText());
        if(serial->open(QIODevice::ReadWrite))
        {
            qDebug()<<"Open OK"<<endl;
            ui->label_status->setProperty("isOn",true);
            ui->label_status->style()->polish(ui->label_status);
        }
        else
        {
            qDebug()<<"Open Failed"<<endl;
        }
        //设置波特率为当前所选的波特率,因为波特率为字符串,所以用强制转换后才能赋值给设置波特率函数。
        serial->setBaudRate(ui->comboBox_2->currentText().toInt());

        switch (ui->comboBox_3->currentIndex())
        {
        case 0: serial->setStopBits(QSerialPort::OneStop); break;
        case 1: serial->setStopBits(QSerialPort::TwoStop); break;
        case 2: serial->setStopBits(QSerialPort::OneAndHalfStop); break;
        default:break;
        }

        //设置数据位长度,先获取当前索引,然后对应设置。
        switch (ui->comboBox_4->currentIndex())
        {
        case 0: serial->setDataBits(QSerialPort::Data8); break;
        case 1: serial->setDataBits(QSerialPort::Data7); break;
        case 2: serial->setDataBits(QSerialPort::Data6); break;
        case 3: serial->setDataBits(QSerialPort::Data5); break;
        default:break;
        }

        //设置奇偶校验,先获取当前索引,然后对应设置。
        switch (ui->comboBox_5->currentIndex())
        {
        case 0: serial->setParity(QSerialPort::NoParity);   break;
        case 1: serial->setParity(QSerialPort::OddParity);  break;
        case 2: serial->setParity(QSerialPort::EvenParity); break;
        case 3: serial->setParity(QSerialPort::SpaceParity);break;
        case 4: serial->setParity(QSerialPort::MarkParity); break;
        default:break;
        }

        {
        if(ui->checkBox_1->isChecked())
            serial->setDataTerminalReady(true);
        if(ui->checkBox_2->isChecked())
            serial->setRequestToSend(true);
        }


        /*
connect,是QT中的连接函数,将信号发送者sender对象中的信号signal与接受者receiver中的member槽函数联系起来。
*/
        connect(serial,SIGNAL(readyRead()),this,SLOT(recv_data()));
    }
    else
    {
        ui->pushButton_2->setText(tr("打开串口"));
        serial->close();
        qDebug()<<"Close OK"<<endl;
        ui->label_status->setProperty("isOn",false);
        ui->label_status->style()->polish(ui->label_status);



    }
}

void MainWindow::on_pushButton_5_clicked()
{
    switch (groupButton2->checkedId())
    {
    case 0:
    {

        QByteArray str;
        if(ui->checkBox_5->isChecked())
        str = (ui->textEdit_2->toPlainText()+'\r').toLocal8Bit();
        else
        str =  ui->textEdit_2->toPlainText().toLocal8Bit();
        qDebug()<<str<<endl;
        serial->write(str);

    }
        break;

    case 1:
    {
        QString str =ui->textEdit_2->toPlainText();
        str.remove(QRegExp("\\s"));//移除空格
        if(str.length()%2==1)
            str=str.remove(str.length()-1,1);//如果最后一位不完整,舍弃。
        QByteArray text=QByteArray::fromHex(str.toLatin1()); //获取文本框的字符串,转换成字流
        qDebug()<<text.data();            // returns 字符串
        serial->write(text.data());
    }

        break;

    default:break;


    }



}
//清除发送文本框内容
void MainWindow::on_pushButton_4_clicked()
{
    ui->textEdit_2->clear();
}
//清除接收文本框内容
void MainWindow::on_pushButton_3_clicked()
{
    ui->textEdit_1->clear();
}


void MainWindow::on_textEdit_2_textChanged()
{

if(groupButton2->checkedId())
{
    ui->textEdit_2->disconnect();
    QString str =ui->textEdit_2->toPlainText();
    int tem_position=ui->textEdit_2->textCursor().position();
    qDebug()<<"001,length:"<<str.length();
    qDebug()<<"002,size:"<<str.size();
    qDebug()<<"003:"<<str;
    if(str.length()>0)
    qDebug()<<"004:"<<str.at(str.length()-1);
    qDebug()<<"--------------------------------";
str=str.toUpper();
    for( int i=0;i<str.length();i++)
    {

        if(((i+1)%3)==0)
         {
           if(!(str.at(i)==' '))
           {
             str.insert(i,' ');
             ui->textEdit_2->setText(str);
             tem_position++;

             {
                 QTextCursor tc = ui->textEdit_2->textCursor();
                 tc.setPosition(tem_position);
                 ui->textEdit_2->setTextCursor(tc);
             }


            qDebug()<<"005:"<<str;

           }
         }
        else
        {
            if(((str[i]>='0')&&(str[i]<='9'))||((str[i]>='A')&&(str[i]<='F')))
            {
            }
            else
            {
             str=str.remove(i,1);
             i--;
             tem_position--;
            }
            ui->textEdit_2->setText(str);

            {
                QTextCursor tc = ui->textEdit_2->textCursor();
                tc.setPosition(tem_position);
                ui->textEdit_2->setTextCursor(tc);
            }

        }

    }
    qDebug()<<"006:"<<str;
    connect(ui->textEdit_2,SIGNAL(textChanged()),this,SLOT(on_textEdit_2_textChanged()));
}

}
游客,如果您要查看本帖隐藏内容请回复

工程源码下载地址回复可见。
QT5安装教程https://bbs.21ic.com/icview-3066814-1-1.html
为方便交流,建议使用我的源代码的朋友开发的新作品,或在此基础上增加了功能的,请在本版块发布相关软件,以供大家学习交流或使用。
极简模式

正常模式
通过拖动窗口可以改变显示模式。




使用特权

评论回复

打赏榜单

21小跑堂 打赏了 10.00 元 2021-01-21
理由:恭喜通过原创文章审核!请多多加油哦!

评论
gaoyang9992006 2020-12-8 10:08 回复TA
@netjob :已更新。 
gaoyang9992006 2020-12-8 10:06 回复TA
@netjob :不是显得专业嘛。 

相关帖子

沙发
full_stack| | 2020-12-7 15:59 | 只看该作者
看看吧,也不会QT

使用特权

评论回复
板凳
xiaoyh520| | 2020-12-7 16:00 | 只看该作者
6666

使用特权

评论回复
地板
xiaosun| | 2020-12-7 16:01 | 只看该作者
接收的数据不能保存

使用特权

评论回复
5
gaoyang9992006|  楼主 | 2020-12-7 16:02 | 只看该作者
xiaosun 发表于 2020-12-7 16:01
接收的数据不能保存

复制粘贴保存到记事本去。。。功能太复杂就不精简美观了,添加保存功能非常容易,这提供的是源码,可以根据需要在此基础自行添加。

使用特权

评论回复
6
songyongbiing| | 2020-12-7 16:04 | 只看该作者
学习学习

使用特权

评论回复
7
hxhz123| | 2020-12-7 16:05 | 只看该作者
学习一下

使用特权

评论回复
8
caizhiwei| | 2020-12-7 16:05 | 只看该作者
牛X,学习一下下

使用特权

评论回复
9
caijl| | 2020-12-7 16:09 | 只看该作者
不错,帮顶

使用特权

评论回复
10
sgf201| | 2020-12-7 16:15 | 只看该作者
0101

使用特权

评论回复
11
WoodData| | 2020-12-7 16:15 | 只看该作者
看看

使用特权

评论回复
12
WoodData| | 2020-12-7 16:17 | 只看该作者
用的是哪个版本的QT啊?

使用特权

评论回复
13
sgf201| | 2020-12-7 16:18 | 只看该作者
增加一个交互模式吧,类似putty,用于登陆调试

使用特权

评论回复
14
21ic小喇叭| | 2020-12-7 16:19 | 只看该作者
支持支持,祝开业大吉哈哈

使用特权

评论回复
15
gaoyang9992006|  楼主 | 2020-12-7 16:19 | 只看该作者
WoodData 发表于 2020-12-7 16:17
用的是哪个版本的QT啊?

QT5.14版本,应该是官方发布的释放版最后一个版本。现在最新版是5.15。
我编写时候选择的兼容版本是不低于5.12版本就可以。

使用特权

评论回复
16
gaoyang9992006|  楼主 | 2020-12-7 16:21 | 只看该作者
sgf201 发表于 2020-12-7 16:18
增加一个交互模式吧,类似putty,用于登陆调试

那完全可以用putty啊,因为开发窗口版本和控制台版本是两个不同的框架,难以融合到一个软件里。

使用特权

评论回复
17
zgf449400| | 2020-12-7 16:25 | 只看该作者
跟技术高搞PC软件

使用特权

评论回复
18
电子write_cai| | 2020-12-7 16:25 | 只看该作者
高总工6666

使用特权

评论回复
19
zgf449400| | 2020-12-7 16:27 | 只看该作者
不知道 支不支持 结构体 枚举等定义 ,反正 VB不支持,准备放弃

使用特权

评论回复
20
gaoyang9992006|  楼主 | 2020-12-7 16:28 | 只看该作者
zgf449400 发表于 2020-12-7 16:27
不知道 支不支持 结构体 枚举等定义 ,反正 VB不支持,准备放弃

QT支持标准的C语言与标准的C++,VB 好像没这些概念吧。

使用特权

评论回复
发新帖 本帖赏金 10.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:西安公路研究院南京院
简介:主要工作从事监控网络与通信网络设计,以及从事基于嵌入式的通信与控制设备研发。擅长单片机嵌入式系统物联网设备开发,音频功放电路开发。

1893

主题

15622

帖子

197

粉丝