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

Linux驱动开发之串口驱动移植

原理图

         从上图可以看到RS232的串口接的是UART3,接下来我们需要使能UART3的收发功能。一般串口的驱动程序在内核中都有包含,我们配置使能适配即可。

设备树

复用功能配置

        查看6ull如何进行uart3的串口复用配置:

        设备树下添加uart3的串口复用配置:

pinctrl_uart3: uart3grp {fsl,pins = <MX6UL_PAD_UART3_RX_DATA__UART3_DTE_TX 0x1b0b1MX6UL_PAD_UART3_RX_DATA__UART3_DCE_RX 0x1b0b1>;};

添加设备树节点 

        设备树下添加uart3的设备树节点:

&uart3 {pinctrl-names = "default";pinctrl-0 = <&pinctrl_uart3>;status = "okay";
};

        重新编译设备树make dtbs,并拷贝到开发板对应位置替换之前的设备树文件。

查看串口功能配置

        重启开发板后,查看配置是否生效:

        由上图看出UART3功能配置已经生效。

串口应用编程

应用层代码参考

#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <termios.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <sys/ioctl.h>
#include <errno.h>#define ttyname "/dev/ttymxc2"
int fd;
static char wbuff[128];
static char rbuff[128];void *read_handler(void * arg){int ret;while(1){memset(rbuff, 0, sizeof(rbuff));ret = read(fd, rbuff, sizeof(rbuff));if(ret == -1 ){perror("read");close(fd);pthread_exit(NULL);}else if(ret > 0){printf("RCV: %s\n", rbuff);fflush(stdout);}}pthread_exit(NULL);
}int main(int argc, char **argv){int ret;pthread_t thread;struct termios tty;fd = open(ttyname, O_RDWR | O_NOCTTY | O_NDELAY);if (fd == -1){// 打开端口失败perror("open_port: Unable to open /dev/tty ");}if(fcntl(fd, F_SETFL, 0)<0) /* 设置串口为阻塞状态*/{printf("fcntl failed!\n");close(fd);return -1;}// 获取当前串口配置memset(&tty, 0, sizeof(tty));if (tcgetattr(fd, &tty) != 0) {perror("Error from tcgetattr: ");}// 配置波特率cfsetispeed(&tty, B115200);cfsetospeed(&tty, B115200);// 配置数据位、停止位和校验tty.c_cflag &= ~CSIZE;tty.c_cflag |= CS8;     // 8数据位tty.c_cflag &= ~CSTOPB; // 1停止位tty.c_cflag &= ~PARENB; // 无校验位/*设置等待时间和最小接收字符*/tty.c_cc[VTIME]  = 1;tty.c_cc[VMIN] = 1;tty.c_cflag |= CREAD | CLOCAL; // 开启接收,忽略modem控制线// tty.c_iflag = IGNPAR | ICRNL; // 忽略校验错误,输入时将回车转换为换行tty.c_oflag = ~(ONLCR | ICRNL); //tty.c_iflag &= ~(INLCR | ICRNL |IGNCR); //tty.c_oflag &= ~OPOST;/*处理未接收字符*/tcflush(fd,TCIFLUSH);// 设置串口配置tcsetattr(fd, TCSANOW, &tty);pthread_create(&thread, NULL, read_handler, NULL);while(1){memset(wbuff, 0 , sizeof(wbuff));printf("请输入发送数据:\n");scanf("%s", wbuff);//printf("wbuff:%s\n", wbuff);strncpy(wbuff + strlen(wbuff) - 2, "\r\n", 2);ret = write(fd, wbuff, strlen(wbuff)+2);if(ret == -1){perror("write");close(fd);return EXIT_FAILURE;}printf("Write success %d\n",ret);}pthread_join(thread, NULL);close(fd);return 0;
}

编译没报错:

        最后拷贝到开发板进行验证

开发板验证

        开发板接好线,PC上开启串口助手进行功能验证:

 

相关文章:

Linux驱动开发之串口驱动移植

原理图 从上图可以看到RS232的串口接的是UART3&#xff0c;接下来我们需要使能UART3的收发功能。一般串口的驱动程序在内核中都有包含&#xff0c;我们配置使能适配即可。 设备树 复用功能配置 查看6ull如何进行uart3的串口复用配置&#xff1a; 设备树下添加uart3的串口复用…...

计算机毕业设计SpringBoot+Vue.js美食推荐系统商城(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

指针小节.

....指针的第四个作用&#xff1a;函数的结果和计算状态分开 高级指针。。 指针中的数据类型&#xff1a;获取字节数据的个数。步长&#xff1a;指针移动一次的字节个数&#xff08;int&#xff0c;long。。。各自字节都不同&#xff09; 加减都可以...

[Qt5] QJson数据之间的转换以及QByteArray图像数据压缩

&#x1f4e2;博客主页&#xff1a;https://loewen.blog.csdn.net&#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;本文由 丶布布原创&#xff0c;首发于 CSDN&#xff0c;转载注明出处&#x1f649;&#x1f4e2;现…...

2025年能源工作指导意见

2025年是“十四五”规划收官之年&#xff0c;做好全年能源工作意义重大。为深入贯彻落实党中央、国务院决策部署&#xff0c;以能源高质量发展和高水平安全助力我国经济持续回升向好&#xff0c;满足人民群众日益增长的美好生活用能需求&#xff0c;制定本意见。 一、总体要求…...

Android 获取jks的SHA1值:java.io.IOException: Invalid keystore format

命令生成 keytool -list -v -keystore 全路径.jks -alias 别名 -storepass 密码 -keypass 密码 1、遇到 的问题&#xff1a; 通过快捷键 ‘win r’ 启动的小黑框运行上面的命令会出现下面这个错误keytool 错误: java.io.IOException: Invalid keystore format 2、解决问题 …...

深入探索像ChatGPT这样的大语言模型-02-POST training supervised finetuning

参考 【必看珍藏】2月6日&#xff0c;安德烈卡帕西最新AI普及课&#xff1a;深入探索像ChatGPT这样的大语言模型&#xff5c;Andrej Karpathy fineweb知乎翻译介绍 fineweb-v1原始连接 fineweb中文翻译版本 Chinese Fineweb Edu数据集 查看网络的内部结果&#xff0c;可以参…...

广义线性模型下的数据分析(R语言)

一、实验目的&#xff1a; 通过上机试验&#xff0c;掌握利用R实现线性回归分析、逻辑回归、列联分析及方差分析&#xff0c;并能对分析结果进行解读。 数据&#xff1a; 链接: https://pan.baidu.com/s/1JqZ_KbZJEk-pqSUWKwOFEw 提取码: hxts 二、实验内容&#xff1a; 1、2…...

AutoMQ:无需 Cruise Control 实现 Kafka 的自动分区再平衡

导读&#xff1a;AutoMQ是一款贯彻云优先理念来设计的 Kafka 替代产品。AutoMQ 创新地对 Apache Kafka 的存储层进行了基于云的重新设计&#xff0c;在 100% 兼容 Kafka 的基础上通过将持久性分离至 EBS 和 S3 带来了 10x 的成本降低以及 100x 的弹性能力提升&#xff0c;并且相…...

在剪映中给英文学习视频添加中文字幕

文章目录 一、剪映是什么&#xff1f;二、使用步骤1.下载2.操作 一、剪映是什么&#xff1f; 剪映是由字节跳动公司开发的一款功能强大且易于使用的视频编辑软件&#xff0c;在移动端和电脑端均有应用。 二、使用步骤 1.下载 2.操作...

Opencv之sift特征检测和FLANN 匹配器进行指纹特征匹配

sift特征检测和FLANN 匹配器进行指纹匹配 目录 sift特征检测和FLANN 匹配器进行指纹匹配1 sift特征检测1.1 概念1.2 优缺点 2 FLANN 匹配器2.1 概念2.2 工作原理与匹配方式2.3 FLANN 匹配器的使用步骤2.4 优缺点 3 函数3.1 特征检测匹配3.2 匹配符合条件点并绘制 3 代码测试3.1…...

rust学习~tokio的io

await Suspend execution until the result of a Future is ready. 暂停执行&#xff0c;直到一个 Future 的结果就绪。 .awaiting a future will suspend the current function’s execution until the executor has run the future to completion. 对一个 Future 使用 .awa…...

FPGA开发,使用Deepseek V3还是R1(2):V3和R1的区别

以下都是Deepseek生成的答案 FPGA开发&#xff0c;使用Deepseek V3还是R1&#xff08;1&#xff09;&#xff1a;应用场景 FPGA开发&#xff0c;使用Deepseek V3还是R1&#xff08;2&#xff09;&#xff1a;V3和R1的区别 FPGA开发&#xff0c;使用Deepseek V3还是R1&#x…...

本地部署大数据集群前置准备

1. 设置VMware网段 虚拟网络编辑器——更改设置——选择VMnet8——子网改成192.168.88.0——NAT设置——网关设置为192.168.88.2 2. 下载CentOS操作系统 下载CentOS 7.6(1810)版本 3. 在VMware中安装CentOS操作系统 创建新的虚拟机——典型——安装光盘映像文件——输入账…...

Spring Boot整合RabbitMQ

1. 环境准备 Spring Boot 2.1.3.RELEASERabbitMQ 3.xJDK 8 或以上Maven 3.5 2. 安装Erlang、RabbitMQ 2.1 安装前准备 RabbitMQ 依赖 Erlang 环境&#xff0c;需确保两者的版本匹配&#xff0c;官方兼容性参考&#xff1a;RabbitMQ & Erlang 版本对照表‌。 2.2 下载安…...

CDefView::_OnFSNotify函数分析

进入CDefView::_OnFSNotify函数时状态栏 _UpdateStatusBar函数之后增加一个对象&#xff0c;变成7个对象。 LRESULT CDefView::_OnFSNotify(LONG lNotification, LPCITEMIDLIST* ppidl) { LPITEMIDLIST pidl; LPCITEMIDLIST pidlItem; // we may be registered for no…...

精准汇报:以明确答复助力高效工作

在工作场景中&#xff0c;汇报工作是一项至关重要的沟通环节&#xff0c;它不仅关乎工作进展的有效传达&#xff0c;更影响着团队协作的顺畅度和整体工作效率。而汇报工作的关键&#xff0c;就在于给予明确肯定的答复&#xff0c;摒弃“应该”“可能”这类模糊词汇&#xff0c;…...

Java自动拆箱装箱/实例化顺序/缓存使用/原理/实例

在 Java 编程体系中&#xff0c;基本数据类型与包装类紧密关联&#xff0c;它们各自有着独特的特性和应用场景。理解两者之间的关系&#xff0c;特别是涉及到拆箱与装箱、实例化顺序、区域问题、缓存问题以及效率问题。 一、为什么基本类型需要包装类 泛型与集合的需求 Java…...

软件工程---基于构件的软件工程

基于构件的软件工程&#xff08;CBSE&#xff09;是一种软件开发方法&#xff0c;通过重用现有的软件构件来构建系统&#xff0c;从而提高开发效率和软件质量。这种方法强调软件系统的模块化设计和构建复用&#xff0c;使得软件开发过程更加高效和灵活。 企业软件开发&#xf…...

AMD RDNA3 GPU架构解析

本文会通过把AMD的RDNA3架构为例比喻为**“施工公司”**工作模式&#xff0c;深入理解GPU如何高效处理顶点着色、像素计算等任务。 一、施工公司的组织架构 1. 施工公司&#xff08;WGP&#xff09;与施工队&#xff08;CU&#xff09; WGP&#xff08;Work Group Processor&…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...