当前位置: 首页 > news >正文

在 Ubuntu 下通过 C APP程序实现串口发送数据并接收返回数据

一、前言

        使用 C 应用进行串口调用需要手动配置串口的各项参数,并且 Ubuntu 下的串口是通过读写文件实现的,所以还需要设置权限。

二、源码分析

serial.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>      // 文件控制定义(如 O_RDWR)
#include <unistd.h>     // Unix 标准函数(如 read/write)
#include <termios.h>    // 串口配置(波特率等)
#include <errno.h>      // 错误号定义static int fd;
#ifndef CRTSCTS
#define CRTSCTS 020000000000  /* Flow control.  八进制值,等同于 0x80000000*/
#endif
/*** @Description: 打开串口并返回文件描述符* @param {char} *device: 串口设备* @return {*} 成功返回 0,失败返回 -1*/
int open_serial_port(const char *device) {fd = open(device, O_RDWR | O_NOCTTY | O_NDELAY);if (fd == -1) {perror("无法打开串口设备");return -1;}// 恢复串口阻塞模式(等待数据)fcntl(fd, F_SETFL, 0);// 配置串口参数struct termios options;tcgetattr(fd, &options);// 设置波特率 115200 cfsetispeed(&options, B115200);cfsetospeed(&options, B115200);// 8N1(8数据位,无校验,1停止位)options.c_cflag &= ~PARENB;   // 无校验options.c_cflag &= ~CSTOPB;   // 1停止位options.c_cflag &= ~CSIZE;    // 清除数据位掩码options.c_cflag |= CS8;       // 8数据位// 启用接收,忽略 modem 控制线options.c_cflag |= (CLOCAL | CREAD);// 关闭流控options.c_cflag &= ~CRTSCTS;  // 无硬件流控options.c_iflag &= ~(IXON | IXOFF | IXANY);  // 无软件流控// 原始输入模式(不处理特殊字符)options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);// 原始数据(RAW)输出options.c_oflag &= ~OPOST;// 最小读取字符数和超时(单位:0.1秒)options.c_cc[VMIN] = 1;      // 至少读取1个字符options.c_cc[VTIME] = 10;    // 超时 1秒(10 * 0.1s)// 应用配置if (tcsetattr(fd, TCSANOW, &options) != 0) {perror("串口配置失败");close(fd);return -1;}return 0;
}/*** @Description: 关闭串口* @return {*}*/
void close_serial_port(void) {close(fd);
}/*** @Description: 发送数据并接收返回* @param {unsigned char} *tx_data* @param {int} tx_len* @param {unsigned char} *rx_buf* @param {int} rx_buf_size* @return {*} 接收数据长度*/
int send_and_receive(const unsigned char *tx_data, int tx_len, unsigned char *rx_buf, int rx_buf_size) {// 发送数据int written = write(fd, tx_data, tx_len);if (written != tx_len) {perror("发送数据失败");return -1;}printf("已发送 %d 字节: ", written);for (int i = 0; i < written; i++) {printf("%02X ", tx_data[i]);}printf("\n");// 接收数据int received = read(fd, rx_buf, rx_buf_size);if (received < 0) {perror("接收数据失败");return -1;}// .* 表示精度(precision)由后面的参数动态指定(这里用 length 变量控制)printf("收到 %d 字节: ", received);printf("%.*s", received, rx_buf);printf("\n");return received;
}

        这里有个地方需要注意,宏定义 CRTSCTS 硬件流控默认是关闭的,如果想要使用需要先启用 __USE_MISC 宏定义:

#ifdef __USE_MISC
# define CBAUD	 000000010017 /* Baud speed mask (not in POSIX).  */
# define CBAUDEX 000000010000 /* Extra baud speed mask, included in CBAUD.(not in POSIX).  */
# define CIBAUD	 002003600000 /* Input baud rate (not used).  */
# define CMSPAR  010000000000 /* Mark or space (stick) parity.  */
# define CRTSCTS 020000000000 /* Flow control.  */
#endif

在代码中显式定义 _GNU_SOURCE,这些特性测试宏会自动启用 __USE_MISC:

#define _GNU_SOURCE   // 或 #define _BSD_SOURCE

而我为了方便,直接在源文件进行了宏定义 CRTSCTS 硬件流控的定义:

#ifndef CRTSCTS
#define CRTSCTS 020000000000  /* Flow control.  八进制值,等同于 0x80000000*/
#endif

serial.h

#ifndef SERIAL_H
#define SERIAL_H#include <stdint.h>int open_serial_port(const char *device);
void close_serial_port(void);
int send_and_receive(const unsigned char *tx_data, int tx_len, unsigned char *rx_buf, int rx_buf_size);#endif

三、设置权限

        在 Linux 系统中尝试打开串口设备(如 /dev/ttyCH341USB0 或 /dev/ttyUSB0)时遇到权限不足(Permission denied) 错误,将当前用户加入 dialout 组:

sudo usermod -a -G dialout $USER

这样用户就可以读写串口设备文件了。

相关文章:

在 Ubuntu 下通过 C APP程序实现串口发送数据并接收返回数据

一、前言 使用 C 应用进行串口调用需要手动配置串口的各项参数&#xff0c;并且 Ubuntu 下的串口是通过读写文件实现的&#xff0c;所以还需要设置权限。 二、源码分析 serial.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <…...

ubuntu24.04+RTX5090D 显卡驱动安装

初步准备 Ubuntu默认内核太旧&#xff0c;用mainline工具安装新版&#xff1a; sudo add-apt-repository ppa:cappelikan/ppa sudo apt update && sudo apt full-upgrade sudo apt install -y mainline mainline list # 查看可用内核列表 mainline install 6.13 # 安装…...

ubuntu22.04上运行opentcs6.4版本

1、下载github上的源码&#xff1a; openTCS - Downloads 2、安装java21 我的版本是&#xff1a;java --version java 21.0.6 2025-01-21 LTS Java(TM) SE Runtime Environment (build 21.0.68-LTS-188) Java HotSpot(TM) 64-Bit Server VM (build 21.0.68-LTS-188, mixed mo…...

labelme进行关键点标注并转换为yolo格式

目录 1、labelme安装和打开2、边界框和关键点标注3、将lamelme的json格式转成yolo可以使用的txt格式4、将数据和标签按照9比1分为训练集和测试集 1、labelme安装和打开 在python3.9及以上环境中安装labelme&#xff0c;labelme要用到pyqt&#xff0c;所以在使用labelme之前要安…...

每日算法-250521

每日算法学习 大家好&#xff01;这是我今天的算法练习记录&#xff0c;分享四道 LeetCode 题目的解题思路和代码。希望能对大家有所帮助&#xff01; 219. 存在重复元素 II 题目 思路 哈希表 利用哈希表来存储数组中元素及其最近出现的索引。 解题过程 当我们遍历数组 num…...

正大模型视角下的高频交易因子构建策略研究

正大模型视角下的高频交易因子构建策略研究 在金融衍生品交易体系中&#xff0c;数据主导型模型逐渐成为核心竞争力。以正大为代表的量化团队&#xff0c;通过大量历史数据研究&#xff0c;构建出一套基于高频因子的模型框架&#xff0c;从成交节奏、盘口行为、价格波动等维度动…...

Babylon.js学习之路《八、动画基础:关键帧动画与缓动效果》

文章目录 1. 引言&#xff1a;动画在3D场景中的核心作用2. 关键帧动画基础2.1 键帧动画原理2.2 创建简单关键帧动画 3. 缓动函数&#xff08;Easing Functions&#xff09;3.1 缓动函数的作用3.2 应用缓动函数 4. 复杂动画&#xff1a;多属性联动与序列控制4.1 同时控制位置、旋…...

小满未满,是成长的序章

节气小满&#xff0c;昭示着奋斗正当时&#xff0c;Codigger 怀揣热忱&#xff0c;在代码的天地里披荆斩棘&#xff0c;向着圆满目标大步迈进 。...

JavaWeb 开发流程

项目建立 SpringBoot框架构建 Spring Boot 是基于 Spring 框架的开源 Java 基础框架&#xff0c;用于创建独立、生产级的基于 Spring Framework 的应用程序。 我们可以使用IDEA建立SpringBoot框架。 语言选择Java&#xff0c;类型选择Maven&#xff0c;JDK和Java要保持一致&…...

Cmake 使用教程

介绍 CMake 是一个开源、跨平台的构建系统&#xff0c;主要用于软件的构建、测试和打包。CMake 使用平台无关的配置文件 CMakeLists.txt 来控制软件的编译过程&#xff0c;并生成适用于不同编译器环境的项目文件。例如&#xff0c;它可以生成 Unix 系统的 Makefile 、 Win…...

CLIP、ViLT 与 LLaVA:多模态模型是如何看图说话的?

一、前言&#xff1a;我们已经讲了 MLLM 能力&#xff0c;但它到底是怎么实现“看图说话”的&#xff1f; 在之前文章中&#xff0c;我们已经提到了MLLM可以看图说话以及文生图等能力&#xff0c;ViT统一图文多模态架构。那模型是如何处理图文信息以及不同处理所带来的能力是怎…...

基于Springboot + vue3实现的流动摊位管理系统

项目描述 本系统包含管理员、用户、商家三个角色。 管理员角色&#xff1a; 用户管理&#xff1a;管理系统中所有用户的信息&#xff0c;包括添加、删除和修改用户。 配置管理&#xff1a;管理系统配置参数&#xff0c;如上传图片的路径等。 权限管理&#xff1a;分配和管理…...

我的软考经历

说明&#xff1a;本文分享博主软考经验&#xff0c;及软考证书在找工作时的作用。 软考 软考&#xff0c;全称&#xff1a;中国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff0c;报名/考试/查询网址为&#xff0c;中国计算机技术职业资格网 考试分…...

C++的异常

引入&#xff1a;异常的意义是什么&#xff1f; ①&#xff1a;错误分离 将正常逻辑&#xff08;try&#xff09;与错误处理&#xff08;catch&#xff09;分离&#xff0c;避免代码被大量 if-else 污染。 ②&#xff1a;强制处理 若不捕获异常&#xff0c;程序终止&#xff0c…...

精益制造数字化转型智能工厂三年规划建设方案

该文档是精益制造数字化转型智能工厂三年规划建设方案,以打造高品质、低成本、柔性化的绿色智能工厂为愿景,围绕制造技术、自动化、数智化、管理赋能四大路径,通过夯实 EHS、品质一致性、生产安定化、现场整洁四大基石,推进标杆车间打造、联合管理、TOB 流程改善等专项。规…...

Linux 文件(3)

文章目录 1. Linux下一切皆文件2. 文件缓冲区2.1 缓冲区是什么2.2 缓冲区的刷新策略2.3 为什么要有缓冲区2.4 一个理解缓冲区刷新的例子 3. 标准错误 1. Linux下一切皆文件 在刚开始学习Linux的时候&#xff0c;我们就说Linux下一切皆文件——键盘是文件&#xff0c;显示器是文…...

Java异步编程利器:CompletableFuture 深度解析与实战

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 一、CompletableFuture 概述 CompletableFuture是Java 8引入的异步编程工具类&#xff0c;实现了Future和CompletionStage接口&#xff0c;支持链式调用、组…...

如何支持Enhanced RTMP H.265(HEVC)

在实时音视频传输中&#xff0c;H.264长期占据主流&#xff0c;但随着视频质量要求的不断提高和带宽压力的加大&#xff0c;H.265&#xff08;HEVC&#xff09;作为下一代视频编码标准逐渐崭露头角。 在这种背景下&#xff0c;我们顺应行业发展趋势&#xff0c;成功集成了对Enh…...

Idea 查找引用jar包依赖来源的Maven pom坐标

目录 问题引入 实现解决 问题引入&#xff1a; 在查看拉取的项目&#xff0c;维护自己项目、或者迁移原有项目时&#xff0c;会遇到不知道代码中引用到的依赖从哪里引用到的。 所以利用Idea&#xff0c;从import语句到Maven项目结构树中查找&#xff0c;最终找到pom文件里的…...

Linux操作系统之进程(二):进程状态

目录 前言 一、补充知识点 1、并行与并发 2、时间片 3、 等待的本质 4、挂起 二. 进程的基本状态 三、代码演示 1、R与S 2、T 3、Z 四、孤儿进程 总结&#xff1a; 前言 在操作系统中&#xff0c;进程是程序执行的基本单位。每个进程都有自己的状态&#xff0c;这些…...

web.py使用时报错AttributeError: No template named image_window

在使用python的web.py框架做前后端时遇到问题。 问题代码主要如下&#xff0c;当加上main(iamge_name)这行代码后就会报错。报错信息包含两个&#xff1a;第一是找不到image_window模板&#xff1b;第二是gbk无法解码... class ImageWindow:def GET(self, image_name):main(i…...

2025年度消费新潜力白皮书470+份汇总解读|附PDF下载

原文链接&#xff1a;https://tecdat.cn/?p42178 过去一年&#xff0c;消费市场在政策驱动与技术迭代中呈现结构性变革。社零总额达487,895亿元&#xff0c;实物商品网零额占比27%&#xff0c;线上渠道成为增长引擎。本报告从食品饮料、美妆护肤、家电数码、服饰户外四大核心领…...

全平台开源电子书阅读器推荐,支持多端同步+AI朗读!支持epub/mobi/azw3/pdf常见电子书格式!

Readest是一款好用的免费阅读工具&#xff0c;界面干净不花哨&#xff0c;特别适合喜欢专心读书的朋友。这个软件是经典阅读软件Foliate的全新升级版本&#xff0c;用最新技术开发&#xff0c;能在手机、电脑&#xff08;包括苹果和Windows系统&#xff09;以及网页上顺畅使用。…...

创建Workforce

创建你的Workforce 3.3.1 简单实践 1. 创建 Workforce 实例 想要使用 Workforce&#xff0c;首先需要创建一个 Workforce 实例。下面是最简单的示例&#xff1a; from camel.agents import ChatAgent from camel.models import ModelFactory from camel.types import Model…...

关于光谱相机的灵敏度

一、‌灵敏度的核心定义‌ ‌光谱灵敏度&#xff08;单色灵敏度&#xff09;‌ 描述光谱相机对单色辐射光的响应能力&#xff0c;即探测器对特定波长入射光的输出信号强度与入射光功率的比值。 例如&#xff0c;若在680nm波长下的光谱灵敏度较高&#xff0c;则表示该相机对此…...

【Redis】二、Redis常用数据类型命令学习

目录 一、String 1. SET、GET&#xff1a;设置与读取键值对&#xff1a; 2. DEL&#xff1a;删除键 3. INCR、DECR&#xff1a;自增 / 自减&#xff08;常用于计数器&#xff09; 4. APPEND&#xff1a;内容追加 5. EXPIRE&#xff1a;设置过期时间 / 查看剩余时间&#x…...

HarmonyOS基础组件:Button三种类型的使用

简介 HarmonyOS在明年将正式不再兼容Android原生功能&#xff0c;这意味着对于客户端的小伙伴不得不开始学习HarmonyOS开发语言。本篇文章主要介绍鸿蒙中的Button使用。 HarmonyOS中的Button相较于Android原生来说&#xff0c;功能比较丰富&#xff0c;扩展性高&#xff0c;减…...

RT_Thread——快速入门

文章目录 一、RT-Thread 目录结构二、核心文件三、移植时涉及的文件3.1 CPU 部分3.2 BSP 部分 四、内存管理五、启动流程及main函数5.1 启动流程5.2 关键函数速览5.3 main 函数示例 六、数据类型和编程规范6.1 数据类型6.2 函数名6.3 结构体定义6.4 注释规范 七、使用模拟器运行…...

Java 参数值传递机制

一个很经典的问题: java的方法入参 是值传递还是地址传递&#xff1f; 答案是&#xff1a;值传递。 今天排查一个生产问题&#xff0c;数据库链接资源没有关闭。 大致代码逻辑如下&#xff1a; try{Preparestatement ps null;String sql "select * from tableA wher…...

Redis 的 key 的过期策略是怎么实现的

在 Redis 中&#xff0c;有一个 expire 命令&#xff0c;用来设置某个 key 的过期时间&#xff0c;当超过这个时间后&#xff0c;这个 key 就被删除了&#xff0c;我们也就获取不到了&#xff0c;但是 Redis 是如何做到对于每一个设置了过期时间的 key 都能按时删除的呢&#x…...

ROG NUC 2025 :狂暴而冷静的小猛兽

在今年1 月的 CES 展会上&#xff0c;华硕首次披露了ROG NUC 2025&#xff0c;就以突破性紧凑设计桌面级超强性能配置&#xff0c;引发全球科技媒体和游戏爱好者的热议。蛰伏数月&#xff0c;蓄力进化&#xff01; 华硕自承接英特尔NUC产品线以来&#xff0c;就一直致力于重塑迷…...

origin绘图之【如何将多条重叠、高度重叠的点线图、折线图分开】

在使用 Origin 进行数据可视化时&#xff0c;尤其是在绘制多组数据的折线图或点线图时&#xff0c;我们经常会遇到这样的问题&#xff1a;多条曲线重叠严重&#xff0c;难以区分&#xff0c;导致图形信息密集、可读性差&#xff0c;影响图表的传达效果。 那么&#xff0c;我们该…...

2025第一届轩辕杯--Crypto--WriteUp

2025第一届轩辕杯–Crypto–WriteUp Crypto easyrsa task e 65537 n 1000000000000000000000000000156000000000000000000000000005643 c 418535905348643941073541505434424306523376401168593325605206exp from Crypto.Util.number import inverse, long_to_bytese …...

人工智能范式:技术革命下的认知重构

当生成式AI能够自主创作内容、设计解决方案甚至编写程序时&#xff0c;我们正在见证的不仅是工具革新&#xff0c;更是一场认知范式的根本转变。人工智能范式正在重塑人类理解世界、解决问题和创造价值的基本方式——这种转变将重新定义未来十年的职业逻辑与知识体系。 一、范…...

python训练营打卡第30天

模块和库的导入 知识点回顾&#xff1a; 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑&#xff1a;找到根目录&#xff08;python解释器的目录和终端的目录不一致&#xff09; 一、导入官方库 1.标准导入&#xff1a;导入整个库 import mathprint(&quo…...

第29天-python实现mysql数据增删改查

想用Python和Tkinter实现一个MySQL数据库的增删改查应用。首先,我需要确定用户的需求是什么。他们可能想要一个图形界面,方便操作数据库,而不需要直接写SQL语句。用户可能对Python和Tkinter有一定了解,但对如何整合数据库操作可能不太熟悉。 首先,我应该考虑如何设计界面。…...

2025.05.21华为暑期实习机考真题解析第三题

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 03. GPU资源租赁优化 问题描述 A先生是一家云计算服务商的资源调度负责人,负责管理公司的GPU资源租赁业务。公司拥有多个高性能GPU核心,并按时间段出租给不同客户使用。每个客户有…...

Datawhale 5月llm-universe 第4次笔记

第四章 构建RAG应用 envs 在 Conda 中&#xff0c;envs 目录是用来存放虚拟环境的地方。 也就是说&#xff0c;你在运行&#xff1a; onda create -n llm-universe python3.10 时&#xff0c;Conda 就会在这个路径下创建一个新的文件夹&#xff1a; makefile D:\Users\…...

滑窗问题实验LC2653(一次遍历维持窗口元素保持排序)

在只有一次遍历&#xff08;即滑窗每向右移动一步只处理新增元素和删除旧元素&#xff09;的前提下&#xff0c;要维持当前窗口内元素的全局“可排序”结构 问题背景&#xff1a;LeetCode 2653 - 滑动子数组的美丽值 题目要求在大小为 k 的滑动窗口中&#xff0c;找到第 x 小…...

PHP学习笔记(八)

返回值 值通过可选参数的返回语句返回 return的使用 函数不能返回多个值&#xff0c;但可以通过返回一个数组来得到类似的效果 函数返回一个引用&#xff0c;必须在函数声明和指派返回值给一个变量时都使用引用运算符&&#xff1a; 可变函数 PHP支持可变函数的概念。意味…...

【react18】在styled-components中引入图片报错

在styled-components项目中&#xff0c;遇到背景图片显示不出来的问题。图片的确是引入正确&#xff0c;但是webpack解析路径是有问题的 效果展示 以下这两种写法都不行&#xff0c;无法生效 export const HeaderNavLeft styled.h1width: 176px;height: 69px;background: ur…...

693SJBH基于.NET的题库管理系统

计算机与信息学院 本科毕业论文&#xff08;设计&#xff09;开题报告 论文中文题目 基于asp.net的题库管理系统设计与实现 论文英文题目 Asp.net based database management system design and Implementation 学生姓名 专业班级 XXXXXX专业08 班 ⒈选题的背景和意…...

centos系统redis-dump安装

1. ​Ruby 环境​ Redis-dump 是一个 Ruby 工具&#xff0c;需先安装 Ruby 和 RubyGems。 安装依赖​&#xff1a; sudo yum install -y curl gpg2 gcc-c patch readline readline-devel zlib zlib-devel libyaml-devel libffi-devel openssl-devel make bzip2 autoconf aut…...

如何利用 Conda 安装 Pytorch 教程 ?

如何利用 Conda 安装 Pytorch 教程 &#xff1f; 总共分为六步走&#xff1a; &#xff08;1&#xff09;第一步&#xff1a;验证conda 环境是否安装好&#xff1f; 1) conda -V2) conda --version&#xff08;2&#xff09;第二步&#xff1a;查看现有环境 conda env list…...

FPGA降低功耗研究

FPGA降低功耗研究 首先要明白一点&#xff1a;我们的核心目标是在维持性能的前提下&#xff0c;通过工艺、架构、设计方法学和系统级策略的协同优化&#xff0c;降低动态功耗、静态功耗和短路功耗。 本篇文章则是聚焦于 FPGA 设计阶段 的功耗优化&#xff0c;主要从 RTL 代码设…...

软考 系统架构设计师系列知识点之杂项集萃(67)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之杂项集萃&#xff08;66&#xff09; 第108题 RISC&#xff08;精简指令系统计算机&#xff09;的特点不包括&#xff08;&#xff09;。 A. 指令长度固定&#xff0c;指令种类尽量少 B. 寻址方式尽量丰富&#xff…...

第十节第三部分:常见API:传统时间:Date日期类、SimpleDateFormat

Date日期类常用方法 时间格式常用符号 Date日期类总结 为什么用SimpleDateFormat SimpleDateFormat常见方法 SimpleDateFormat解析字符串时间成为日期对象 SimpleDateFormat总结 代码&#xff1a; 代码一&#xff1a;Date日期类 package com.itheima.Time;import java.util.D…...

Python学习Day1:安装

Python的安装 1.安装python 打开python的官网&#xff0c;我们下载3.6.8版本Python Release Python 3.6.8 | Python.org 根据自己的电脑来下载对应的python版本 如图所示&#xff1a; 我已经下载完成&#xff0c;就是这样&#xff0c; 安装页面的第一排是自动安装&#xf…...

Java安全-Servlet内存马

内存马简介 内存马是指将恶意代码注入到内存中&#xff0c;达到无文件落地的效果&#xff0c;使得被攻击方难以察觉。由于是无文件的形式&#xff0c;可以绕过部分基于文件检测的杀软。而 Servlet 内存马是基于 Java Servlet 技术&#xff0c;动态将恶意代码注入到 Tomcat 内存…...

Mariadb cpu 93% 问题

最近项目遇到cpu平均使用率93% 一、登录数据库服务查看具体情况 可以看到服务器负载很高&#xff0c;&#xff0c;mariadb CPU使用已达到接近380.4% &#xff08;因为是8核&#xff0c;所以会有超过100%的情况&#xff09;。如下图&#xff1a; 二、排查是否有耗时较长sql 在…...