Qt实现串口通信总结

2023-05-16

Qt实现串口通信总结

注意: Qt5发布之前,Qt实现串口通信一般是采用第三方类库qextserialport。Qt5发布后自带了QtSerialPort 能够支持串口通信。

1、Qextserialport类介绍

     在Qt5之前的版本中并没有特定的串口控制类,现在大部分人使用的是第三方写的qextserialport类,本文章主要是讲解怎样利用此类实现串口通信。

2、文件下载地址:

     http://sourceforge.net/projects/qextserialport/files/

3、文件内容:

    3.1.下载到的文件为qextserialport-1.2win-alpha ,解压并打开后其内容如下。

  

(1)doc文件夹中的文件内容是QextSerialPort类和QextBaseType的简单的说明,我们可以使用记事本程序将它们打开。

(2)examples文件夹中是几个例子程序,可以看一下它的源码,不过想运行它们好像会出很多问题啊。

(3)html文件夹中是QextSerialPort类的使用文档。

(4)然后就是剩下的几个文件了。其中qextserialenumerator.cpp及qextserialenumerator.h文件中定义的QextSerialEnumerator类是用来获取平台上可用的串口信息的。不过,这个类好像并不怎么好用,而且它不是我们关注的重点,所以下面就不再介绍它了。

 (5)qextserialbase.cpp和qextserialbase.h文件定义了一个QextSerialBase类,win_qextserialport.cpp和win_qextserialport.h文件定义了一个Win_QextSerialPort类,posix_qextserialport.cpp和posix_qextserialport.h文件定义了一个Posix_QextSerialPort类,qextserialport.cpp和qextserialport.h文件定义了一个QextSerialPort类。这个QextSerialPort类就是我们上面所说的那个,它是所有这些类的子类,是最高的抽象,它屏蔽了平台特征,使得在任何平台上都可以使用它。

                                                             

在Windows下是:

qextserialbase.cpp和qextserialbase.h 以及win_qextserialport.cpp和win_qextserialport.h

在Linux下是:

qextserialbase.cpp和qextserialbase.h 以及posix_qextserialport.cpp和posix_qextserialport.h

而在Windows下我们可以使用事件驱动EventDriven方式,也可以使用查询Polling方式,但是在Linux下我们只能使用查询Polling方式。

4、串口通信的实现

   4.1  声明串口对象 :


Win_QextSerialPort  *myCom;      //Windows系统内
Posix_QextSerialPort *myCom;      //Linux系统内  

  4.2 串口定义:


//Windows中有两种查询模式,一种polling模式,一种EventDriven模式
myCom = new Win_QextSerialPort("COM1",QextSerialBase::Polling); // myCom = new Win_QextSerialPort("COM1",QextSerialBase::EventDriven); //Linux中只有Polling模式 myCom = new Posix_QextSerialPort("/dev/ttyS0",QextSerialBase::Polling);

    事件驱动方式EventDriven就是使用事件处理串口的读取,一旦有数据到来,就会发出readyRead()信号,我们可以关联该信号来读取串口的数据。在事件驱动的方式下,串口的读写是异步的,调用读写函数会立即返回,它们不会冻结调用线程。

    查询方式Polling则不同,读写函数是同步执行的,信号不能工作在这种模式下,而且有些功能也无法实现。但是这种模式下的开销较小。我们需要自己建立定时器来读取串口的数据。

    在Windows下支持以上两种模式,而在Linux下只支持Polling模式。

  4.3 串口打开模式


myCom ->open(QIODevice::ReadWrite);    //打开模式  
QIODevice::Unbuffered0x0020描述
QIODevice::NotOpen0x0000 
QIODevice::ReadOnly0x0001 
QIODevice::WriteOnly0x0002 
QIODevice::ReadWriteReadOnly | WriteOnly 
QIODevice::Append0x0004 
QIODevice::Truncate0x0008 
QIODevice::Text0x0010 

 

4.4 串口的配置函数


myCom->setBaudRate(BAUD9600);          //波特率设置,我们设置为9600
myCom->setDataBits(DATA_8);            //数据位设置,我们设置为8位数据位
myCom->setParity(PAR_NONE);           //奇偶校验设置,我们设置为无校验
myCom->setStopBits(STOP_1);            //停止位设置,我们设置为1位停止位
myCom->setFlowControl(FLOW_OFF);      //控制流

myCom->setTimeout(long); //设置时间间隔

    setTimeout(long)参数决定了Polling查询模式的读取串口的速度。

4.5 串口工作


connect(myCom,SIGNAL(readyRead()),this,SLOT(readMyCom()));    //EventDriven模式下才能触发readyRead()信号
connect(readTimer,SIGNAL(timeout()),this,SLOT(readMyCom())); //Polling模式定时器触发timeout()信

4.6 串口读取数据


QByteArray temp = myCom->readAll();    //返回读取的字节
int byteLen = myCom->bytesAvailable(); //返回串口缓冲区字节数  

4.7 串口写数据


myCom -> Write(const char * data, qint64 maxSize );          //
myCom -> Write(const char * data );                          //
myCom -> Write(const QByteArray & byteArray);                //
int byteLen = myCom->bytesToWrite();                        //输出写数据的字节数
//bytesWritten()信号函数来获取已经发送的数据的大小。  

5、Qt5以后版本QSerialPort介绍

5.1  .pro文件内需要加上如下代码


QT += serialport               //加在第一行或者第二行  

5.2 网上一段利用QSerialPort写的串口通信代码(转自:http://www.doc88.com/p-645858545768.html)


#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog) { ui->setupUi(this); read_port = new mythread(this); connect(this->read_port, SIGNAL(read_port_data()), this, SLOT(display_data())); } Dialog::~Dialog() { //delete this->my_serialport; delete ui; } void Dialog::on_pushButton_clicked() //open serial,打开串口 { this->read_port->start(); } void Dialog::display_data() //显示数据 { ui->textBrowser->setText(this->read_port->requestData); }

//对话框头文件
#ifndef DIALOG_H
#define DIALOG_H #include "mythread.h" namespace Ui { class Dialog; } class Dialog : public QDialog { Q_OBJECT public: explicit Dialog(QWidget *parent = 0); ~Dialog(); private slots: void on_pushButton_clicked(); void display_data(); private: Ui::Dialog *ui; mythread *read_port; }; #endif // DIALOG_H

#include "mythread.h"

mythread::mythread(QObject *parent) :
    QThread(parent)
{
    my_serialport = new QSerialPort(this);
}

void mythread::run()
{
    this->my_serialport->setPortName("com3");
    this->my_serialport->open(QIODevice::ReadWrite);
    this->my_serialport->setBaudRate(115200);
    this->my_serialport->setDataBits(QSerialPort::Data8);
    this->my_serialport->setParity(QSerialPort::NoParity);
    this->my_serialport->setStopBits(QSerialPort::OneStop);
    this->my_serialport->setFlowControl(QSerialPort::NoFlowControl);

    while(1)
    {
        requestData = "";
        while(this->my_serialport->waitForReadyRead(10))
        {
            requestData += this->my_serialport->readAll();
        }

        if(!requestData.isEmpty())
        {
            emit(this->read_port_data());
            qDebug() << "===============" <<requestData;
        }
    }
}  

 6、如何抓取串口数据

6.1 、使用超级终端

    Windows XP之前(包括Windows XP)版本系统自带,程序位置:

                           开始 ->程序->附件->通讯 ->超级终端。

6.2、使用串口调试助手

      串口调试助手软件非常多:例如CommAssistant.exe、

3、使用Bus Hound工具(推荐使用)

    下载地址:http://www.xz7.com/dir/208/248/200604121464.html

6.4 虚拟串口调试工具

     常用的两款虚拟串口调试工具:

     1、VSPD下载地址: http://www.cr173.com/soft/21406.html

     2、VSPM下载地址:http://www.onlinedown.net/soft/58180.htm

     通过虚拟软件,进行虚拟设置后,并以串口调试助手工具配合工作。这样就可以在没有物理串口的条件下进行调试测试等。

 

posted on 2014-11-11 23:55 搬运工 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/CD-lulu/p/4090867.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt实现串口通信总结 的相关文章

  • [Hadoop 周边] 浅谈大数据(hadoop)和移动开发(Android、IOS)开发前景【转】

    原文链接 xff1a http www d1net com bigdata news 345893 html 先简单的做个自我介绍 xff0c 我是云6期的 xff0c 黑马相比其它培训机构的好偶就不在这里说 xff0c 想比大家都比我清楚
  • MariaDB 10.0.X中,动态列支持 JSON 格式来获取数据。

    MariaDB 10 0 X中 xff0c 动态列 xff08 Dynamic Columns xff09 xff0c 可以支持 JSON 格式来获取数据 为了兼容传统SQL语法 xff0c MariaDB 10和MySQL5 7支持原生J
  • Ubuntu操作相关

    gt gt Ubuntu桌面图片保存位置 xff1a usr share backgrounds Kubuntu桌面图片保存位置 xff1a usr share wallpapers Ubuntu通过apt下载的软件包的保存位置 xff1a
  • c++ error 2064: term does not evaluate to a function taking 1 arguments解决方法

    首先来看一个简单的示例 xff1a class T public T 61 default T 61 default int convertToInt double x return ceil x void doSomething vect
  • netty 堆外内存泄露排查盛宴

    这篇文章对于排查使用了 netty 引发的堆外内存泄露问题 xff0c 有一定的通用性 xff0c 希望对你有所启发 背景 最近在做一个基于 websocket 的长连中间件 xff0c 服务端使用实现了 socket io 协议 xff0
  • 线程池工具类的封装

    了解更多学习 ThreadPoolExecutor类 ThreadPool java package com tool me thread import java util Hashtable import java util Map im
  • 【性能测试】利用IxChariot测试路由器吞吐量(wan to lan & lan to wan)

    写在前面 因项目原因 xff0c 本人对路由器吞吐量测试进行了学习探索 在学习过程中 xff0c 了解到IxChariot这一工具 xff0c 而在实践中 xff0c 也遇到一些问题 xff0c 花了较多时间去尝试和摸索 在此本人将这次实践
  • 通用文本标注工具 labelme

    欢迎大家前往腾讯云社区 xff0c 获取更多腾讯海量技术实践干货哦 作者 xff1a 理查德 导语 一个支持文本类目标注和关键词打分的通用标注工具 xff0c 为文本分类模型和关键词抽取任务提供训练和测试数据 by 慕福楠 amp 孙振龙
  • 干货|基于CPU的深度学习推理部署优化实践

    背景介绍 随着人工智能技术在爱奇艺视频业务线的广泛应用 xff0c 深度学习算法在云端的部署对计算资源 xff0c 尤其是 GPU 资源的需求也在飞速增长 如何提高深度学习应用部署效率 xff0c 降低云平台运行成本 xff0c 帮助算法及
  • Keycloak授权服务指南

    为什么80 的码农都做不了架构师 xff1f gt gt gt 本文译自Keycloak官方文档 xff0c 原文链接 对应版本为5 0 概述 Keycloak支持细粒度的授权策略 xff0c 并可以对这些策略进一步组合 xff0c 如 x
  • postgresql的substr()函数

    为什么80 的码农都做不了架构师 xff1f gt gt gt code select substr 39 1234 39 0 3 as re code 如果是pg xff1a 得到的结果是12 如果是oracle xff1a 得到的结果是
  • 【docker】查看docker镜像的版本号TAG,从远程仓库拉取自己想要版本的镜像

    要想查看镜像的版本好TAG 需要在docker hub查看 地址如下 xff1a https hub docker com r library 进入之后 xff0c 在页面左上角搜索框搜索 xff0c 例如搜索redis 搜索完成如下 xf
  • Windows下慎用内核隔离

    1 开启内核隔离后只能通过注册表关闭 2 开启内核隔离后 默认会启动hybrid v 这个东西和虚拟机是冲突的 这样就用不了虚拟机了 3 解决方法 关闭内核隔离后 再关闭已经开启的hybrid v 基本参考下面 可能要重复几次才能有效的关闭
  • EntLib 3.1学习笔记(4) : Logging Application Block

    zh http www microsoft com china MSDN library enterprisedevelopment softwaredev dnpag2logging mspx mfr 61 true en http ms
  • linux开机启动

    linux 有自己一套完整的启动体系 xff0c 抓住了 linux启动的脉络 xff0c linux的启动过程将不再神秘 阅读之前建议先看一下附图 本文中假设inittab中设置的init tree为 xff1a etc rc d rc0
  • 设置TextBox控件readOnly="True",后台无法取得客户端TextBox中值的解决方法

    在TextBox中设置属性 ContentEditable 61 34 false 34 即可 例 xff1a lt asp TextBox Id 61 34 txt DeptName 34 runat 61 34 server 34 Te
  • matlab练习程序(双边滤波)

    双边滤波模板主要有两个模板生成 xff0c 第一个是高斯模板 xff0c 第二个是以灰度级的差值作为函数系数生成的模板 然后这两个模板点乘就得到了最终的双边滤波模板 第一个模板是全局模板 xff0c 所以只需要生成一次 第二个模板需要对每个
  • hive:导出数据记录中null被替换为\n的解决方案

    在hive中 xff0c 一般情况下通过 1 use my hive db 2 set hive merge mapfiles 61 true 3 set hive merge mapredfiles 61 true 4 set hive
  • STP试验的综合应用

    实验环境 xff1a Catalyst 2950 24 S1 SwA S2 SwB S3 SwC S4 SwD 实验目的 xff1a 1 利用VTP协议实现VLAN配置的一致性 2 通过PVST的配置实现交换网络的负载分担 其次实现冗余备份
  • Ubuntu12.04LTS安装好后是空白桌面的解决步骤

    安装完毕启动后 xff0c 明显慢的要死 xff0c 登陆后竟然是一个空白的桌面环境 xff0c Ctrl 43 Alt 43 T 根本没有任何反应 唯一的反应就是右键能够创建文件和文档 同时打开的窗口没有最大化 xff0c 最小化及关闭按

随机推荐

  • could not execute menu item系统找不到指定的文件

    Wamp3 0 6 64bit xff0c 系统任务栏图标 xff0c 左键 xff0c Apache菜单 xff0c httpd conf xff0c 报错 could not execute menu item 系统找不到指定的文件 根
  • 这么好用的U盘数据恢复软件,推荐!

    U盘受到了用户不同程度的青睐 xff0c 可以将临时要用的数据输入到U盘中 但是U盘在使用过程中 xff0c 也会出现一些突发情况 xff0c 让用户措手不及 xff0c 其中最常见的就属数据丢失 数据丢失的原因包括多种 xff0c 误删除
  • node+微信小程序实现商城案例

    说明 xff1a 1 本人也是初次完整使用小程序 xff0c 如有BUG或者不足的地方请在Issues或者本文下方留言 xff0c 作者会尽快修改 xff0c 谢谢 xff01 2 本项目适合初学者或者准备自学小程序的伙伴 小程序功能 xf
  • SpringBoot使用fastjson的JsonField注解序列化Bigdecimal

    代码 lt xml version 61 34 1 0 34 encoding 61 34 UTF 8 34 gt lt project xmlns 61 34 http maven apache org POM 4 0 0 34 xmln
  • 网盘告急 亚信安全Safesync让企业级数据存储吃下“定心丸”

    近日 xff0c 两条重磅消息登上新闻头条 xff1a 一则是360云盘由于无法解决盗版侵权等问题 xff0c 将于2017年2月1日起关闭云盘 xff1b 另一则是百度遭到渔具店老板 撞库 xff0c 50万账号被盗后又遭转卖 xff0c
  • android内存泄漏分析的一种方式

    最近在处理项目的拷机问题 xff0c 发现在测试24小时内 xff0c 都是正常的 xff0c 但是超过24小时后 xff0c 重启一大片 xff0c 让人抓狂 分析了logcat打印 xff0c 发现重启是因为系统服务已经被watchdo
  • 29个运维经典面试题

    前言 这篇博文参考阿铭linux 28个运维经典面试题 xff0c 并对其中的一些题目进行扩展和解析 如有侵权 xff0c 请联系我删除 xff5e 再次感谢阿铭老师的分享 大家有空可以看看阿铭老师的教程 xff5e 第一题 xff1a L
  • win10下丢失msvcr110.dll解决办法

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 笔者尝试过的方法 xff1a 方法一 xff1a 360安全卫士 功能大全 搜索区查找 xff1a msvcr110 dll xff0c 回车键结束 选择第一个 xff0c
  • moment.js格式化日期,获取前一个月的时间

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 下载moment js 格式化当前日期 xff1a 显示结果为 xff1a 34 2017 09 20 15 35 52 34 moment new Date format
  • 在springboot中配置web.xml

    在springBoot中配置web xml中配置的servlet http www cnblogs com wangxiaomei p 8885470 html 转载于 https www cnblogs com lxcmyf p 1006
  • SQL字符串处理函数大全

    select语句中只能使用sql函数对字段进行操作 xff08 链接sql server xff09 xff0c select 字段1 from 表1 where 字段1 IndexOf 34 云 34 61 1 这条语句不对的原因是ind
  • 设计模式之(十五)职责链Chain of Responsibility

    Chain of Responsibility定义 Chain of Responsibility CoR 是用一系列类 classes 试图处理一个请求request 这些类之间是一个松散的耦合 唯一共同点是在他们之间传递request
  • 如何判断一个C++对象是否在堆上

    摘要 在帖子 34 如何判断一个C 43 43 对象是否在堆栈上 中 xff0c 又有人提出如何判断一个C 43 43 对象是否在堆上 阅读全文 Richard Wei 2012 05 12 14 30 发表评论 转载于 https www
  • 前端框架Vue、angular、React的优点和缺点,以及应用场景

    学习web前端开发中 xff0c 会有很多的框架 xff0c 那么目前流行的框架有哪些 xff0c 以及他们的优缺点和应用场景有哪些呢 xff1f 一 Vue js xff1a 其实Vue js不是一个框架 xff0c 因为它只聚焦视图层
  • AFNetworking(二)AFNetworking对form-data请求体的处理

    AFNetworking 发送 GET POST 等请求时可以直接将参数按照字典结构传入 xff0c 最终编码到 url 中或者是 body 实体中 xff0c 同时也支持按照 multipart form data 格式 xff0c 将多
  • Android原生SpeechRecognizer(语音识别)

    开篇先吐槽下 xff0c 在Android 平台开发原生的SpeechRecognizer真是难受的 xff0c 不像ios xff0c 无比轻松 xff0c 平台统一 由于Android 平台的碎片化问题比较严重 xff0c 各个厂商都有
  • shell 读取配置文件

    shell 读取配置文件来取参数的值 在许许多多 自动化 的脚本中 很学用 bin sh filepath 61 34 home test test txt 34 while read LINE do user 61 96 echo LIN
  • MFC 获取本机IP地址(多个网卡)

    szHostName 128 gethostname szHostName hostent pHost i pHost gethostbyname szHostName i pHost pHost h addr list i i CStri
  • python 网站文件及数据库备份脚本

    初学python xff0c 试着写了一份python网站文件备份和数据库备份的脚本 xff0c 功能是写出来了 xff0c 但感觉还是不太适应 xff0c 写得不太好 xff0c 以后还要努力哈 xff01 backup py读取back
  • Qt实现串口通信总结

    Qt实现串口通信总结 注意 xff1a Qt5发布之前 xff0c Qt实现串口通信一般是采用第三方类库qextserialport Qt5发布后自带了QtSerialPort 能够支持串口通信 1 Qextserialport类介绍 在Q