linux下Qt编写串口调试助手,如何在linux下用QT写一个简单的串口调试助手

如何在linux下用QT写一个简单的串口调试助手

QT5串口类

在QT5以前,编写串口一般使用的是qextserialport类,但在QT5之后有了QT自带的串口类SerialPort(串口基础类)和SerialPortInfo(串口信息类)

使用方法

pro中添加

QT += serialport

工程中包含相应的头文件

#include

#include

linux下查询串口名的方法

ctrl+alt+a打开终端,输入dmesg | grep ttyS*查询串口名,一般为ttyUSB0

cc76600078627182e3385b470c58440f.png

如图 可以看到串口名为ttyUSB0,为ch340的驱动

linux的串口权限问题

我在刚开始写这个程序的时候总是无法打开串口,尝试了qextserialport类和SerialPort类都无法成功,后来想起来再用cutecom来调试串口的时候想到需要用管理员权限打开cutecom才可以打开串口,可是我又不知道怎么给QT管理员权限,因此我让普通用户也能使用串口,增加udev规则来实现

sudo vim /etc/udev/rules.d/70-ttyusb.rules

增加如下内容:

KERNEL=="ttyUSB[0-9]*",MODE="0666"

保存并退出,重新插入USB转串口,就可以打开串口了

此方法参考的如下链接:https://blog..net/touch_dream/article/details/52873651

以下给出部分代码

mainwindow.h

#ifndef MAINWINDOW_H

#define MAINWINDOW_H

#include

#include

#include

#include

#include

namespace Ui {

class MainWindow;

}

class MainWindow : public QMainWindow

{

Q_OBJECT

public:

explicit MainWindow(QWidget *parent = 0);

~MainWindow();

private slots:

void on_clearButton_clicked();//清除数据

void on_sendButton_clicked();//发送数据

void on_openButton_clicked();//打开串口

void Read_Data();//读取串口数据

private:

Ui::MainWindow *ui;

QSerialPort *serial;//串口对象

};

#endif // MAINWINDOW_H

下面是mainwindow.cpp

#include "mainwindow.h"

#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :

QMainWindow(parent),

ui(new Ui::MainWindow)

{

ui->setupUi(this);

//查找可用的串口

foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())

{

QSerialPort serial;

serial.setPort(info);

if(serial.open(QIODevice::ReadWrite))

{

ui->PortBox->addItem(serial.portName());

serial.close();

}

}

//关闭发送按钮的使能

ui->sendButton->setEnabled(false);

}

MainWindow::~MainWindow()

{

delete ui;

}

//清空接受窗口

void MainWindow::on_clearButton_clicked()

{

ui->textEdit->clear();

}

//发送数据

void MainWindow::on_sendButton_clicked()

{

serial->write(ui->textEdit_2->toPlainText().toLatin1());

}

void MainWindow::readMyCom() //读取串口数据并显示出来

{

QByteArray temp = myCom->readAll(); //读取串口缓冲区的所有数据给临时变量temp

ui->textEdit->insertPlainText(temp); //将串口的数据显示在窗口的文本浏览器中

}

//读取接收到的数据

void MainWindow::Read_Data()

{

qDebug() << tr("youshuju");

QByteArray buf;

buf = serial->readAll();

if(!buf.isEmpty())

{

QString str = ui->textEdit->toPlainText();

QTextCodec *codec = QTextCodec::codecForName("GBK");//指定QString的编码方式

QString str_buf=codec->toUnicode(buf);//buf转换成QString类型

str=str+'\n'+str_buf;

//buf=buf.toHex(); 或者使用这句话将buf转换成十六进制显示

//str=str+'\n'+tr(buf);

ui->textEdit->clear();

ui->textEdit->append(str);

}

buf.clear();

}

void MainWindow::on_openButton_clicked()

{

if(ui->openButton->text()==tr("打开串口"))

{

serial = new QSerialPort;

//设置串口名

serial->setPortName("/dev/ttyUSB0");//linux下默认的串口名,可以进入终端查询

//打开串口

if(serial->open(QIODevice::ReadWrite)) //如果成功打开串口

//设置波特率

{

qDebug() << tr("succeed");

// serial->setBaudRate(QSerialPort::Baud9600);

// serial->setDataBits(QSerialPort::Data8);

// serial->setParity(QSerialPort::NoParity);

// serial->setStopBits(QSerialPort::OneStop);

//设置数据位数

switch(ui->BitNumBox->currentIndex())

{

case 8: serial->setDataBits(QSerialPort::Data8); break;

default: break;

}

//设置奇偶校验

switch(ui->ParityBox->currentIndex())

{

case 0: serial->setParity(QSerialPort::NoParity); break;

default: break;

}

//设置停止位

switch(ui->StopBox->currentIndex())

{

case 1: serial->setStopBits(QSerialPort::OneStop); break;

case 2: serial->setStopBits(QSerialPort::TwoStop); break;

default: break;

}

//设置流控制

serial->setFlowControl(QSerialPort::NoFlowControl);

//关闭设置菜单使能

ui->PortBox->setEnabled(false);

ui->BaudBox->setEnabled(false);

ui->BitNumBox->setEnabled(false);

ui->ParityBox->setEnabled(false);

ui->StopBox->setEnabled(false);

ui->openButton->setText(tr("关闭串口"));

ui->sendButton->setEnabled(true);

//连接信号槽

QObject::connect(serial, &QSerialPort::readyRead, this, &MainWindow::Read_Data);

}

else

{

qDebug() << tr("default");

}

}

else

{

//关闭串口

serial->clear();

serial->close();

serial->deleteLater();

//恢复设置使能

ui->PortBox->setEnabled(true);

ui->BaudBox->setEnabled(true);

ui->BitNumBox->setEnabled(true);

ui->ParityBox->setEnabled(true);

ui->StopBox->setEnabled(true);

ui->openButton->setText(tr("打开串口"));

ui->sendButton->setEnabled(false);

}

}

最终效果

553a75c2b4c255232b1c2ebfcc39d658.png

打开串口后即可收到串口发送过来的数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/310834.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

当代年轻人到底怎么跨越阶层?

0最近大道理讲的有点多&#xff0c;鸡汤灌多了容易腻味&#xff0c;还容易上火。别说你们烦我&#xff0c;我自己讲的也烦&#xff0c;感觉像一个叨逼叨的老头&#xff0c;天天灌一些被90后、00后唾弃的东西。毕竟天天熬鸡汤不仅累还容易熏晕自己。很多东西吧&#xff0c;的确是…

十一届蓝桥杯国赛 美丽的2-枚举

【问题描述】 小蓝特别喜欢 2&#xff0c;今年是公元 2020 年&#xff0c;他特别高兴。 他很好奇&#xff0c;在公元 1 年到公元 2020 年&#xff08;包含&#xff09;中&#xff0c;有多少个年份的数位中 包含数字 2&#xff1f; 代码如下: #include <iostream> using…

分析linux相关日志文件,Linux日志系统与分析.pdf

Linux日志系统与分析1目录 Linux日志系统简介 Linux日志分析 案例介绍&#xff1a; Linux日志入侵发现Linux日志系统简介 日志的主要用途是系统审计、监测追踪和分析统计。 为了保证 Linux 正常运行、准确定位系统问题&#xff0c;认真检查日志文件是管理员的一项非常…

MySQL对JSON类型UTF-8编码导致中文乱码探讨

继上文发表之后&#xff0c;结合评论意见并亲自验证最终发现是编码的问题&#xff0c;但是对于字符编码还是有点不解&#xff0c;于是乎&#xff0c;有了本文&#xff0c;我们来学习字符编码&#xff0c;在学习的过程中&#xff0c;我发现对于MySQL中JSON类型的编码导致数据中文…

Linux 文本格式显示折线图,linux 折线图

可以这样回答&#xff1a;emmm 怎么说呢。数据库就是用来存储数据的仓库&#xff0c;就像我们生活中存放物品的容器一样&#xff0c;但是容器也有通用和专用之分&#xff0c;比如塑料袋就是通用容器&#xff0c;因为塑料袋可以装各种东西&#xff1a;即可以装糖果&#xff0c;也…

十一届蓝桥杯国赛 本质上升序列-dp

【问题描述】 小蓝特别喜欢单调递增的事物。 在一个字符串中&#xff0c;如果取出若干个字符&#xff0c;将这些字符按照在字符串中的顺 序排列后是单调递增的&#xff0c;则成为这个字符串中的一个单调递增子序列。 例如&#xff0c;在字符串 lanqiao 中&#xff0c;如果取出字…

互联网公司的大龄社畜

作者&#xff1a;邹溪源&#xff0c;长沙资深互联网从业者&#xff0c;架构师社区特邀嘉宾&#xff01;一某年&#xff0c;我有幸加入了一家互联网公司B公司。互联网公司无处不充满了奋斗的精神。以此为背景。二有一天&#xff0c;有同事跟我说&#xff1a;你发现没&#xff0c…

LeetCode 1122 数组的相对排序-简单-unordered_map容器的应用

给你两个数组&#xff0c;arr1 和 arr2&#xff0c; arr2 中的元素各不相同 arr2 中的每个元素都出现在 arr1 中对 arr1 中的元素进行排序&#xff0c;使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。 示例&#x…

linux系统shell知识点,linux shell 知识点

1.if语句语法为&#xff1a;if [ 条件表达式 ]; then.....fi条件表达式类型&#xff1a;文件表达式if [ -f file ] 如果文件存在 if [ -d ... ] 如果目录存在 if [ -s file ] 如果文件存在且非空 if [ -r file]如果文件存在且可读 if [ -w file]如果文件存在且可写 if [ -x fil…

.NET Core开发实战(第34课:MediatR:轻松实现命令查询职责分离模式(CQRS))--学习笔记(下)...

34 | MediatR&#xff1a;轻松实现命令查询职责分离模式&#xff08;CQRS&#xff09;实际上我们在定义我的查询的时候&#xff0c;也可以这样定义&#xff0c;例如我们定义一个 MyOrderQuery&#xff0c;把订单的所有名称都输出出去namespace GeekTime.API.Application.Querie…

linux连接http报301解决,https下不加www的301强制跳转

不少浏览器都开始逐渐更新至只支持https的网站&#xff0c;所以很多http网站都需要添加对https的支持&#xff0c;这时就需要涉及到www和不加www的跳转问题&#xff0c;由于www和不加www使用的是不同的证书&#xff0c;所以需要做301跳转处理&#xff0c;方案如下&#xff1a;此…

LeetCode 637 二叉树的层平均值-简单

给定一个非空二叉树, 返回一个由每层节点平均值组成的数组。 示例 1&#xff1a; 输入&#xff1a; 3/ \9 20/ \15 7输出&#xff1a;[3, 14.5, 11] 解释&#xff1a; 第 0 层的平均值是 3 , 第1层是 14.5 , 第2层是 11 。因此返回 [3, 14.5, 11] 。 提示&#xff1a; …

Asp.Net Core 中IdentityServer4 实战之角色授权详解

一、前言前几篇文章分享了IdentityServer4密码模式的基本授权及自定义授权等方式&#xff0c;最近由于改造一个网关服务&#xff0c;也用到了IdentityServer4的授权&#xff0c;改造过程中发现比较适合基于Role角色的授权&#xff0c;通过不同的角色来限制用户访问不同的Api资源…

linux cpu load 值,理解Linux系统中的load average(图文版)转

一、什么是load average&#xff1f;linux系统中的Load对当前CPU工作量的度量 (WikiPedia: the system load is a measure of the amount of work that a computer system is doing)。也有简单的说是进程队列的长度。Load Average 就是一段时间 (1 分钟、5分钟、15分钟) 内平均…

LeetCode 257二叉树的所有路径-简单

给定一个二叉树&#xff0c;返回所有从根节点到叶子节点的路径。 说明: 叶子节点是指没有子节点的节点。 示例: 输入: 1/ \ 2 3\5输出: [“1->2->5”, “1->3”] 解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3 代码如下: /*** Definition …

[ASP.NET Core 3.1]浏览器嗅探解决部分浏览器丢失Cookie问

今天的干货长驱直入&#xff0c;直奔主题看了前文的同学们应该都知道&#xff0c;搜狗、360等浏览器在单点登录中反复重定向&#xff0c;最终失败报错。原因在于&#xff0c;非Chrome80浏览器不识别Cookie上的SameSitenone属性值,导致认证Cookie在后续请求中被抛弃。截至2020/3…

c语言 最小值算法,C语言实现基于最大堆和最小堆的堆排序算法示例

堆定义堆实际上是一棵完全二叉树&#xff0c;其任何一非叶节点满足性质&#xff1a;Key[i]<key[2i1]&&Key[i]<key[2i2](小顶堆)或者&#xff1a;Key[i]>Key[2i1]&&key>key[2i2](大顶堆)即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关…

LeetCode100 相同的树-简单

给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 1&#xff1a; 输入&#xff1a;p [1,2,3], q [1,2,3] 输出&#xff1a;true 示例 2&a…

Xamarin.Forms读取并展示Android和iOS通讯录 - TerminalMACS客户端

本文同步更新地址&#xff1a;https://dotnet9.com/11520.htmlhttps://terminalmacs.com/861.html阅读导航&#xff1a;一、功能说明二、代码实现三、源码获取四、参考资料五、后面计划一、功能说明完整思维导图&#xff1a;https://github.com/dotnet9/TerminalMACS/blob/mast…

LeetCode 101对称二叉树-简单

给定一个二叉树&#xff0c;检查它是否是镜像对称的。 例如&#xff0c;二叉树 [1,2,2,3,4,4,3] 是对称的。 1/ \2 2/ \ / \ 3 4 4 3但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的: 1/ \2 2\ \3 3代码如下&#xff1a; /*** Definition for a binary tree…