推广 热搜: csgo  vue  angelababy  2023  gps  新车  htc  落地  app  p2p 

qt槽函数接受不到信号 QT串口通信

   2023-07-22 网络整理佚名2290
核心提示:QT串口通信使用qt中的串口通信的时候需要用到的两个头文件分别为:我们一般都需要先定义一个全局的串口对象,记得在自己的头文件中添加上:到这里我们就可以调用qt串口通信中的函数了,一般来讲qt串口通信需要经过7步:到这里串口通信的设置就完成了,下面我们需要实现对数据的发送和接收1、连接数据接收槽函数,下位机中一有数据发送过来的时候就会响应这个槽函数

QT串口通讯

前言:如果使用qt作为上位机编写程序,然后通过usb与下位机通信,则需要使用qt中的串口通信。

在qt中使用串口通信时需要用到的两个头文件是:

#include 
#include 

除了添加上面两个头文件外,还需要在工程文件中添加如下一行代码:

QT       += serialport

我们一般需要先定义一个全局串口对象,记得将其添加到你的头文件中:

QSerialPort *serial;

至此,我们就可以调用qt串口通信中的函数了。 一般来说,qt串口通信需要经过7个步骤:

1.设置串口名称(如COM1)

 serial = new QSerialPort;
 serial->setPortName(ui->PortBox->currentText());

这里我采用自动查找可用串口的方法,直接自动设置

foreach (const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
    {
        QSerialPort serial;
        serial.setPort(info);
        if(serial.open(QIODevice::ReadWrite))
        {
            ui->PortBox->addItem(serial.portName());
            serial.close();
        }
    }

2.打开串口

serial->open(QIODevice::ReadWrite);

3.设置波特率(例)

 serial->setBaudRate(QSerialPort::Baud115200);//设置波特率为115200

4.设置数据位(如8)

 serial->setDataBits(QSerialPort::Data8);//设置数据位8

5、设置校验位(如0)

serial->setParity(QSerialPort::NoParity); //校验位设置为0

6.设置停止位(如1)

 serial->setStopBits(QSerialPort::OneStop);//停止位设置为1

7. 设置流量控制

 serial->setFlowControl(QSerialPort::NoFlowControl);//设置为无流控制

至此,串口通讯设置完成。 接下来我们需要实现数据的发送接收

【获取更多QT学习资料,点击下方链接免费获取↓↓,先码字直播不迷路~】

点击→Qt开发高级技术栈学习路线及资料

1、连接数据接收槽函数,下位机有数据发送时会响应该槽函数。

QObject::connect(serial,&QSerialPort::readyRead,this,&MainWindow::ReadData);

2、上位机向下位机发送数据

serial->write(ui->textEdit_2->toPlainText().toLatin1());

主要用到的函数就是这些,我们看一下代码:

1.项目文件.pro

#-------------------------------------------------
#
# Project created by QtCreator 2017-11-17T15:43:04
#
#-------------------------------------------------
QT       += core gui
QT       += serialport
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = SerialPortTool
TEMPLATE = app
# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
        main.cpp \
        mainwindow.cpp
HEADERS += \
        mainwindow.h
FORMS += \
        mainwindow.ui

2.头文件.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include 
#include 
#include 
#include 
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private slots:
    void on_OpenSerialButton_clicked();
    void ReadData();
    void on_SendButton_clicked();
private:
    Ui::MainWindow *ui;
    QSerialPort *serial;
};
#endif // MAINWINDOW_H

3.源文件.cpp

【获取更多QT学习资料,点击下方链接免费获取↓↓,先码字直播不迷路~】

Qt开发高级技术栈学习路线及资料

#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //查找可用的串口
    foreach (const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
    {
        QSerialPort serial;
        serial.setPort(info);
        if(serial.open(QIODevice::ReadWrite))
        {
            ui->PortBox->addItem(serial.portName());
            serial.close();
        }
    }
    //设置波特率下拉菜单默认显示第0项
    ui->BaudBox->setCurrentIndex(0);
}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::on_OpenSerialButton_clicked()
{
    if(ui->OpenSerialButton->text() == tr("打开串口"))
    {
        serial = new QSerialPort;
        //设置串口名
        serial->setPortName(ui->PortBox->currentText());
        //打开串口
        serial->open(QIODevice::ReadWrite);
        //设置波特率
        serial->setBaudRate(QSerialPort::Baud115200);//设置波特率为115200
        //设置数据位数
        switch (ui->BitBox->currentIndex())
        {
        case 8:
            serial->setDataBits(QSerialPort::Data8);//设置数据位8
            break;
        default:
            break;
        }
        //设置校验位
        switch (ui->ParityBox->currentIndex())
        {
        case 0:
            serial->setParity(QSerialPort::NoParity);
            break;
        default:
            break;
        }
        //设置停止位
        switch (ui->BitBox->currentIndex())
        {
        case 1:
            serial->setStopBits(QSerialPort::OneStop);//停止位设置为1
            break;
        case 2:
            serial->setStopBits(QSerialPort::TwoStop);
        default:
            break;
        }
        //设置流控制
        serial->setFlowControl(QSerialPort::NoFlowControl);//设置为无流控制
        //关闭设置菜单使能
        ui->PortBox->setEnabled(false);
        ui->BaudBox->setEnabled(false);
        ui->BitBox->setEnabled(false);
        ui->ParityBox->setEnabled(false);
        ui->StopBox->setEnabled(false);
        ui->OpenSerialButton->setText(tr("关闭串口"));
        //连接信号槽
        QObject::connect(serial,&QSerialPort::readyRead,this,&MainWindow::ReadData);
    }
    else
    {
        //关闭串口
        serial->clear();
        serial->close();
        serial->deleteLater();
        //恢复设置使能
        ui->PortBox->setEnabled(true);
        ui->BaudBox->setEnabled(true);
        ui->BitBox->setEnabled(true);
        ui->ParityBox->setEnabled(true);
        ui->StopBox->setEnabled(true);
        ui->OpenSerialButton->setText(tr("打开串口"));
    }
}
//读取接收到的信息
void MainWindow::ReadData()
{
    QByteArray buf;
    buf = serial->readAll();
    if(!buf.isEmpty())
    {
        QString str = ui->textEdit->toPlainText();
        str+=tr(buf);
        ui->textEdit->clear();
        ui->textEdit->append(str);
    }
    buf.clear();
}
//发送按钮槽函数
void MainWindow::on_SendButton_clicked()
{
    serial->write(ui->textEdit_2->toPlainText().toLatin1());
}

4.界面文件.ui



 MainWindow
 
  
   
    0
    0
    547
    470
   
  
  
   MainWindow
  
  
   
    
     
      10
      50
      54
      12
     
    
    
     串口
    
   
   
    
     
      10
      90
      54
      12
     
    
    
     波特率
    
   
   
    
     
      10
      130
      54
      12
     
    
    
     数据位
    
   
   
    
     
      100
      50
      69
      22
     
    
   
   
    
     
      100
      90
      69
      22
     
    
    
     0
    
    
     
      9600
     
    
    
     
      19200
     
    
    
     
      38400
     
    
    
     
      57600
     
    
    
     
      115200
     
    
   
   
    
     
      100
      120
      69
      22
     
    
    
     0
    
    
     
      8
     
    
   
   
    
     
      100
      160
      69
      22
     
    
    
     
      0
     
    
   
   
    
     
      10
      160
      61
      16
     
    
    
     校验位
    
   
   
    
     
      10
      200
      54
      12
     
    
    
     停止位
    
   
   
    
     
      100
      200
      69
      22
     
    
    
     
      1
     
    
   
   
    
     
      100
      240
      71
      23
     
    
    
     打开串口
    
   
   
    
     
      200
      30
      221
      291
     
    
   
   
    
     
      200
      330
      221
      31
     
    
   
   
    
     
      430
      330
      75
      31
     
    
    
     发送
    
   
  
  
   
    
     0
     0
     547
     23
    
   
  
  
   
    TopToolBarArea
   
   
    false
   
  
  
 
 
 
 

效果图如下,可以自行设置对应下位机的波特率,实现数据发送和接收

这里注意,使用串口通信时,是按字节发送的,所以如果定义了一个char buff[10],而想定义buff[0] = '255'将字符255发送给下位机,下位机将接收不到完整的数据。 经过测试发现发送大于等于10的字符会被截断,只留下最后一个字符。 例如,发送10个字符时,下位机可能只接收字符0.为字符串形式。 比如char buff[] = "255",这样就可以发送完整的255,但是需要注意的是,这是一个字符串而不是字符,所以如果你想根据上位机发送的数据来处理一些东西,你必须知道你发送的是字符还是字符串。

 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
Powered By DESTOON