Qt下实现多线程串口通信

Qt下无论是RS232、RS422、RS485的串口通信都可以使用统一的编码实现。本文把每路串口的通信各放在一个线程中,使用movetoThread的方式实现。

用SerialPort类实现串口功能,Widget类调用串口。

serialport.h如下:

#include <QObject>

#include <QSerialPort>

#include <QString>

#include <QByteArray>

#include <QObject>

#include <QDebug>

#include <QObject>

#include <QThread>

class SerialPort : public QObject

{

Q_OBJECT

public:

explicit SerialPort(QObject *parent = NULL);

~SerialPort();

void init_port();  //初始化串口

public slots:

void handle_data();  //处理接收到的数据

void write_data();     //发送数据

signals:

//接收数据

void receive_data(QByteArray tmp);

private:

QThread *my_thread;

QSerialPort *port;

};

serailport.cpp如下

#include "serialport.h"

SerialPort::SerialPort(QObject *parent) : QObject(parent)

{

my_thread = new QThread();

port = new QSerialPort();

init_port();

this->moveToThread(my_thread);

port->moveToThread(my_thread);

my_thread->start();  //启动线程

}

SerialPort::~SerialPort()

{

port->close();

port->deleteLater();

my_thread->quit();

my_thread->wait();

my_thread->deleteLater();

}

void SerialPort::init_port()

{

port->setPortName("/dev/ttyS1");                   //串口名 windows下写作COM1

port->setBaudRate(38400);                           //波特率

port->setDataBits(QSerialPort::Data8);             //数据位

port->setStopBits(QSerialPort::OneStop);           //停止位

port->setParity(QSerialPort::NoParity);            //奇偶校验

port->setFlowControl(QSerialPort::NoFlowControl);  //流控制

if (port->open(QIODevice::ReadWrite))

{

qDebug() << "Port have been opened";

}

else

{

qDebug() << "open it failed";

}

connect(port, SIGNAL(readyRead()), this, SLOT(handle_data()), Qt::QueuedConnection); //Qt::DirectConnection

}

void SerialPort::handle_data()

{

QByteArray data = port->readAll();

qDebug() << QStringLiteral("data received(收到的数据):") << data;

qDebug() << "handing thread is:" << QThread::currentThreadId();

emit receive_data(data);

}

void SerialPort::write_data()

{

qDebug() << "write_id is:" << QThread::currentThreadId();

port->write("data", 4);   //发送“data”字符

}

widget.h的调用代码

#include "serialport.h"

public slots:

void on_receive(QByteArray tmpdata);

private:

SerialPort *local_serial;

widget.cpp调用代码

//构造函数中

local_serial = new QSerialPort();

connect(ui->pushButton, SIGNAL(clicked()), local_serial, SLOT(write_data()));

connect(local_serial, SIGNAL(receive_data(QByteArray)), this, SLOT(on_receive(QByteArray)), Qt::QueuedConnection);

//on_receive槽函数

void Widget::on_receive(QByteArray tmpdata)

{

ui->textEdit->append(tmpdata);

}

本文例子实现的串口号是 /dev/ttyS1(对应windows系统是COM1口),波特率38400,数据位8,停止位1,无校验位的串口通信。当然,使用串口程序前,需要在.pro文件中添加 QT += serialport,把串口模块加入程序。

Qt下实现多线程串口通信相关推荐

  1. Qt练习:多线程串口通信

    最近在学习Qt编程,为了练手,想做一个串口通信的小软件为之后的项目做准备,经过几天的学习与练习初步搭建起了多线程串口通信的框架及较少的其他功能 功能简介 串口接收 主线程显示ui,子线程接收串口数据, ...

  2. QT子线程实现串口通信_学习记录

    QT子线程实现串口通信_学习记录 1 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一个表格 设定内容 ...

  3. wince下的蓝牙串口通信

    wince下的蓝牙串口通信(上) wince下的蓝牙串口通信(下)--客户端

  4. Ardunio下的STM32串口通信

    文章目录 任务要求 Ardunio下的STM32串口通信 软件准备 编译烧录 标准库函数与HAL库函数的stm32编程方式差异 国人版的MCU集成开发平台 stduino IDE 总结 任务要求 安装 ...

  5. 【转】Qt 多线程串口通信问题?

    问题描述: 来自:https://www.zhihu.com/question/31518679 现在我的项目关于线程和串口通信这里出了很多问题.思路现在就是我首先自己封装了QSerialport的o ...

  6. 【实例记录】在ubuntu上运行python实现与单片机多线程串口通信

    文章目录 工具 步骤 工具 工具:自己电脑双系统的ubuntu18.04,单片机esp8266,一个usb转ttl模块,ubuntu上已经下载了python的3.6和pip,还需要pip instal ...

  7. linux 串口 qt,Linux-QT4.7 实现串口通信

    在qt5版本以下,想要实现串口通信需要两个集成类,posix_qextserialport 和 qextserialbase,需要的可以移步到 下载点. 在posix_qextserialport这个 ...

  8. linux下QT开发串口通信助手

    串口通信的应用十分广泛,所以在QT下编写一个串口通信程序就显得尤为重要.下面将一步一步叙述开发过程: 1.下载第三方QT串口类,免积分 http://download.csdn.net/detail/ ...

  9. linux串口助手开发,linux下QT开发串口通信助手

    串口通信的应用十分广泛,所以在QT下编写一个串口通信程序就显得尤为重要.下面将一步一步叙述开发过程: 1.下载第三方QT串口类,免积分 http://download.csdn.net/detail/ ...

最新文章

  1. 二叉树的前序遍历,中序遍历,后序遍历学习 (原)
  2. React拾遗:Render Props及其使用场景
  3. tomcat7 java_Tomcat7安装(jdk 1.7环境)
  4. LeetCode 135. 分发糖果(DP)
  5. android全方位性能优化方法
  6. 抢占朋友圈C位 闪耀世界杯 就要Pick 腾讯云CDN
  7. 相关不是因果,哪又是啥?
  8. 交付自动化的探索与展望
  9. [转自华尔街的强帖]怎样才能嫁给有钱人
  10. Java培训班学费一般多少?Java自学成功率是多少?
  11. jspstudy启动mysql失败_二、MySQL启动失败故障思路
  12. 关于使用ArcGIS裁剪栅格后像元值发生变化的问题
  13. 软件工程师为什么单身的六宗罪
  14. QObject::moveToThread: Current thread(...) is not the object`s thread. Cannot move to target thread(
  15. 字节跳动社招校招实习内推提前批
  16. sql server作业实现数据同步
  17. 中小学课外培训机构陷入无序竞争,怎么才能异军突起?
  18. 12款好用的Visual Studio插件,最后一款良心推荐
  19. MVVM框架之avalon学习笔记(1)
  20. 互联网日报 | 微博热搜榜被暂停更新一周;陆正耀辞任神州租车董事会主席;教育部严格国际学生申请资格...

热门文章

  1. C++11 就地初始化与列表初始化
  2. Git基本介绍(三大分区及核心内部构造)
  3. 面试问题记录 (一)
  4. webapi 重复提交问题
  5. java通过各种类型驱动连接数据库
  6. 解决 eclipse 生成 javadoc 中文乱码的问题
  7. 真机调试 —— An unknown error occurred.
  8. MySQL一个语句查出各种整形占用字节数及最大最小值
  9. chrome扩展——Postman
  10. document.onreadystatechange()来判断页面加载完