用QT实现简单的串口通信

用QT实现简单的串口通信

大家好,这是我人生中的第一篇博客,之所以想开始写博客的原因是因为本人刚毕业进行工作,在工作中常常会遇到很多困难,就常常跑来看大佬们的博客,对我的帮助特别大,所以自己也想把自己的学习经验记录下来,方便以后查看,其实也是想把自己遇到的困难以及如何解决的分享给大家,让大家给我这个小白提提意见。

创建一个QT Widgets Application

在这里插入图片描述
这一步就不用过多的叙述了,就是简单的创建一个项目。

设计串口助手界面

在这里插入图片描述
在新项目中,Forms文件夹下有一个ui文件,双击便可以进行界面设计。
在这里插入图片描述
这是一个比较简单的界面,主要用了Combox、Check Box、Push Button、Label。
在这里插入图片描述
这里建议大家将控件的objectName根据实际含义进行设置,方便后面写代码的时候进行功能识别。如果是按照默认的1.2.3.4排序十分让人头疼。还会迫害以后读你代码的人。

代码

项目中我们需要QT自带的QSerialPort、QSerialPortInfo两个类

//在.pro文件里加入
QT       += core gui serialport
// 首先我们需要用foreach 获取电脑可用端口信息
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()){
        Serial.setPort(info);  //将获得的端口赋予我们的对象
        if(Serial.open(QIODevice::ReadWrite))//打开串口
        ui->cmb_port->addItem(Serial.portName());//将获得的串口名称赋予我们的Combox
        Serial.close();
    }
// 打开串口、设置波特率、停止位、校验位(打开串口按钮的槽函数中完成)
 QString Com_Name = ui->cmb_port->currentText();//获取Combox当前Text,就是串口名COM1等。
    Serial.setPortName(Com_Name);
    if(!Serial.open(QIODevice::ReadWrite)){
        QMessageBox::warning(this,"error","SP not open");
        
    }

    //设置波特率
    int Baud = ui->cmb_baud->currentText().toInt();
    switch (Baud)
    {
    case 9600:
         Serial.setBaudRate(QSerialPort::Baud9600);
        break;
    case 19200:
         Serial.setBaudRate(QSerialPort::Baud19200);
         break;
    case 115200:
         Serial.setBaudRate(QSerialPort::Baud115200);
    }
    //设置停止位(setStopBits)、校验位(setParity)与设置波特率类似、具体参数详看帮助文档,不过Switch的条件最好用Combox的currentIndex来获取。
    //打开串口后我们需要进行给接收区域发送一个信号
 connect(&Serial,&QSerialPort::readyRead,this,&SerialPort::receive_port);
  ui->btn_open->setEnabled(false);//打开串口按钮置灰
  ui->btn_close->setEnabled(true);//关闭串口按钮置亮
// 发送信息
QString send_info = ui->textEdit_send->toPlainText();//获取发送框中的数据

    if (ui->ckb_send->checkState() == Qt::Checked)//是否勾选转换16进制
    {
    Serial.write(send_info.toUtf8().toHex());
    qDebug()<<send_info;
    }else
        Serial.write(send_info.toUtf8());
// 接收数据
QByteArray receive_info = Serial.readAll();//获取串口读取的数据
    qDebug()<<receive_info;
    if (ui->ckb_receive->checkState() == Qt::Checked)//是否勾选转换16进制
    ui->textEdit_receive->insertPlainText(receive_info.toHex(' ').toUpper().append("    "));
    else
        ui->textEdit_receive->insertPlainText(receive_info);
// 关闭串口
    Serial.clear();//清除串口
    Serial.close();//关闭串口
    disconnect(&Serial,&QSerialPort::readyRead,this,&SerialPort::receive_port);//这里需要注意将之前打开串口发送的信号断掉。
    ui->btn_open->setEnabled(true);
    ui->btn_close->setEnabled(false);

写到这里串口简单的收发功能就实现了。下面展示一下结果图。
在这里插入图片描述
发送数据hello world。
在这里插入图片描述在这里插入图片描述
接收16进制数据
在这里插入图片描述
在这里插入图片描述
这篇文章就算结束了,给自己一个提醒也顺便提醒一下大家,帮助文档真的很重要,一定要学会如何查看,一定要学会!!!希望自己的皮毛能帮助到需要的人。谢谢大家的查看。

  • 10
    点赞
  • 120
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值