ubuntu串口重命名助手x86_64电脑架构(秒速配好串口)(上)软件介绍

news2024/11/26 17:24:13

✨✨ Rqtz 个人主页 : 点击✨✨

🎈PyQt系列专栏:点击🎈

🎈Qt智能车上位机专栏: 点击🎈

🎈Qt串口助手专栏:点击🎈

💫宗旨:共享IT之美,共创机器未来

目录

​编辑

​编辑

项目背景

相关参数

 软件下载连接

软件图片

动图展示

shell命令配置串口名称过程

命令过程

shell命令解释

​编辑

转为Qt框架实现

串口扫描识别

判断是USB还是ACM并查询串口内核编号

printshell函数实现精准获取串口内核

函数参数

使用C语言函数fopen()与fgets()获取输出

输出udev命令

输入管理员密码打开usb.rules编辑

代码结构


项目背景

        由于在ubuntu电脑上配置多传感器(如雷达,陀螺仪,单片机)的串口,为了防止每次使用时都要对串口名称进行修改,因此需要重命名。如果按照终端的方法配置,不仅要打开文件,还要记住复杂的shell命令,十分的繁琐与复杂。基于这个问题,我使用C++Qt写了一款ubuntu串口重命名助手,全程不需要输入一条命令,直接点击按钮即可轻松配置串口,5到6秒钟就可以配置完成,十分好用

相关参数

设备:ubuntu20.04 noetic

开发语言:C++/面向对象

软件框架:Qt

IDE:Qt Creater

核心内容:shell命令输出到管道

我是基于这位大佬的博客中描述的串口配置方法来实现的

[005] ubuntu下绑定USB设备的串口名称(KERNELS硬件端口号绑定)_串口名是ttyacm0是什么kernel-CSDN博客

 软件下载连接

https://download.csdn.net/download/m0_75192474/89535177?spm=1001.2014.3001.5503

源码连接:   源码连接-githup

软件图片

比较简单

动图展示

shell命令配置串口名称过程

命令过程

  1. 查看串口详细信息:该命令查询的是ttyUSB0
    udevadm info --attribute-walk --name=/dev/ttyUSB0
  2. 将内核输入到指定文件中
    sudo gedit /etc/udev/rules.d/usb.rules
  3. 重启udev服务
    sudo udevadm trigger
  4. 查询串口更改情况
    ls -l /dev |grep ttyUSB

shell命令解释

  1. udevadm: 这是一个用户空间工具,用于查询和操作udev设备管理器。udev是一个动态设备管理器,它负责在Linux系统中管理设备节点的创建、删除和属性更新。

  2. info: 这是udevadm的一个子命令,用于显示设备的详细信息。

  3. --attribute-walk: 这是一个选项,表示要遍历设备的所有属性并显示它们的值。这将提供关于设备的各种属性的信息,如制造商、型号、序列号等。

  4. --name=/dev/ttyUSB0: 这是一个选项,指定要查询的设备的名称。在这个例子中,我们查询的是名为/dev/ttyUSB0的设备。这个设备通常是一个串行端口设备,例如USB转串口适配器。

  5. sudo gedit /etc/udev/rules.d/usb.rules:该文件用于定义USB设备的自定义规则。

  6. ls -l /dev: 这部分命令会列出/dev目录下的所有文件和目录,以及它们的详细信息。-l选项表示长格式输出,会显示每个文件的类型、权限、所有者、组、大小、最后修改时间和名称。

  7. | :将命令输出传给管道。

  8. grep ttyUSB: 这部分命令是一个过滤工具,它会从前面的命令的输出中筛选出包含ttyUSB字符串的行。换句话说,它会显示所有以ttyUSB开头的设备文件。

  9. udevadm info --attribute-walk --name=/dev/ttyUSB0 | grep 'KERNELS' | awk '{print $1}' :将串口设备的详细信息传入管道

  10. | grep 'KERNELS':这部分命令会从上述命令的输出中筛选出包含KERNELS字符串的行。

  11. | awk '{print $1}':这部分命令会处理grep命令的输出,并使用awk命令仅提取每行的第一个字段(即KERNELS的值)。

转为Qt框架实现

串口扫描识别

.pro文件中添加 serialport模块

遍历串口,count为显示串口的数量,并添加到serial_list中,其为一个Qcombox.

    QList<QSerialPortInfo> serialPorts = QSerialPortInfo::availablePorts();
    //遍历串口信息列表并输出串口号
    foreach (const QSerialPortInfo &serialPortInfo, serialPorts) {
        count++;
        ui->serial_list->addItem(serialPortInfo.portName());
    }

判断是USB还是ACM并查询串口内核编号

//判断是USB还是ACM并查询串口内核编号
void port::on_see_kernel_clicked()
{
  for(int i=0;i<ui->serial_list->currentText().length();i++)
  {
     if(ui->serial_list->currentText()[i]=="U"&&ui->serial_list->currentText()[i+1]=="S"&&ui->serial_list->currentText()[i+2]=="B")
     {
         cr1=ui->serial_list->currentText()[i+3];
         usbflag=true;
     }
     if(ui->serial_list->currentText()[i]=="A"&&ui->serial_list->currentText()[i+1]=="C"&&ui->serial_list->currentText()[i+2]=="M")
     {
         cr2=ui->serial_list->currentText()[i+3];
         acmflag=true;
     }

  }
   if(usbflag)
    printshell(QString(cr1).toStdString(),"udevadm info --attribute-walk --name=/dev/ttyUSB","KERNELS",1);
   else if(acmflag)
    printshell(QString(cr2).toStdString(),"udevadm info --attribute-walk --name=/dev/ttyUSB","KERNELS",1);

}
  • for循环:为遍历当前的combox的内容,判断是否为USB或ACM,并把当前的串口索引号放到cr1/cr2中
  • printshell函数:将索引号和相关命令参数传入,精准获取所需要的内容。

printshell函数实现精准获取串口内核

//将shell命令输出到管道并按规则打印
QString port::printshell(std::string data,std::string comm,std::string findstr,int num)
{

    std::array<char,128> buffer;
    std::string res;
    //字符串拼接
    std::stringstream str;
    str<<comm<<data<<" | grep '"<<findstr<<"' | awk '{print $"<<num<<"}'";
    qDebug()<<str.str().c_str();
    //创建一个文件对象指针
    FILE* pipe = popen(str.str().c_str(),"r");
    if (!pipe) {
            std::cerr << "popen() failed!" << std::endl;
        }
        //fgets函数直到有一个换行符或文件末尾才终止
        int temp = 0;
        while (fgets(buffer.data(), buffer.size(), pipe) != nullptr) {

            temp++;
            //第二个为需要的那一个
            if(temp==2)
            {
                ui->KERENEL->setText(buffer.data());
                qDebug()<<buffer.data();
            }

            res+=buffer.data();
        }
        auto returnpope = pclose(pipe);
        return QString::fromStdString(res);
}
函数参数
  1. std::string data : 为串口设备索引号,如ttyUSB0中的0
  2. std::string comm: 为查询串口设备的命令 即udevadm info --attribute-walk --name=/dev/ttyUSB
  3. std::string findstr:为grep命令查找的内容 如KERNELS
  4. int num:awk命令所打印的字段
  5. 使用std::stringstream拼接得到完整的命令 udevadm info --attribute-walk --name=/dev/ttyUSB0 | grep 'KERNELS' | awk '{print $2}'
  6. 效果

但是此时我们需要的是第二个数据,红框中的

使用C语言函数fopen()与fgets()获取输出
  1. fopen()函数:参数1 :传入shell命令的c风格字符串,参数2: 访问方式
  2. fgets()函数   原型解析fgets()函数的原型为 char *fgets(char *str, int n, FILE *stream)
  3. 参数详解
    • char *str:这是一个指向字符数组的指针,用于存储从流中读取的字符串。
    • int n:这是要读取的最大字符数(包括最后的空字符'\0')。通常使用数组长度作为此参数。
    • FILE *stream:这是指向FILE对象的指针,标识了要从中读取字符的流。
  4. while (fgets(buffer.data(), buffer.size(), pipe) != nullptr)这段代码用于从管道或文件中逐行读取数据,直到读取到文件末尾或者发生错误返回空指针为止。
  5.  if(temp==2) 时刚好读取到第二行也就是我们需要的数据,把他添加到输入框中

输出udev命令

//输出串口内核命令kernels
void port::on_pushButton_2_clicked()
{
    if(ui->KERENEL->text()==""||ui->set_portname->text() == "")
    {
        ui->textEdit->append("串口内核或串口别名不能为空..................");
    }
    else {
        //除去最后那个换行符
        QString aimker = "";
        for (int i = 0;i<ui->KERENEL->text().size();i++) {
            if(ui->KERENEL->text()[i]=="\n")
                break;
            aimker+=ui->KERENEL->text()[i];
        }
        //串口内核命令
        QString com=aimker+", MODE:=\"0777\", GROUP:=\"dialout\", SYMLINK+=\"" +ui->set_portname->text()+"\"";
        ui->rule_edit->setText(com);
        if(usbflag)
        {
            ui->textEdit->insertHtml(QString("<strong><font color= 'red' >%1</font> </strong> ").arg("/dev/ttyUSB"+QString(cr1)));
            ui->textEdit->insertHtml(QString("<font color= 'blue' >%1</font><hr> ").arg(com));
        }

        else if(acmflag)  {
            ui->textEdit->insertHtml(QString("<strong><font color= 'red' >%1</font> </strong>").arg("/dev/ttyACM"+QString(cr2)));
            ui->textEdit->insertHtml(QString("<font color= 'blue' >%1</font><hr> ").arg(com));
        }
    }
}

核心:

 QString com=aimker+", MODE:=\"0777\", GROUP:=\"dialout\", SYMLINK+=\"" +ui->set_portname->text()+"\"";
  1. aimker 为串口设备的kERNELS
  2. ui->set_portname->text() 为设置的串口别名
  3. 生成命令 KERNELS=="3-3:1.0", MODE:="0777", GROUP:="dialout", SYMLINK+="rplidar"
  4. 使用富文本将内容按照不同颜色插入信息框.

输入管理员密码打开usb.rules编辑

//打开usb.rules文件修改
void port::on_change_btn_clicked()
{
    if(ui->password->text()=="")
    {
        ui->textEdit->insertPlainText("请输入管理员密码...............\n");
    }
    else {
        //使用&使其在后台运行不妨碍主线程
        std::string command = "echo '"+ui->password->text().toStdString()+"' | sudo -S gedit /etc/udev/rules.d/usb.rules &";
        system(command.c_str());
        ui->udev_btn->setDisabled(false);
    }

}

使用的是

echo "your_password" | sudo -S command

  1. 将管理员密码与shell命令相结合,用-S连接,可以不用在终端输入密码,直接用用户在输入框中输入的密码。
  2. comand 指的是终端shell命令 --> gedit /etc/udev/rules.d/usb.rules &
  3. 使用system函数启动并使用 "&"在后台运行,注意有部分电脑可能打开这个文件有点慢,请耐心等待,如果一直没有打开,有可能是密码输入错误.
  4. 将命令复制到文件中点击保存.

代码结构

如有错误,请大佬指正批评!

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

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

相关文章

基于Pytorch框架的深度学习densenet121神经网络鸟类行为识别分类系统源码

第一步&#xff1a;准备数据 5种鸟类行为数据&#xff1a;self.class_indict ["bowing_status", "grooming", "headdown", "vigilance_status", "walking"] &#xff0c;总共有23790张图片&#xff0c;每个文件夹单独放一…

从零开始学习网络安全渗透测试之基础入门篇——(三)APP架构小程序H5+Vue语言Web封装原生开发Flutter

从零开始学习网络安全渗透测试之基础入门篇——&#xff08;三&#xff09; #APP架构&小程序&H5Vue语言&Web封装&原生开发&Flutter 确保App和小程序的安全性是移动应用开发中的重要环节。比如&#xff0c;代码混淆、数据加密、安全审计、权限管理、API安…

[240727] Qt Creator 14 发布 | AMD 推迟 Ryzen 9000芯片发布

目录 Qt Creator 14 发布Qt Creator 14 版本发布&#xff0c;带来一系列新功能和改进终端用户可通过命令行方式查看此新闻终端用户可通过命令行方式安装软件&#xff1a; AMD 推迟 Ryzen 9000芯片发布 Qt Creator 14 发布 Qt Creator 14 版本发布&#xff0c;带来一系列新功能…

IntelliJ IDEA 中安装 Groovy 插件 添加 Groovy SDK

一、在 IntelliJ IDEA 中安装 Groovy 插件可以按照以下步骤进行&#xff1a; 打开 IntelliJ IDEA&#xff1a; 启动 IntelliJ IDEA。 打开插件市场&#xff1a; 进入 File -> Settings&#xff08;在 macOS 上是 IntelliJ IDEA -> Preferences&#xff09;。在左侧菜单中…

信号、电源、网线、传感器防雷,SPD系列防雷器全覆盖!

信号、电源、网线、传感器防雷&#xff0c;SPD系列防雷器全覆盖&#xff01; SPD 系列防雷器是一种安装于被保护设备一侧的产品&#xff0c;旨在保护电子设备免受雷击、电磁脉冲、过压过渡冲击等造成的设备损坏。该产品广泛应用于工业控制、安全监测、网络通讯、交通电压等行业…

高速板开源工程的学习(一)

泰山派NAS-原理图和PCB设计经验分享-塞塞哇 (saisaiwa.com) BGA扇出的时候千万小心&#xff0c;导线到焊盘的距离大于0.1MM,千万小心&#xff0c;不然会寄寄的&#xff0c;这个在设计规则里面可以设置&#xff1a; 这种就容易造成阻焊开窗的误判&#xff0c;是很不规范的&…

力扣第三十七题——解数独

内容介绍 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&#xff08;请参考示例图&#xff09; 数独…

《破解验证码:用Requests和Selenium实现模拟登录的终极指南》

两种模拟登录方式(图形验证码) 超级鹰 打码平台&#xff0c;用于识别验证码 requests模拟登录 from chaojiying import Chaojiying_Client import requests from requests import Session from lxml import etree #获取图片信息 def get_pic_info(img_name):chaojiying Ch…

贪心算法总结(2)

一、买卖股票的最佳时机 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int maxProfit(vector<int>& prices) {int miniINT_MAX;int ret0;for(int&price:prices){//遍历的时候&#xff0c;我们随时去更新最小的值&#xff0c;然后让每一位…

AI音乐大模型背后的技术突破、版权诉讼和资本蛋糕

音乐&#xff0c;对你来说&#xff0c;是什么&#xff1f; 音乐对于我们中的许多人来说&#xff0c;是生活中不可或缺的一部分。它不仅仅是娱乐&#xff0c;更是一种情感的表达和交流方式。音乐是一种语言&#xff0c;可以用来表达感受&#xff0c;描绘作曲家想要传达的某种情…

fatal: refusing to merge unrelated histories

出现本地仓库和远程仓库的代码合并不兼容问题&#xff0c;解决方法&#xff1a; 添加--allow-unrelated-histories&#xff0c;让git允许提交不关联的历史代码。 成功提交&#xff1a;

云计算概念以及与云服务的区别

1.云的概念 1.1 什么是云&#xff1f; “云”在计算机科学和信息技术领域通常指“云计算”&#xff0c;即通过互联网提供计算资源&#xff08;如服务器、存储、数据库、网络、软件、分析等&#xff09;的模式。用户可以按需访问和使用这些资源&#xff0c;而无需管理和维护实际…

抓包工具——wireshark的使用

​ 什么是wireshark wireshark是一个数据包捕捉程序。和linux下的tcpdump&#xff0c;以及sniffer&#xff0c;Fidder等软件功能类似。按理说&#xff0c;我们的计算机中的网卡设备只会将发给本机的数据包传输到上层进行解析&#xff0c;而其他的数据包会进行丢弃&#xff0c;…

Bert文本分类和命名实体的模型架构剖析

文章目录 介绍Bert模型架构损失计算方式BertForSequenceClassificationBertForTokenClassification Bert 输出结果剖析例子 参考资料 介绍 文本分类&#xff1a;给一句文本分类&#xff1b; 实体识别&#xff1a;从一句文本中&#xff0c;识别出其中的实体&#xff1b; 做命名…

万界星空科技灯具行业MES系统:点亮生产管理的未来

在快速迭代的灯具行业中&#xff0c;高效、精准的生产管理是企业保持竞争力的关键。万界星空科技推出的灯具行业MES&#xff08;制造执行系统&#xff09;系统&#xff0c;以其强大的功能和完善的管理体系&#xff0c;正成为众多灯具生产企业的首选解决方案。本文将重点介绍万界…

构建高并发Web服务:Gunicorn与Flask在Docker中的完美融合

1. 引言 在数字化时代&#xff0c;Web服务的性能和可靠性对于任何在线业务的成功至关重要。随着用户基数的增长和业务需求的扩展&#xff0c;高并发处理能力成为了衡量一个Web服务质量的关键指标。高并发Web服务不仅能够确保用户体验的流畅性&#xff0c;还能在流量激增时保持…

抖音矩阵管理系统开发:全面解析与推荐

在数字时代&#xff0c;短视频平台如抖音已经成为人们生活中不可或缺的一部分。随着内容创作者数量的激增&#xff0c;如何高效地管理多个抖音账号&#xff0c;实现内容矩阵化运营&#xff0c;成为了众多创作者关注的焦点。今天&#xff0c;我们就来全面解析抖音矩阵管理系统的…

Android 生成Excel并导出全流程

前言 最近接到需求&#xff0c;要在安卓上离线完成根据数据生成Excel文件&#xff0c;但搜到了都不是能立马使用 例如 // implementation org.apache.poi:poi:3.17 // implementation com.alibaba:easyexcel:4.0.1 这两最大的问题是专用于java的&#xff0c;如果And…

【SpringBoot】7 数据库(MySQLMyBatis)

MySQL 前提&#xff1a;本地有安装 MySQL 。 连接 使用工具 Navicat Premium &#xff0c;或者 IDEA 自带的 DB 工具&#xff0c;或者其他能连接 MySQL 数据库的工具都可以。 1&#xff09;创建 MySQL Data Source 2&#xff09;根据本地配置连接上 MySQL&#xff0c;点击…