46.QT-自带库QSerialPort串口使用
之前一章学习的是第三方库使用: 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串口使用的更多相关文章
- STM32 HAL库 UART 串口读写功能笔记
https://www.cnblogs.com/Mysterious/p/4804188.html STM32L0 HAL库 UART 串口读写功能 串口发送功能: uint8_t TxData[10 ...
- QT中静态库的生成与使用
一. 静态库的生成 1. 测试目录: lib 2. 源码文件名: mywindow.h, mywindow.cpp, 类MyWindow继承于QPushButton, 并将文字设置为&qu ...
- Qt 添加外部库文件(四种方法)
Qt添加外部库文件, 一种就是直接加库文件的绝对路劲,这种方法简单,但是遇到多个库文件的时候,会很麻烦,而且,如果工程移动位置以后还需要重新配置 另一种就是相对路径了,不过Qt 编译的文件会在一个单独 ...
- 基于Qt的第三方库和控件
====================== 基于Qt的第三方库和控件 ====================== libQxt -------- http://dev.libqxt.o ...
- QT中共享库的生成与使用
一. 静态库的生成1. 测试目录: lib2. 源码文件名: mywindow.h, mywindow.cpp, 类MyWindow继承于QPushButton, 并将文字设置为"I'm i ...
- QT中静态库的生成与使用——创建共享库代码,附例子
一. 静态库的生成 1. 测试目录: lib 2. 源码文件名: mywindow.h, mywindow.cpp, 类MyWindow继承于QPushButton, 并将文字设置为&qu ...
- VHDL学习:利用Quartus自带库3步快速完成状态机
Quartus自带库里面有各种编程语言的模板,供开发者参考. 初学者利用VHDL实现状态机比较生疏的情况下,可以调出该模板,适当修改即可. 本文将描述如何利用Quartus自带库调出状态机模板,并适当 ...
- (4)STM32使用HAL库实现串口通讯——理论讲解
一.查询模式 1. 二.中断模式 1.中断接收. 1.1先看中断接收的流程(以 USART2 为例) 在启动文件中找到中断向量 USART2_IRQHandler 找到USART2_IRQHandle ...
- 【Qt官方MQTT库的使用,附一个MqttClient例子】
Qt官方MQTT库的使用,附一个MqttClient例子 开发环境:win7 64 + Qt5.9 记录时间:2018年3月11日 00:48:42 联系邮箱: yexiaopeng1992@126. ...
随机推荐
- NetCore 3.0 中使用Swagger生成Api说明文档及升级报错原因
认识Swagger Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法,参 ...
- 洛谷 3111 [USACO14DEC]牛慢跑Cow Jog_Sliver 题解
本蒟蒻又来发题解了, 一道较水的模拟题. 题意不过多解释, 思路如下: 在最开始的时候求出每头牛在t秒的位置(最终位置 然后,如果后一头牛追上了前一头牛,那就无视它, 把它们看成一个整体. else ...
- Kubernetes v1.17 版本解读 | 云原生生态周报 Vol. 31
作者 | 徐迪.李传云.黄珂.汪萌海.张晓宇.何淋波 .陈有坤.李鹏审核 | 陈俊 上游重要进展 1. Kubernetes v1.17 版本发布 功能稳定性是第一要务.v1.17 包含 22 个增强 ...
- ios 在APP内提示更新
http://www.jianshu.com/p/24daf5147bda ios如何在应用内部提示更新 两颗星 http://www.jianshu.com/p/2ba10a58bb02 ...
- 牛客剑指offer(持续更新~)
第一题:二维数组的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数, ...
- POJ 3041 Asteroids(二分图模板题)
Bessie wants to navigate her spaceship through a dangerous asteroid field in the shape of an N x N g ...
- 最全的linux系统安装教程和排错方法
第4章 linux信息和系统安装与连接 260 4.1 linux的发展历史 260 4.2 GPL协议,FSF协议 261 4.3 linux系统的安装 261 4.3.1 ...
- idea 上传svn忽略文件
在idea最下面找到Version Control 默认我们svn提交的文件都在Default ChangeList中 我们创建一个新的ChangeList
- Python3 常用模块3
目录 numpy模块 创建numpy数组 numpy数组的属性和用法 matplotlib模块 条形图 直方图 折线图 散点图 + 直线图 pandas模块 numpy模块 numpy模块可以用来做数 ...
- 【JS】285- 拆解 JavaScript 中的异步模式
JavaScript 中有很多种异步编程的方式.callback.promise.generator.async await 甚至 RxJS.我最初接触不同的异步模式时,曾想当然的觉得 promise ...