之前一章学习的是第三方库使用: 34.QT-qextserialport第三方库制作串口助手(并动态检测在线串口,附带源码)

本章来学习自带serial库

1.QSerialPortInfo

QList<QSerialPortInfo>  QSerialPortInfo::availablePorts();
//获取当前在线的串口设备

示例如下:

foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{ qDebug() << "Name : " << info.portName(); qDebug() << "Description : " << info.description(); qDebug() << "Manufacturer: " << info.manufacturer(); qDebug() << "Serial Number: " << info.serialNumber(); qDebug() << "System Location: " << info.systemLocation();
}

2.QSerialPort初始化

初始化如下所示:

serialport.setPortName(cfg.portName);
serialport.setBaudRate(QSerialPort::Baud115200);
serialport.setParity(QSerialPort::NoParity);
serialport.setDataBits(QSerialPort::Data8);
serialport.setStopBits(QSerialPort::OneStop);
serialport.setFlowControl(QSerialPort::NoFlowControl);
if(!serialport.open(QIODevice::ReadWrite))
{
qDebug()<<"打开失败";
return;
}

3.QSerialPort信号介绍

void readyRead();
//当串口接收到下位机发送数据时,将会发送该信号,然后我们在对应的槽函数调用serialport .readAll()即可 error(QSerialPort::SerialPortError );
//串口错误信号,比如当串口打开失败,串口连接时突然断开,都将会调用该信号
//比如: QSerialPort::PermissionError (表示串口连接断开了)

4.QSerialPort示例

Widget::Widget(QWidget *parent)
: QWidget(parent),
serialport(this),
btn("发送",this)
{
serialport.setPortName("COM21");
serialport.setBaudRate(QSerialPort::Baud115200);
serialport.setParity(QSerialPort::NoParity);
serialport.setDataBits(QSerialPort::Data8);
serialport.setStopBits(QSerialPort::OneStop);
serialport.setFlowControl(QSerialPort::NoFlowControl);
if(!serialport.open(QIODevice::ReadWrite))
{
qDebug()<<"打开失败";
return;
}
connect(&serialport,SIGNAL(readyRead()),this,SLOT(onReadyRead()));
connect(&btn,SIGNAL(clicked()),this,SLOT(sendSerialData()));
} void Widget::onReadyRead()
{
QString str(serialport.readAll());
qDebug()<<str;
}
void Widget::sendSerialData()
{
serialport.write(QString("发送:%1\r\n").arg(qrand()).toLocal8Bit()); //发送随机值
}

运行打印:

发现下位机发送上来的是乱码的,这是因为我们下位机程序是用的gbk编码写的,所以打印汉字乱码了

5.修改代码-添加数据格式编码转换

修改发送/接收函数:

void Widget::onReadyRead()
{
QString str(fromGBKtoUtf8(serialport.readAll()));
QStringList list = str.split(QRegExp("[\r\n]"), QString::SkipEmptyParts); //去掉\r\n , SkipEmptyParts表示如果末尾为\r\n则不需要打印 foreach (QString line, list) {
qDebug()<<line;
}
} void Widget::sendSerialData()
{
//serialport.write(QString("%1\r\n").arg(qrand()).toLocal8Bit());
serialport.write(fromUtf8toGBK(QString("%1\r\n").arg(qrand())));
} QString Widget::fromGBKtoUtf8(QByteArray arry)
{
QTextCodec *gbk = QTextCodec::codecForName("gbk");
QTextCodec *utf8 = QTextCodec::codecForName("UTF-8"); QString unicode=gbk->toUnicode(arry);
return QString(utf8->fromUnicode(unicode));
} QByteArray Widget::fromUtf8toGBK(QString str)
{
QTextCodec *gbk = QTextCodec::codecForName("gbk");
QTextCodec *utf8 = QTextCodec::codecForName("UTF-8");
QString unicode=utf8->toUnicode(str.toLocal8Bit());
return gbk->fromUnicode(unicode);
}

运行打印:

6.在QThread线程中使用QSerialPort

由于在QThread线程里不能用槽函数,不过可以在run里使用QSerialPort::waitForReadyRead()来阻塞获取读数据.如果在指定时间内读取成功/失败,则向界面发送数据.

示例如下:

       serialport.write( QString("%1\r\n").arg(qrand()).toLocal8Bit() );    //写入随机值
if(serialport.waitForBytesWritten()) //100ms 等待写入成功
{
if(serialport.waitForReadyRead()) //等待数据返回
{
QString str((serialport.readAll()));
QStringList list = str.split(QRegExp("[\r\n]"),QString::SkipEmptyParts); //去掉\r\n foreach (QString line, list) { qDebug()<<line; //解析line,并向界面发送信号 ... ...
}
}
else
qDebug()<<"read err";
}
else
qDebug()<<"write err";

46.QT-自带库QSerialPort串口使用的更多相关文章

  1. STM32 HAL库 UART 串口读写功能笔记

    https://www.cnblogs.com/Mysterious/p/4804188.html STM32L0 HAL库 UART 串口读写功能 串口发送功能: uint8_t TxData[10 ...

  2. QT中静态库的生成与使用

    一. 静态库的生成    1. 测试目录: lib    2. 源码文件名: mywindow.h, mywindow.cpp, 类MyWindow继承于QPushButton, 并将文字设置为&qu ...

  3. Qt 添加外部库文件(四种方法)

    Qt添加外部库文件, 一种就是直接加库文件的绝对路劲,这种方法简单,但是遇到多个库文件的时候,会很麻烦,而且,如果工程移动位置以后还需要重新配置 另一种就是相对路径了,不过Qt 编译的文件会在一个单独 ...

  4. 基于Qt的第三方库和控件

    ====================== 基于Qt的第三方库和控件 ======================     libQxt --------   http://dev.libqxt.o ...

  5. QT中共享库的生成与使用

    一. 静态库的生成1. 测试目录: lib2. 源码文件名: mywindow.h, mywindow.cpp, 类MyWindow继承于QPushButton, 并将文字设置为"I'm i ...

  6. QT中静态库的生成与使用——创建共享库代码,附例子

    一. 静态库的生成    1. 测试目录: lib    2. 源码文件名: mywindow.h, mywindow.cpp, 类MyWindow继承于QPushButton, 并将文字设置为&qu ...

  7. VHDL学习:利用Quartus自带库3步快速完成状态机

    Quartus自带库里面有各种编程语言的模板,供开发者参考. 初学者利用VHDL实现状态机比较生疏的情况下,可以调出该模板,适当修改即可. 本文将描述如何利用Quartus自带库调出状态机模板,并适当 ...

  8. (4)STM32使用HAL库实现串口通讯——理论讲解

    一.查询模式 1. 二.中断模式 1.中断接收. 1.1先看中断接收的流程(以 USART2 为例) 在启动文件中找到中断向量 USART2_IRQHandler 找到USART2_IRQHandle ...

  9. 【Qt官方MQTT库的使用,附一个MqttClient例子】

    Qt官方MQTT库的使用,附一个MqttClient例子 开发环境:win7 64 + Qt5.9 记录时间:2018年3月11日 00:48:42 联系邮箱: yexiaopeng1992@126. ...

随机推荐

  1. 使用SSH服务远程管理主机(使用密钥)

    使用ssh服务远程管理主机 SSH是建立在应用层和传输层基础上的安全协议,目的是要在非安全网络上提供安全的远程登录和其他安全网络服务. 通过SSH连接可以远程管理Linux等设备,默认linuxssh ...

  2. SpringBoot-了解微服务(二)

    什么是微服务? 微服务是一种架构风格,它要求我们在开发一个应用的时候,这个应用必须构建成一系列小服务的组合: 可以通过http的方式进行互通. 要说微服务架构,先了解一下以前的单体应用架构 单体应用架 ...

  3. 借 redis cluster 集群,聊一聊集群中数据分布算法

    Redis Cluster 集群中涉及到了数据分布问题,因为 redis cluster 是多 master 的结构,每个 master 都是可以提供存储服务的,这就会涉及到数据分布的问题,在新的 r ...

  4. 数据挖掘算法(一)--K近邻算法 (KNN)

    数据挖掘算法学习笔记汇总 数据挖掘算法(一)–K近邻算法 (KNN) 数据挖掘算法(二)–决策树 数据挖掘算法(三)–logistic回归 算法简介 KNN算法的训练样本是多维特征空间向量,其中每个训 ...

  5. Django开发登录功能实战

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:凡夫俗子66 Django 如果是定义函数写登录路由,需要判断请求方法 ...

  6. Redis 使用消息隊列

    關鍵函數 ListRightPush  生產消息 ListRightPop   消費消息 這是從右面增或取 左邊亦然

  7. 【Git】405- 分享:大牛总结的 Git 使用技巧

    作者:你喜欢吃青椒么 来源:juejin.im/post/5d157bf3f265da1bcc1954e6 前言 本文是参考廖雪峰老师的Git资料再加上我自己对Git的理解,记录我的Git学习历程,作 ...

  8. 【VMware】The VMX process exited permaturely

    问题现象: 开启虚拟机时出现如图问题:虚拟机退出过早 解决方法: 以管理员身份运行cmd,输入netsh winsock reset ,回车然后重启

  9. UWP 应用启动速度优化——关闭加载动画

    准备 在开始之前,我们应该先处理好预启动来加速启动应用.请参见文末链接. 步骤 关闭加载动画主要在包清单文件中进行. 首先,以代码方式打开 Package.appxmanifest,在顶部的 Pack ...

  10. kubernetes-集群构建

    本实验参考:https://github.com/gjmzj/kubeasz kubernetes官方github地址 https://github.com/kubernetes/kubernetes ...