iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >QT如何实现串口通信
  • 660
分享到

QT如何实现串口通信

2023-06-15 04:06:06 660人浏览 薄情痞子
摘要

小编给大家分享一下Qt如何实现串口通信,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言:如果用qt写程序作为上位机,然后通过和usb和下位机通信的时候,就需要用

小编给大家分享一下Qt如何实现串口通信,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

前言:如果用qt写程序作为上位机,然后通过和usb和下位机通信的时候,就需要用到qt中的串口通信了。

使用qt中的串口通信的时候需要用到的两个头文件分别为:

#include <QtSerialPort/QSerialPort>#include <QtSerialPort/QSerialPortInfo>

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

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、设置波特率(如115200)

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);//设置为无流控制

到这里串口通信的设置就完成了,下面我们需要实现对数据的发送和接收

连接数据接收槽函数,下位机中一有数据发送过来的时候就会响应这个槽函数

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

从上位机发送数据到下位机

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

主要使用的函数就这些了,我们来看看代码:

工程文件SerialPortTool.pro

#-------------------------------------------------## Project created by QtCreator 2017-11-17T15:43:04##-------------------------------------------------QT       += core guiQT       += serialportgreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = SerialPortToolTEMPLATE = 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.0SOURCES += \        main.cpp \        mainwindow.cppHEADERS += \        mainwindow.hFORMS += \        mainwindow.ui

头文件mainwindow.h

#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include <QDebug>#include <QtSerialPort/QSerialPort>#include <QtSerialPort/QSerialPortInfo>namespace Ui {class MainWindow;}class MainWindow : public QMainWindow{    Q_OBJECTpublic:    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

源文件mainwindow.cpp

#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());}

界面文件mainwindow.ui

<?xml version="1.0" encoding="UTF-8"?><ui version="4.0"> <class>MainWindow</class> <widget class="QMainWindow" name="MainWindow">  <property name="geometry">   <rect>    <x>0</x>    <y>0</y>    <width>547</width>    <height>470</height>   </rect>  </property>  <property name="windowTitle">   <string>MainWindow</string>  </property>  <widget class="QWidget" name="centralWidget">   <widget class="QLabel" name="label">    <property name="geometry">     <rect>      <x>10</x>      <y>50</y>      <width>54</width>      <height>12</height>     </rect>    </property>    <property name="text">     <string>串口</string>    </property>   </widget>   <widget class="QLabel" name="label_2">    <property name="geometry">     <rect>      <x>10</x>      <y>90</y>      <width>54</width>      <height>12</height>     </rect>    </property>    <property name="text">     <string>波特率</string>    </property>   </widget>   <widget class="QLabel" name="label_3">    <property name="geometry">     <rect>      <x>10</x>      <y>130</y>      <width>54</width>      <height>12</height>     </rect>    </property>    <property name="text">     <string>数据位</string>    </property>   </widget>   <widget class="QComboBox" name="PortBox">    <property name="geometry">     <rect>      <x>100</x>      <y>50</y>      <width>69</width>      <height>22</height>     </rect>    </property>   </widget>   <widget class="QComboBox" name="BaudBox">    <property name="geometry">     <rect>      <x>100</x>      <y>90</y>      <width>69</width>      <height>22</height>     </rect>    </property>    <property name="currentIndex">     <number>0</number>    </property>    <item>     <property name="text">      <string>9600</string>     </property>    </item>    <item>     <property name="text">      <string>19200</string>     </property>    </item>    <item>     <property name="text">      <string>38400</string>     </property>    </item>    <item>     <property name="text">      <string>57600</string>     </property>    </item>    <item>     <property name="text">      <string>115200</string>     </property>    </item>   </widget>   <widget class="QComboBox" name="BitBox">    <property name="geometry">     <rect>      <x>100</x>      <y>120</y>      <width>69</width>      <height>22</height>     </rect>    </property>    <property name="currentIndex">     <number>0</number>    </property>    <item>     <property name="text">      <string>8</string>     </property>    </item>   </widget>   <widget class="QComboBox" name="ParityBox">    <property name="geometry">     <rect>      <x>100</x>      <y>160</y>      <width>69</width>      <height>22</height>     </rect>    </property>    <item>     <property name="text">      <string>0</string>     </property>    </item>   </widget>   <widget class="QLabel" name="label_4">    <property name="geometry">     <rect>      <x>10</x>      <y>160</y>      <width>61</width>      <height>16</height>     </rect>    </property>    <property name="text">     <string>校验位</string>    </property>   </widget>   <widget class="QLabel" name="label_6">    <property name="geometry">     <rect>      <x>10</x>      <y>200</y>      <width>54</width>      <height>12</height>     </rect>    </property>    <property name="text">     <string>停止位</string>    </property>   </widget>   <widget class="QComboBox" name="StopBox">    <property name="geometry">     <rect>      <x>100</x>      <y>200</y>      <width>69</width>      <height>22</height>     </rect>    </property>    <item>     <property name="text">      <string>1</string>     </property>    </item>   </widget>   <widget class="QPushButton" name="OpenSerialButton">    <property name="geometry">     <rect>      <x>100</x>      <y>240</y>      <width>71</width>      <height>23</height>     </rect>    </property>    <property name="text">     <string>打开串口</string>    </property>   </widget>   <widget class="QTextEdit" name="textEdit">    <property name="geometry">     <rect>      <x>200</x>      <y>30</y>      <width>221</width>      <height>291</height>     </rect>    </property>   </widget>   <widget class="QTextEdit" name="textEdit_2">    <property name="geometry">     <rect>      <x>200</x>      <y>330</y>      <width>221</width>      <height>31</height>     </rect>    </property>   </widget>   <widget class="QPushButton" name="SendButton">    <property name="geometry">     <rect>      <x>430</x>      <y>330</y>      <width>75</width>      <height>31</height>     </rect>    </property>    <property name="text">     <string>发送</string>    </property>   </widget>  </widget>  <widget class="QMenuBar" name="menuBar">   <property name="geometry">    <rect>     <x>0</x>     <y>0</y>     <width>547</width>     <height>23</height>    </rect>   </property>  </widget>  <widget class="QToolBar" name="mainToolBar">   <attribute name="toolBarArea">    <enum>TopToolBarArea</enum>   </attribute>   <attribute name="toolBarBreak">    <bool>false</bool>   </attribute>  </widget>  <widget class="QStatusBar" name="statusBar"/> </widget> <layoutdefault spacing="6" margin="11"/> <resources/> <connections/></ui>

效果图如下,自己设置对应下位机的波特率就可以实现数据收发了

QT如何实现串口通信

这里注意一下,使用串口通信的时候是按字节发送的,所以如果你定义一个char buff[10],而且你想这样定义buff[0] = '255'发送255这个字符给下位机的时候,下位机是接收不完整的,经过测试发现发送大于或等于10的字符是会被截断的,只会留下最后一个字符,比如说发送10字符的时候,下位机很有可能只能接收到0这个字符,当然如果想要完整的发送过去的话可以定义成字符串形式。比如char buff[] ="255",这样就可以发送一个完整的255过去了,但是需要注意的是这是一个字符串不是一个字符,所以如果你在下位机如果要根据上位机发送的数据来处理一些事情的时候一定要清楚你发送的是字符还是字符串。

以上是“QT如何实现串口通信”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: QT如何实现串口通信

本文链接: https://www.lsjlt.com/news/277373.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • QT如何实现串口通信
    小编给大家分享一下QT如何实现串口通信,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言:如果用qt写程序作为上位机,然后通过和usb和下位机通信的时候,就需要用...
    99+
    2023-06-15
  • QT串口通信的实现方法
    前言:如果用qt写程序作为上位机,然后通过和usb和下位机通信的时候,就需要用到qt中的串口通信了。 使用qt中的串口通信的时候需要用到的两个头文件分别为: #include &...
    99+
    2024-04-02
  • C#如何实现串口通信
    这篇文章主要讲解了“C#如何实现串口通信”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#如何实现串口通信”吧!1.基本概念2.前端winForm布局如下(仅仅为了实现功能,布局略丑)3.代...
    99+
    2023-06-29
  • Qt开发如何实现跨窗口信号槽通信
    这篇文章主要介绍“Qt开发如何实现跨窗口信号槽通信”,在日常操作中,相信很多人在Qt开发如何实现跨窗口信号槽通信问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Qt开发如何实现跨窗口信号槽通信”的疑惑有所帮助!...
    99+
    2023-06-22
  • Qt如何实现两个独立窗口的信号通信
    小编给大家分享一下Qt如何实现两个独立窗口的信号通信,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!具体内容如下知识点Qt两个窗口的建立、窗口的通信、处理子窗口的信号、信号的重载、Lamber表达式、自定义信号和自定义槽函数...
    99+
    2023-06-22
  • Qt开发实现跨窗口信号槽通信
    多窗口通信,如果是窗口类对象之间互相包含,则可以直接开放public接口调用,不过,很多情况下主窗口和子窗口之间要做到异步消息通信,就必须依赖到跨窗口的信号槽,以下是一个简单的示例。...
    99+
    2024-04-02
  • C#怎么实现串口通信
    本篇内容介绍了“C#怎么实现串口通信”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!框架准备出于简单考虑,首先创建一个Winform项目,本文...
    99+
    2023-07-05
  • C#实现简单串口通信
    串口通信(Serial Communications)是指外设和计算机间通过数据信号线、地线等按位(bit)进行传输数据的一种通信方式,属于串行通信方式,能够实现远距离通信,长度可达...
    99+
    2024-04-02
  • 基于C#实现串口通信
    本文实例为大家分享了C#实现串口通信的具体代码,供大家参考,具体内容如下 1.基本概念 2.前端winForm布局如下(仅仅为了实现功能,布局略丑) 3.代码实现如下 names...
    99+
    2024-04-02
  • Qt实现两个独立窗口的信号通信
    本文实例为大家分享了Qt实现两个独立窗口的信号通信的具体代码,供大家参考,具体内容如下 知识点 Qt两个窗口的建立、窗口的通信、处理子窗口的信号、信号的重载、Lamber表达式、自定...
    99+
    2024-04-02
  • Flutter:如何在Android中实现串口通信调试
            本文介绍如何通过flutter_libserialport插件在Flutter中实现串口通信调试。 1、引入依赖         在flutter工程的pubspec.yaml文件中引入flutter_libserialpo...
    99+
    2023-08-31
    android flutter 串口 dart
  • 【Python】Python实现串口通信(Python+Stm32)
    🎉欢迎来到Python专栏~Python实现串口通信 ...
    99+
    2023-08-31
    python stm32 开发语言 串口通信 嵌入式硬件 Python+Stm32
  • 怎么使用Java实现串口通信
    要使用Java实现串口通信,可以使用Java的RXTX库。以下是一个简单的示例代码: import gnu.io.CommPort;...
    99+
    2023-10-22
    Java
  • java 串口通信实现流程示例
    下载64位rxtx for java 链接:http://fizzed.com/oss/rxtx-for-java下载下来的包解压后按照说明放到JAVA_HOME即JAVA的安装路径下面去在maven的pom.xml下添加 <dep...
    99+
    2023-05-30
    java 串口通信 ava
  • winform串口通信出现乱码如何解决
    出现乱码有可能是由于串口通信设置不正确或者数据格式不匹配导致的。以下是一些可能的解决方案: 确保串口通信的波特率、数据位、停止位和...
    99+
    2024-04-02
  • Android串口开发之使用JNI实现ANDROID和串口通信
    导语:Android串口通信在物联网、智能家居等领域具有广泛的应用。本文将详细介绍如何使用JNI技术实现Android设备与串口的通信,包括串口的打开、设置参数和读写数据等过程。 目录 一...
    99+
    2023-10-20
    android java android studio 串口通信 JNI
  • Python应用开发之实现串口通信
    目录前言1.环境搭建2.硬件准备3.代码编写与测试3.1 简单测一下串口收发3.2 补充细节3.3 完善整个收发流程前言 在嵌入式开发中我们经常会用到串口,串口通信简单,使用起来方便...
    99+
    2024-04-02
  • c#模拟串口通信SerialPort怎么实现
    这篇“c#模拟串口通信SerialPort怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“c#模拟串口通信Serial...
    99+
    2023-06-30
  • 基于Qt的TCP实现通信
    本文实例为大家分享了基于Qt的TCP实现通信的具体代码,供大家参考,具体内容如下 一、tcp介绍 TCP是面向连接的可靠传输的协议,协议规定通信的双方是服务端和客户端的两个角色:服务...
    99+
    2024-04-02
  • Android硬件通信之 串口通信
    一,串口介绍 1 串口简介 串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口; 串行接口(SerialInterface)是指数据一位一位地顺序传送。其特点是通信线路简单,只要一对传输线就可...
    99+
    2023-08-31
    android 硬件工程
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作