Linux学习第42天:Linux RS232/485/GPS 驱动实验:天外来客

news2024/11/24 6:04:25

Linux版本号4.1.15   芯片I.MX6ULL                                    大叔学Linux    品人间百味  思文短情长 


        Linux的学习笔记今天更新到了第42天。鉴于国往笔记内容整理中出现的问题,我尽量按照平时学习时笔记的要求进行优化。尽量不再大段大段的贴代码。而是从我自身学习的角度,按照我个人的理解去整理优化教程中的内容。因为如果都是大段的贴代码贴内容而没有自己的思考总结,学习的过程仅仅是机械的复制粘贴将是没有任何意义的。因为我文章的定位是学习笔记而不是教程,不能面面俱到。整理重点、难点,加之自己的理解消化后形成的文章才是我所需要的。

        本次笔记将学习开发板通过GPS模块接收卫星信息,题目中提到的天外来客就是卫星。接收以后模块通过串口232发送给开发板,解码以后显示在minicom界面中。

        本章的思维导图如下:

        串口分为TTL和RS232,不管什么接口电平,驱动程序都是一样的。

一、Linux下UART驱动框架

1、uart_driver注册与注销

        串口驱动没有主机端和设备端区分,就只有一个串口驱动。

295 struct uart_driver {
296 struct module *owner; /* 模块所属者 */
297 const char *driver_name; /* 驱动名字 */
298 const char *dev_name; /* 设备名字 */
299 int major; /* 主设备号 */
300 int minor; /* 次设备号 */
301 int nr; /* 设备数 */
302 struct console *cons; /* 控制台 */
303
304 /*
305 * these are private; the low level driver should not
306 * touch these; they should be initialised to NULL
307 */
308 struct uart_state *state;
309 struct tty_driver *tty_driver;
310 };

        每个串口驱动都需要定义一个 uart_driver,加载驱动的时候通过 uart_register_driver 函数向
系统注册这个 uart_driver,此函数原型如下:

int uart_register_driver(struct uart_driver *drv)

        同理,注销驱动需要:

void uart_unregister_driver(struct uart_driver *drv)

2、uart_port的添加与移除

        uart_port 表示一个具体的 port,uart_port 中最主要的就是第 235 行的 ops, ops 包含了串口的具体驱动函数。

        uart_port 是怎么和 uart_driver 结合起来的呢?这里要用到 uart_add_one_port 函数:

int uart_add_one_port(struct uart_driver *drv,
struct uart_port *uport)

        卸载函数:

int uart_remove_one_port(struct uart_driver *drv, struct uart_port *uport)

3、uart_ops实现

        Linux收发数据都是通过ops函数实现的。

        ops是uart_ops类型的结构体指针变量。是和寄存器打交道的。

二、I.MX6U UART驱动分析

1、UART的platform驱动框架

        imx_uart_devtype为传统匹配表。

        static const struct of_device_id imx_uart_dt_ids[]为设备树所使用的匹配表。

        platform 驱动框架结构体 serial_imx_driver。

2、uart_driver初始化

        在 imx_serial_init 函数中向 Linux 内核注册了 imx_reg, imx_reg 就是 uart_driver 类型的结
构体变量。

3、uart_port初始化与添加

        当 UART 设备和驱动匹配成功以后 serial_imx_probe 函数就会执行,此函数的重点工作就
初始化 uart_port,然后将其添加到对应的 uart_driver 中。

4、imx_pops结构体变量

        imx_pops 就是 uart_ops 类型的结构体变量,保存了 I.MX6ULL 串口最底层的操作函数.都是和寄存器打交道的。

三、硬件原理图分析

 1、RS232原理图

2、RS485原理图

        RO 为数据输出端, RI 为数据输入端, RE 是接收使能信号(低电平有效), DE 是发送使能信号(高电平有效)。

3、GPS原理图

四、RS232驱动编写

        NXP已经将驱动写好了,开发者只需要添加对应的uart3节点即可。

1、UART IO节点创建

        参考已有的uart1节点,创建uart3节点:

1 pinctrl_uart3: uart3grp {
2 fsl,pins = <
3 MX6UL_PAD_UART3_TX_DATA__UART3_DCE_TX 0X1b0b1
4 MX6UL_PAD_UART3_RX_DATA__UART3_DCE_RX 0X1b0b1
5 >;
6 };

2、添加uart3节点

1 &uart3 {
2 pinctrl-names = "default";
3 pinctrl-0 = <&pinctrl_uart3>;
4 status = "okay";
5 };

五、移植minicom

        minicom类似于串口调试助手,是Linux下很常用的一个串口工具。

1、移植ncurses

        移植minicom前,需要先移植ncurses。因为minicom会用到ncurses.

2、移植minicom

        移植minicom完成后,输入minicom -s命令,如果打开失败的话。新建/etc/passwd 文件,然后在 passwd 文件里面输入如下所示内容:

1 root:x:0:0:root:/root:/bin/sh

        之后一定记得重启开发板。

六、RS232驱动测试

1、RS232连接设置

        JP1跳线帽   USB转串口线连接

2、minicom设置

        回显功能配置项为“ local Echo on/off..E”,按键E打开或关闭回显功能。

3、RS232收发测试

1)、发送测试

        minicom输入需要传输信息内容,在电脑端的SecureCRT会收到该信息内容。前提是需要打开minicom的回显功能。

2)、接收测试

        同样,通过Secure CRT发送信息内容,在minicom界面能收到该信息内容。同样需要提前打开Secure CRT的回显功能。

七、RS485测试

1、RS485连接设置

        一个设备是不能测试通信功能的,需要另外一个设备才行。

        三合一串口转换器

2、RS485收发测试

        485的测试和232一样。

1)、RS485发送测试

2)、RS485接收测试

八、GPS测试

1、GPS连接设置

        minicom设置如下:

①、波特率设置为 38400,因为正点原子的 ATK1218-BD 模块默认波特率就是 38400。
②、 8 位数据位, 1 位停止位。
③、关闭硬件和软件流控。

2、GPS数据接收测试

        minicom界面显示接收数据。


本文为参考正点原子开发板配套教程整理而得,仅用于学习交流使用,不得用于商业用途。

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

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

相关文章

Ubuntu18.04平台下Qt开发程序打包的一些问题总结

目录 前言 一、在Ubuntu18.04开发环境下打包有两种方式 1、利用linuxdeployqt软件进行打包 2、利用编写shell脚本的方式进行打包 二、详细介绍shell脚本打包的方式 1、新建一个空的文件夹 2、准备脚本copylib.sh 3、准备脚本xxxx.sh。 4、给上述两个脚本添加可执行权限…

Behave介绍和快速示例

Behave是一个用于行为驱动开发 (Behavior-Driven Development, BDD) 的 Python 库。使用 Behave&#xff0c;可以编写自然语言格式的使用场景来描述软件的行为&#xff0c;然后用 Python 实现这些场景下的步骤&#xff0c;形成可直接运行的测试。 Behave的目标是帮助用户、开发…

【Machine Learning in R - Next Generation • mlr3】

本篇主要介绍mlr3包的基本使用。 一个简单的机器学习流程在mlr3中可被分解为以下几个部分&#xff1a; 创建任务 比如回归、分裂、生存分析、降维、密度任务等等挑选学习器&#xff08;算法/模型&#xff09; 比如随机森林、决策树、SVM、KNN等等训练和预测 创建任务 本次示…

JVM——类加载器(JDK8及之前,双亲委派机制)

目录 1.类加载器的分类1.实现方式分类1.虚拟机底层实现2.JDK中默认提供或者自定义 2.类加载器的分类-启动类加载器3.类加载器的分类-Java中的默认类加载器4.类加载器的分类-扩展类加载器5.类加载器的分类-类加载器的继承 2.类加载器的双亲委派机制 类加载器&#xff08;ClassLo…

Vue3.3 + Vite4.3 + TypeScript5+ Element-Plus:从零到一构建企业级后台管理系统(前后端开源)

vue3-element-admin 是基于 vue-element-admin 升级的 Vue3 Element Plus 版本的后台管理前端解决方案&#xff0c;技术栈为 Vue3 Vite4 TypeScript Element Plus Pinia Vue Router 等当前主流框架。 相较于其他管理前端框架&#xff0c;vue3-element-admin 的优势在于一…

笔记本配USB拓展坞网卡经常时不时掉线

ThinkPad X1 Carbon大概是2015年的老笔记本,自己买的USB3.0拓展坞(带网卡)的,我的笔记本不带网卡, 使用网线时不时右下角显网络掉线 , 就掉了,各种排查排除,不是线,路由器,拓展坞问题,最后更新拓展坞网卡芯片驱动,解决问题.下面是步骤: 搜索关键字:Realtek USB GbE Family Cont…

OpenCV必知必会基础3(包括色彩空间的变换、ROI、OpenCV中最重要的结构体Mat以及获取图像的属性)

文章目录 OpenCV的色彩空间——RGB与BGROpenCV的色彩空间——HSV与HSLHSV主要用于OpenCV中HSL OpenCV色彩空间转换YUV主要用于视频中题目 图像操作的基石Numpy【基础操作】np.arraynp.zerosnp.onesnp.fullnp.identitynp.eye Numpy基本操作之矩阵的检索与赋值Numpy基本操作三——…

c# - - - Application.StartupPath(程序安装目录)和Environment.CurrentDirectory(程序工作目录)

Application.StartupPath 应用程序的安装目录&#xff0c;不会改变。 在C:\Users\Administrator\source\repos\ConsoleApp6\bin\Debug目录中&#xff0c;运行ConsoleApp6.exe。 安装目录为&#xff1a;C:\Users\Administrator\source\repos\ConsoleApp6\bin\Debug 在C:\Users…

Git相关: 拉取、git push提交 过程遇到的错误

目录 解决git push报错error: RPC failed; HTTP 413 curl 22 关于这个问题&#xff0c;其实千万别用gitlab,因为你怎么推送 也不可能把几G的文件推上去。 error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 se 解决git push报错error: RPC failed;…

【外汇天眼】解析外汇交易平台:深度了解DD与NDD两大模式

外汇交易平台种类繁多&#xff0c;涵盖不同的分类与运营模式&#xff0c;令投资者难以甄别&#xff0c;也增加了选择的难度。为了解决这一问题&#xff0c;我们将更深入地了解外汇平台的多样性。 在线外汇交易平台主要分为两大类&#xff1a;处理平台模式&#xff08;Dealing …

springcloud仓库管理系统源码

开发技术&#xff1a; jdk1.8&#xff0c;mysql5.7&#xff0c;idea&#xff0c;nodejs&#xff0c;vscode springcloud springboot mybatis vue elementui 功能介绍&#xff1a; 统计分析&#xff1a;查看产品&#xff0c;销售数量&#xff1b;统计近7日出入库统计 客户管…

RHCE8 资料整理(六)

RHCE8 资料整理 第 6 篇 软件管理第 23 章 用rpm管理软件23.1 rpm查询23.2 rpm卸载23.3 软件包升级23.4 rpm验证 第 24 章 用yum/dnf管理软件包24.1 yum架构介绍24.2 用光盘搭建yum源24.3 创建私有仓库24.4 yum客户端配置24.5 yum基本使用24.5.1 查询24.5.2 安装与卸载24.5.3 下…

ETL数据转换工具类型与适用场景

ETL数据转换工具在企业数据管理中扮演着重要的角色&#xff0c;能够帮助企业从多个数据源中提取、转换和加载数据&#xff0c;实现数据整合和分析。以下是针对Kettle、DataX和ETLCloud这几个工具的详细介绍及其适用场景。 Kettle&#xff08;Pentaho Data Integration&#xf…

提高生存能力的7个关键技巧!

作为一款备受热议和玩家喜爱的多人在线射击游戏&#xff0c;《绝地求生》中生存能力的提高是取得胜利的关键。在这篇实用干货分享中&#xff0c;我们将详细说明7个关键技巧&#xff0c;帮助你在游戏中提高生存能力&#xff0c;获得更多胜利。 1.选择降落点&#xff1a;选择适合…

【Azure 架构师学习笔记】-Azure Storage Account(6)- File Layer

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Storage Account】系列。 接上文 【Azure 架构师学习笔记】-Azure Storage Account&#xff08;5&#xff09;- Data Lake layers 前言 上一文介绍了存储帐户的概述&#xff0c;还有container的一些配置&#xff0c;在…

【C++】深拷贝与浅拷贝

1、深拷贝与浅拷贝 当我们对复杂类型(结构体或者类)的对象进行初始化时&#xff0c;如果将同类型的对象A赋值给同类型的对象B&#xff0c;此时就涉及深拷贝和浅拷贝的问题。 浅拷贝&#xff1a;简单的赋值拷贝操作。把类/结构体的对象的属性原封不动的赋值给另一个同类型的对…

数据库进阶教学——索引

目录 一、索引概述 1、介绍 2、演示 3、优缺点 二、索引结构 1、B树 2、Hash 三、索引分类 四、索引语法 1、语法 2、示例 五、SQL性能分析 1、SQL执行频率 2、慢查询日志 3、profile详情 4、explain执行计划 六、索引使用 七、索引设计原则 一、索引概述 …

【android】install android NDK

目录 1 下载NDK 2 解压 3 android-ndk的配置 1 下载NDK 下载网址&#xff1a;NDK 下载 | Android NDK | Android Developers 如果没有所需要的版本&#xff0c;则点击页面下面 不受支持的 NDK 下载需要的版本。 2 解压 将压缩文件&#xff08;例如 android-ndk-r25c-…

Hoppscotch:开源 API 开发工具,快捷实用 | 开源日报 No.77

hoppscotch/hoppscotch Stars: 56.1k License: MIT Hoppscotch 是一个开源的 API 开发生态系统&#xff0c;主要功能包括发送请求和获取实时响应。该项目具有以下核心优势&#xff1a; 轻量级&#xff1a;采用简约的 UI 设计。快速&#xff1a;实时发送请求并获得响应。支持多…

【机器学习基础】多元线性回归(适合初学者的保姆级文章)

&#x1f680;个人主页&#xff1a;为梦而生~ 关注我一起学习吧&#xff01; &#x1f4a1;专栏&#xff1a;机器学习 欢迎订阅&#xff01;后面的内容会越来越有意思~ &#x1f4a1;往期推荐&#xff1a; 【机器学习基础】机器学习入门&#xff08;1&#xff09; 【机器学习基…