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::Unbuffered | 0x0020 | 描述 |
QIODevice::NotOpen | 0x0000 | |
QIODevice::ReadOnly | 0x0001 | |
QIODevice::WriteOnly | 0x0002 | |
QIODevice::ReadWrite | ReadOnly | WriteOnly | |
QIODevice::Append | 0x0004 | |
QIODevice::Truncate | 0x0008 | |
QIODevice::Text | 0x0010 |
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
通过虚拟软件,进行虚拟设置后,并以串口调试助手工具配合工作。这样就可以在没有物理串口的条件下进行调试测试等。
转载于:https://www.cnblogs.com/h2zZhou/p/9522332.html
Qt实现串口通信总结相关推荐
- 【转】Qt编写串口通信程序全程图文讲解
Qt编写串口通信程序全程图文讲解 本文章原创于www.yafeilinux.com 转载请注明出处. (说明:我们的编程环境是windows xp下,在Qt Creator中进行,如果在Linux下或 ...
- QT的串口通信助手C++代码开源
QT的串口通信助手C++代码开源 Qt是一种基于C++的跨平台图形用户界面应用程序开发框架 本次使用QT的版本是5.6 需要在pro文件里面添加 QT += serialport 添加库文件 布局界面 ...
- Qt实现串口通信(C++实现串口通信小助手)---串口收发及串口数据解码、串口通信模拟器。
Qt实现串口通信示例 前言:以下串口通信示例,参考了现有网上前辈们的资源,最后结合部分个人的思想,所以下述博客会将实现的原理及代码的案例进行公开. 这里我们先上效果图: 一.串口通信简介 串口通信是上 ...
- Qt 编程——串口通信方法
这两天在帮小伙伴做项目,给我提了一个任务,就是用Qt做一个串口通信的上位机.研究了两天后,直接利用Qt封装了一个类. 关于串口通信协议,我就不多扯了,别人说的比我专业,我这里直接把我参考的作者的连结放 ...
- QT中串口通信程序(转)
(说明:我们的编程环境是windows xp下,在Qt Creator中进行,如果在Linux下或直接用源码编写,程序稍有不同,请自己改动.) 在Qt中并没有特定的串口控制类,现在大部分人使用的是第三 ...
- linux下QT开发串口通信助手
串口通信的应用十分广泛,所以在QT下编写一个串口通信程序就显得尤为重要.下面将一步一步叙述开发过程: 1.下载第三方QT串口类,免积分 http://download.csdn.net/detail/ ...
- 基于linux和qt的串口通信调试器调的设计及应用,基于linux和Qt的串口通信调试器调的设计及应用...
Q:墼 S ic n Tcnl yI oai ea c nead eho g nvt n rd e o n oH l T技术 基于 I x和 Ot iu n的串口通信调试器调的设计及应用 盂繁磊穆丽红 ...
- Qt编写串口通信程序全程图文讲解
(说明:我们的编程环境是windows xp下,在Qt Creator中进行,如果在Linux下或直接用源码编写,程序稍有不同,请自己改动.) 在Qt中并没有特定的串口控制类,现在大部分人使用的是第三 ...
- 【转】Qt 多线程串口通信问题?
问题描述: 来自:https://www.zhihu.com/question/31518679 现在我的项目关于线程和串口通信这里出了很多问题.思路现在就是我首先自己封装了QSerialport的o ...
最新文章
- 字符串匹配的KMP算法和C语言代码,不需要思考就能理解
- C#中读写INI配置文件
- vector插入/删除元素
- 嵩天-Python语言程序设计程序题--第八周:程序设计方法学
- 动手开始创建第一个 Angular 应用并通过 gh-pages 发布到 Github 上
- oracle转mysql总结经验,oracle转mysql总结(转)
- html 旋转木马 轮播,JS实现旋转木马式图片轮播效果
- Qt DLL总结-创建及调用QT的 DLL
- Java进击C#——语法之多线程
- Ubuntu18.04下安装配置ORB_SLAM2以及过程中遇到的问题解决方法
- 蓝牙芯片 csr8645 和 qcc3005 哪个比较
- Latex三线表格制作及相关问题
- 怎么查看虚拟机上的ip地址?
- 2021 编程语言排行榜
- 点击按钮弹出单选列表对话框和加载Webview
- 【记录4】【密码生成】前端自动生成8位由字母和数字组成的密码
- 《数据分析思维》:分析方法与业务知识
- fone喜获“2018中国企业绩效管理信息化最佳产品奖”
- 什么是Hadoop - HDFS - MapReduce - YARN - HA
- calendar 日历事件 获取最近日程
热门文章
- python的浮点数占字节_Python二进制文件读取并转换为浮点数详解
- 国内Maven仓库--阿里云Aliyun仓库地址及设置
- kfaka storm写入mysql_基于Storm+Kafka+Zookeeper锁+Memcached+mysql架构全方位系统Storm项目案例实战...
- redis一般用来干嘛_谈谈redis的热key问题如何解决
- xlrd读取所有sheet名_如何在Python对Excel进行读取
- asp.net 获取全部在线用户_提取在线数据的9个最佳网页抓取工具
- 纯新手DSP编程--5.22-总结
- Git——添加文件【git add / git commit】
- 电路——三极管(一)辨认极性和判断类型(原理图中)
- 如何在html创建js对象,在js中使用createElement创建HTML对象和元素