Linux串口设备的使用<ubuntu>

在 Ubuntu 系统中,使用 USB 转串口适配器通常涉及几个步骤,从确认适配器被系统识别到安装必要的驱动程序,以及实际使用该设备。这些适配器通常基于某些常见的芯片,如 FTDI、Prolific PL2303 或 Silicon Labs CP210x 等。下面是如何在 Ubuntu 上操作 USB 转串口设备的步骤:

一:串口设备识别:

步骤 1: 连接设备并检查识别

  1. 连接 USB 转串口适配器到 Ubuntu 系统。

  2. 打开终端。

  3. 输入以下命令来检查系统是否识别了设备:

    dmesg | grep tty
    

    这个命令会在系统消息中搜索 tty,因为串口设备通常被识别为 /dev/ttyUSB0/dev/ttyUSB1 等。如果设备被正确识别,你应该会看到包含这些设备名的消息。

步骤 2: 安装驱动程序

大多数现代 Linux 发行版,包括 Ubuntu,已经预装了最常见的 USB 转串口芯片的驱动程序。如果设备没有被自动识别,可能需要手动安装驱动程序:

  • FTDI: 通常已经包含在 Linux 内核中,无需额外安装。
  • Prolific PL2303: 同样通常已包含在现代 Linux 发行版中。
  • Silicon Labs CP210x: 对于一些较新的设备,如果没有预装驱动,可以从 Silicon Labs 的官方网站下载并安装。

如果确定需要安装驱动,可以使用以下命令安装(以常见的驱动为例):

sudo apt-get update
sudo apt-get install linux-headers-$(uname -r) build-essential

步骤 3: 配置串口通信【不好用别尝试】

使用任何标准的串口通信程序,如 minicomscreenpicocom,可以与串口设备进行通信。例如,使用 minicom一个在终端上运行的类似):

  1. 安装 minicom

    sudo apt-get install minicom
    
  2. 运行 minicom 配置向导:

    sudo minicom -s
    
  3. minicom 的设置菜单中,设置串口设备(如 /dev/ttyUSB0)和波特率等参数。

  4. 保存配置并启动 minicom

步骤 4: 测试通信

一旦配置好,你可以开始通过串口发送和接收数据,以验证设备的功能性。

常见问题处理

  • 权限问题:如果在尝试访问设备时遇到权限错误,可能需要将当前用户添加到 dialout 组:

/dev/ttyUSB0 permission denied. 因为一般情况下不是root用户,对端口没有权限. 遇到这种情况,

一般这样做:
sudo chmod 777 /dev/ttyUSB0
修改权限为可读可写可执行,但是这种设置电脑重启后,又会出现这种问题,还要重新设置.因此查询资料,可以用下面这条指令:

如 :

sudo usermod -a -G dialout $USER

然后重新登录或重启计算机。

  • 驱动不兼容:如果设备不工作,检查是否有针对你的设备型号的特定驱动或更新的内核模块。

因为默认情况下,只有root用户和属于dialout组的用户会有读写权限,因此直接把自己的用户加入到dialout组就可以了。操作完命令后要logout一下,就永久生效了。这样下次重启也不用修改权限了。

通过以上步骤,你应该能够在 Ubuntu 上成功设置和使用 USB 转串口适配器。如果有任何问题或需要进一步的帮助,请提供更多的信息,例如具体的设备型号和遇到的错误消息。

在 Linux 系统中,你可以通过命令行工具直接向串口设备发送数据,而无需编写专门的程序。这可以通过多种方式完成,包括使用内置的命令如 echo 结合重定向操作符,或使用更专业的工具如 screenminicom。这里我将展示几种方法来实现这一目的。

二:串口发送:

方法 1: 使用 echo 和重定向

这是最简单的方法,使用 echo 命令将数据发送到串口设备:

echo "Hello, this is a test message" > /dev/ttyUSB0

这条命令会将字符串 “Hello, this is a test message” 发送到 /dev/ttyUSB0。请确保你已经正确配置了串口的波特率和参数,否则设备可能无法正确解读发送的数据。

方法 2: 使用 stty 设置串口参数

在使用 echo 发送数据之前,你可能需要先设置串口的波特率和参数以确保设备可以正确接收数据。使用 stty 命令来配置这些参数:

# 设置波特率为 9600
stty -F /dev/ttyUSB0 9600# 设置数据位、停止位和无奇偶校验
stty -F /dev/ttyUSB0 cs8 -cstopb -parenb# 现在发送数据
echo "Hello, this is a test message" > /dev/ttyUSB0

方法 3: 使用 screen 作为终端程序

screen 是一个功能强大的终端复用器,它也可以用来作为串口终端程序。使用 screen 可以在命令行中开启一个会话,直接与串口设备交互:

screen /dev/ttyUSB0 9600

这条命令会打开一个新的 screen 会话,连接到 /dev/ttyUSB0,波特率设置为 9600。你可以直接在 screen 会话中输入文本,输入的文本会发送到串口。要退出 screen,可以按 Ctrl-A 然后按 K,再确认退出。

方法 4: 使用 minicom

minicom 是一个基于文本的视窗程序,用于与串口设备进行交互。首先确保 minicom 已经安装在你的系统上:

sudo apt install minicom

然后运行 minicom 配置向导来设置串口参数:

sudo minicom -s

在配置界面中选择 “Serial port setup” 并配置串口参数和波特率。保存配置后,可以直接在 minicom 中发送和接收数据。

三:串口接收:

在 Linux 系统中,要查询通过特定串口端口接收的信息,可以使用几种方法。这些方法包括使用命令行工具如 catscreenminicom,这些工具能够帮助你监听和显示从串口收到的数据。

方法 1: 使用 cat 命令

cat 命令可以用来输出串口接收到的数据。要做到这一点,你可以简单地将串口设备文件作为 cat 命令的输入。这样,所有从该串口接收到的数据都会被显示在终端上:

cat /dev/ttyUSB0

这条命令会显示从 /dev/ttyUSB0 接收到的所有数据。请注意,你需要确保串口的配置(如波特率和参数设置)是正确的,以匹配你期望通信的设备配置。

方法 2: 使用 screen 查看实时数据

如前所述,screen 可以用作串口终端,用来发送和接收数据。它同样可以用来查看从串口接收到的数据:

screen /dev/ttyUSB0 9600

这会打开一个 screen 会话,连接到 /dev/ttyUSB0 串口设备,波特率设置为 9600。此会话将显示从该端口接收到的所有数据,直到你退出 screen

方法 3: 使用 minicom 查看数据

minicom 是一个交互式的通信程序,它可以被用来管理串口通信。首先确保配置了 minicom,然后启动它来查看数据:

sudo minicom -s  # 进入配置模式
# 配置串口和波特率
minicom

配置好后,minicom 会话会显示所有通过配置的串口接收到的数据。

方法 4: 使用 socat 工具

socat 是一个多功能的网络工具,可以用来读取和发送串口数据。要实时查看从串口接收到的数据,可以使用:

socat - /dev/ttyUSB0,b9600,raw,echo=0

这条命令设置了波特率为 9600,并连接到 /dev/ttyUSB0,同时关闭了回声,这意味着输入不会被直接发送到输出。

注意

在使用以上方法之前,请确保你的用户有足够的权限访问串口设备。通常,你可能需要将你的用户账户添加到 dialout 用户组:

sudo usermod -a -G dialout $USER

然后重启或重新登录以使改动生效。这些方法为你提供了灵活的方式来查看通过 Linux 系统的串口接收到的数据。

四:DEMO程序:

在 C++ 中编写一个使用串口通信的程序相较于 Python 更为复杂,因为 C++ 没有标准的串口通信库。在 Linux 系统下,通常使用 POSIX API 直接操作串口。以下是一个简单的 C++ 程序示例,它使用 /dev/ttyUSB0 串口进行收发操作:

步骤 1: 创建串口操作的 C++ 程序

这个程序将使用 POSIX API 打开串口,配置串口参数,并进行基本的读写操作。

#include <iostream>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#include <cstring>int main() {const char* port = "/dev/ttyUSB0";int fd = open(port, O_RDWR | O_NOCTTY);if (fd == -1) {std::cerr << "Failed to open port " << port << std::endl;return -1;}// 获取并修改串口设置struct termios tty;memset(&tty, 0, sizeof tty);if (tcgetattr(fd, &tty) != 0) {std::cerr << "Error from tcgetattr: " << strerror(errno) << std::endl;return -1;}tty.c_cflag &= ~PARENB; // Clear parity bit, disabling parity (most common)tty.c_cflag &= ~CSTOPB; // Clear stop field, only one stop bit used in communication (most common)tty.c_cflag &= ~CSIZE; // Clear all bits that set the data sizetty.c_cflag |= CS8; // 8 bits per byte (most common)tty.c_cflag &= ~CRTSCTS; // Disable RTS/CTS hardware flow control (most common)tty.c_cflag |= CREAD | CLOCAL; // Turn on READ & ignore ctrl lines (CLOCAL = 1)tty.c_lflag &= ~ICANON;tty.c_lflag &= ~ECHO; // Disable echotty.c_lflag &= ~ECHOE; // Disable erasuretty.c_lflag &= ~ECHONL; // Disable new-line echotty.c_lflag &= ~ISIG; // Disable interpretation of INTR, QUIT and SUSPtty.c_iflag &= ~(IXON | IXOFF | IXANY); // Turn off s/w flow ctrltty.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL); // Disable any special handling of received bytestty.c_oflag &= ~OPOST; // Prevent special interpretation of output bytes (e.g. newline chars)tty.c_oflag &= ~ONLCR; // Prevent conversion of newline to carriage return/line feedtty.c_cc[VTIME] = 10;    // Wait for up to 1s (10 deciseconds), returning as soon as any data is received.tty.c_cc[VMIN] = 0;// Set in/out baud rate to be 9600cfsetispeed(&tty, B9600);cfsetospeed(&tty, B9600);if (tcsetattr(fd, TCSANOW, &tty) != 0) {std::cerr << "Error from tcsetattr: " << strerror(errno) << std::endl;return -1;}// Write to serial portstd::string data = "Hello from C++";write(fd, data.c_str(), data.size());// Read from serial portchar buffer[100];int n = read(fd, buffer, sizeof(buffer));if (n > 0) {std::cout << "Received: " << std::string(buffer, n) << std::endl;}close(fd);return 0;
}

如何编译和运行

  1. 保存上面的代码为 serial_comm.cpp

  2. 使用 g++ 编译器编译代码:

    g++ -o serial_comm serial_comm.cpp
    
  3. 运行编译后的程序:

    ./serial_comm
    

注意事项

  • 确保你有权限访问 /dev/ttyUSB0。如果没有权限,你可能需要使用 sudo 命令运行程序,或者将用户添加到 dialout 组。
  • 上述程序仅进行了基本的错误检查。在生产环境中,你可能需要增加更完整的错误处理和异常管理。

这个示例程序展示了如何在 Linux 上使用 C++ 和 POSIX API 实现串口通信。

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

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

相关文章

Python面试题:在 Python 中,如何连接并操作数据库?

在 Python 中&#xff0c;可以使用多种库来连接并操作数据库。常用的库有 sqlite3、psycopg2&#xff08;用于 PostgreSQL&#xff09;、PyMySQL&#xff08;用于 MySQL&#xff09;、SQLAlchemy&#xff08;一个 ORM 工具&#xff0c;支持多种数据库&#xff09;。下面以 SQLi…

FlashAttention/ PagedAttention原理,大模型加速

1.1 GPU 硬件特点 由于 FlashAttention 计算 self-attention 的主要关键是有效的硬件使用&#xff0c;所以了解GPU内存和各种操作的性能特征是很有必要的。 以 A100 (40GB HBM) 为例&#xff0c;下面显示其内存层次结构的粗略图。SRAM内存分布在108个流式多处理器(SMs)上&…

基于 BERT 的非结构化领域文本知识抽取

文章目录 题目摘要方法实验 题目 食品测试的大型语言模型 论文地址&#xff1a;https://arxiv.org/abs/2103.00728 摘要 随着知识图谱技术的发展和商业应用的普及&#xff0c;从各类非结构化领域文本中提取出知识图谱实体及关系数据的需求日益增加。这使得针对领域文本的自动化…

千呼新零售2.0-OCR图像识别采购单视频介绍

千呼新零售2.0系统是零售行业连锁店一体化收银系统&#xff0c;包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体&#xff0c;线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货、宠物等连锁店使用。 详细介绍请…

2024年公司加密软件推荐TOP10|公司最佳数据防泄密方案!

在当今数字化信息爆炸的时代&#xff0c;保护公司的数据免受泄密威胁至关重要。选择一款适合的加密软件不仅可以有效防止数据泄露&#xff0c;还能保障公司的商业机密和客户隐私。 1.固信软件 固信软件以其卓越的数据保护功能和可靠的安全性而著称。它采用先进的数据加密技术&…

springboot农产品商城-计算机毕业设计源码46732

摘 要 随着社会经济的发展和人们消费观念的升级&#xff0c;农产品电商行业逐渐壮大。但传统的农产品销售模式存在信息不透明、中间环节复杂等问题&#xff0c;而微信小程序作为一种便捷的移动应用平台&#xff0c;为农产品商城的建设提供了新的可能性。通过微信小程序的设计与…

九.核心动画 - 显式动画

引言 本篇博客紧接着上一篇的隐式动画开始介绍显式动画。隐式动画是创建动态页面的一种简单的直接的方式&#xff0c;也是UIKit的动画机制基础。但是它并不能涵盖所有的动画类型。 显式动画 接下来我们就来研究另外一种动画显式动画&#xff0c;它能够对一些属性做指定的动画…

Android焦点之InputWindows的更新(二)

再次回到InputMonitor#updateInputWindows()&#xff0c;调用SurfaceControl.Transaction#merge&#xff0c;之后,当WindowAnimator.java的animate()时发起apply();可以是线程"android.anim"或"binder"线程; frameworks/base/services/core/java/com/andr…

常用知识碎片 Vue3 ref和reactive (内含其他常用知识)

目录 ref和reactive ref reactive 总结&#xff1a; setup语法糖 语法糖是啥&#xff1f; Vue3 setup语法糖 Vue3 不使用setup语法糖示例&#xff1a; Vue3 使用setup语法糖示例&#xff1a; ref和eative主要区别 ref和reactive 在 Vue 3 中&#xff0c;ref 和 reac…

品牌渠道管控力度的平衡艺术

渠道管控力度要如何把握呢&#xff1f;是不是管控越严格就一定越好&#xff1f;例如&#xff0c;发现一次低价就处以高额罚款&#xff0c;发现一次窜货也重罚&#xff0c;其实处罚是对低价管控较为直接的一种方式&#xff0c;但并非处罚越重就一定能取得良好的管控效果。 比如品…

Java 中的 switch 语句:类型支持与限制

Java 中的 switch 语句&#xff1a;类型支持与限制 1、switch 语句支持的数据类型2、switch 语句不支持的数据类型3、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在 Java 中&#xff0c;switch 语句是一种用于多分支选择的控制结构…

@SpringBootTest注解的用途是什么?

SpringBootTest注解是Spring Boot提供的一个用于测试的注解&#xff0c;主要用途是在测试过程中方便地创建一个应用上下文&#xff08;ApplicationContext&#xff09;。这个注解告诉Spring Boot去寻找一个主配置类&#xff08;比如带有SpringBootApplication的类&#xff09;&…

常见的负载均衡算法和实现方式

负载均衡的原理&#xff0c;并给出常见的负载均衡算法和实现方式 负载均衡是一种分布式系统设计策略&#xff0c;其目的是为了将用户请求分摊到多个服务器上&#xff0c;提高系统的可用性和响应速度。它通过动态地将工作负载分配给各个节点&#xff0c;避免单点过载并提升整体…

【编程范式】理解响应式编程(reactive programming)

文章目录 一、定义与特点二、核心概念三、应用场景四、优势与挑战五、总结 响应式编程&#xff08;Reactive Programming&#xff09;是一种面向数据流和变化传播的编程范式&#xff0c;其核心在于以非阻塞和异步的方式处理数据流&#xff0c;从而提高应用的响应性、可维护性和…

如何使用FreeFileSync:一款免费且专业的数据备份与文件同步软件

数据的重要性不言而喻&#xff0c;因此&#xff0c;定期做数据备份已经是每一个人的基本工作习惯了。 FreeFileSync 是一款强大专业且免费开源的 文件夹对比/同步/备份 软件工具。FreeFileSync通过比较其内容&#xff0c;日期或文件大小上的一个或多个文件夹&#xff0c;然后根…

android 图片轮播

在Android中&#xff0c;实现图片轮播&#xff08;也称为图片滑动或图片轮转&#xff09;通常涉及到使用ViewPager、RecyclerView配合PagerAdapter、RecyclerView.Adapter或者第三方库如Glide、Picasso来处理图片加载&#xff0c;以及一个定时器&#xff08;如Handler、Timer、…

统信UOS桌面操作系统上删除系统升级后GRUB中的回滚条目与备份

原文链接&#xff1a;统信UOS删除升级后GRUB中的回滚条目与备份 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于在统信UOS桌面操作系统上删除系统升级后GRUB中的回滚条目与备份的文章。在进行系统升级后&#xff0c;GRUB引导菜单中可能会出现多个回滚条目和备份…

深入解析C++中的特殊成员函数:构造函数、析构函数、拷贝构造函数与赋值操作符

深入解析C中的特殊成员函数&#xff1a;构造函数、析构函数、拷贝构造函数与赋值操作符 在C编程的浩瀚宇宙中&#xff0c;构造函数、析构函数、拷贝构造函数和赋值操作符是构成对象生命周期和行为的四大基石。它们各自扮演着不可或缺的角色&#xff0c;确保了对象从创建到销毁…

2024年华为OD机试真题-找座位-C++-OD统一考试(C卷D卷)

2024年OD统一考试(D卷)完整题库:华为OD机试2024年最新题库(Python、JAVA、C++合集) 题目描述: 在一个大型体育场内举办了一场大型活动,由于疫情防控的需要,要求每位观众的必须间隔至少一个空位才允许落座。现在给出一排观众座位分布图,座位中存在已落座的观众,请计…

nginx正向代理、反向代理、负载均衡

nginx.conf nginx首要处理静态页面 反向代理 动态请求 全局模块 work processes 1; 设置成服务器内核数的两倍&#xff08;一般不不超过8个超过8个反而会降低性能一般4个 1-2个也可以&#xff09; netstat -antp | grep 80 查端口号 *1、events块&#xff1a;* 配置影响ngi…