UART通信详解基于IMX6ULL实现

目录

2.1串口连接

2.2工作原理||数据通讯格式

2.2.1起始位

2.2.2数据位

2.2.3奇偶校验位

2.2.4停止位

2.2.5协议层

2.2.6波特率

2.2.7数据校验

2.3传输步骤

2.4IMX6ULL驱动开发-基于UART框架发送/接收串口数据

2.4.1在设备树中添加uart3子节点

2.4.2编写串口测试程序

2.5优缺点


UART(Universal Asynchronous Receiver/Transmitter)通用异步接收器/发送器,通常称为UART,是一种广泛应用于嵌入式领域的串行异步、全双工通信协议。

2.1串口连接

UART 通道有两条数据线。每个设备上都有一个 RX 引脚和一个 TX 引脚(RX 用于接收,TX 用于发送)。每个设备的 RX 引脚都连接到另一个设备的 TX 引脚。

UART属于异步通信,没有时钟信号。它会在数据包中增加开始和停止位。这些位定义了数据包的开始和结束,因此接收UART知道何时读取这些数据。 当接收UART检测到起始位时,它将以特定的波特率的频率读取(数据传输速度的度量),以每秒比特数(bps)表示。两个UART必须以大约相同的波特率工作,发送的接收UART之间的波特率只能相差约10%。

img

2.2工作原理||数据通讯格式

img

2.2.1起始位

img

每次通信开始时,发送方发送一个逻辑“0”信号(VOL),表示传输字符的开始。由于总线空闲时为高电平,因此在开始通信时先发送一个与空闲状态明显不同的信号,即(低位 0)。

2.2.2数据位

img

起始位之后是我们要传输的数据。数据位可以是5、6、7、8、9位等组成一个字符(通常是8位)。如ASCII码(7位)、扩展BCD码(8位)。首先发送最低位(个位),最后发送最高位。用低电平 表示“0”,高电平表示“1”,完成数据位的传输

2.2.3奇偶校验位

img

将该位添加到数据位后,“1”位的个数应为偶数(偶校验)或奇数(奇校验),以验证数据传输的正确性。校验位实际上就是调整数,串口校验分为几种方式:

无奇偶校验

奇校验:如果数据位中“1”的个数为偶数,则奇偶校验位为“1”,如果“1”的个数为奇数,则奇偶校验位为“0”。

偶校验:如果数据中“1”的个数为偶数,则奇偶校验位为“0”,如果数据中“1”的个数为奇数,则奇偶校验位为“1”。

标记奇偶校验:校验位始终为1(不常用)。

奇偶校验:奇偶校验位始终为0(不常用)

2.2.4停止位

img

它是字符数据的结束标记。它可以是 1 位、1.5 位或 2 位 VOH。由于数据在传输线上是定时的,并且每个设备都有自己的时钟,所以在通信时两个设备之间很可能会出现小的不同步。因此停止位不仅表示传输的结束,而且还为计算机提供了纠正时钟的机会。停止位越多,数据传输越稳定,但数据传输速度越慢。

2.2.5协议层

在协议层中,规定了数据包的内容,由起始位、主要数据、校验位和停止位组成。双方的数据包格式必须约定一致,才能正常发送和接收数据。

2.2.6波特率

由于异步通信中没有时钟信号,因此两个通信设备需要就波特率达成一致。常见的有4800、9600、115200等。

img

通讯起始和停止信号:串行通讯的数据包从起始信号开始,以停止信号结束。数据包的起始信号用逻辑0的数据位表示,数据包的停止信号可以用0.5、1、1.5或2个逻辑1的数据位表示,只要双方同意即可。

2.2.7数据校验

有效数据后有一个可选的数据校验位。由于数据通信比较容易受到外界干扰,导致传输数据出现倾斜,可以在传输过程中添加校验位来解决这个问题。校验方式有奇校验、偶校验、0校验(空格)、1校验(标记)、无奇偶校验。

奇校验要求有效数据和奇偶校验位中“1”的数量为奇数。

例如,8位有效数据为01101001,共有4个“1”。如果校验位为“1”,则最后发送的数据为8位有效数据加1位校验位,共9位。偶校验和奇校验的要求正好相反。要求帧数据中“1”的个数和奇偶校验位均为偶数,如数据帧:11001010,此时数据帧中“1”的个数为4个,因此偶校验位为“0”(偶数)。0校验表示无论有效数据的内容是什么,校验位始终为“0”,1校验表示校验位始终为“1”。

2.3传输步骤

1.发送UART从数据总线并行接收数据 screen-capture

2.发送UART将起始位、奇偶校验位和停止位添加到数据帧。

screen-capture

3.整个数据包从发送UART串行发送到接收UART。接收UART以预先配置的波特率对数据线进行采样。 screen-capture

4.接收UART丢弃数据帧中的起始位、奇偶校验位和停止位: screen-capture

5.接收UART将串行数据转换回并行数据,并将其传输到接收端的数据总线: screen-capture

2.4IMX6ULL驱动开发-基于UART框架发送/接收串口数据

2.4.1在设备树中添加uart3子节点

1)设置UART3引脚

在iomucx节点中添加uart3子节点:

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

检查一下这两个引脚是否被使用

已经被uart2用作rts和cts引脚,直接注释掉:

2)添加uart3节点

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

3)测试是否生成设备文件

重新编译设备树

make dtbs

使用新的设备树启动,查看是否生成对应的串口设备文件:

可以看到,系统已经有ttymxc2这个串口设备口,对应UART3,应用程序可以通过访问此设备实现对UART3的操作。

2.4.2编写串口测试程序
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdint.h>
#include <termios.h>
#include <string.h>int uart_setup(int fd)
{struct termios newtio;// 获取原有串口配置if  (tcgetattr(fd, &newtio) < 0) {return -1;}// 修改控制模式,保证程序不会占用串口newtio.c_cflag  |=  CLOCAL;// 修改控制模式,能够从串口读取数据newtio.c_cflag  |=  CREAD;// 不使用流控制newtio.c_cflag &= ~CRTSCTS;// 设置数据位newtio.c_cflag &= ~CSIZE;newtio.c_cflag |= CS8;// 设置奇偶校验位newtio.c_cflag &= ~PARENB;newtio.c_iflag &= ~INPCK; // 设置停止位newtio.c_cflag &= ~CSTOPB;// 设置最少字符和等待时间newtio.c_cc[VTIME]  = 1;newtio.c_cc[VMIN] = 1;// 修改输出模式,原始数据输出newtio.c_oflag &= ~OPOST;newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);// 设置波特率cfsetispeed(&newtio, B115200); cfsetospeed(&newtio, B115200);// 清空终端未完成的数据tcflush(fd,TCIFLUSH);// 设置新属性if(tcsetattr(fd, TCSANOW, &newtio) < 0) {return -1;}return 0;
}int uart_send(int fd, char *buf, int len)
{int count;count = write(fd, buf, len);return count == len ? len : -1;
}int main(int argc, char *argv[])
{int fd;int ret;int count = 100;char send_buf[] = "Hello World!\r\n";if (argc != 2) {printf("usage: ./test_uart [device]\n");return -1;}/* 打开串口 */fd = open(argv[1], O_RDWR | O_NOCTTY | O_NDELAY);if (fd < 0) {printf("open dev fail!\n");return -1;}/* 设置串口 */ret = uart_setup(fd);if (ret < 0) {printf("uart setup fail!\n");close(fd);return -1;}while (count--) {ret = uart_send(fd, send_buf, strlen(send_buf));if (ret < 0) {printf("send fail!\n");} else {printf("send ok!\n");}sleep(2);}close(fd);
}

编译:

arm-linux-gnueabihf-gcc test_uart.c -o test_uart

运行:

./test_uart /dev/ttymxc2

再看看另一侧的串口终端是否收到数据:

2.5优缺点

优点: 1.仅使用两根线 2.异步通信,无需时钟信号 3.具有奇偶校验位以允许进行错误检查、 4.只要双方都设置好数据包的结构 缺点: 1.数据帧的大小最大为9位 2.不支持多个从属系统或多个系统 3.每个UART的波特率必须在彼此的10%之内

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

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

相关文章

Java运行时数据区

JVM主要流程包括三部分&#xff1a; 首先是 ClassLoard 类加载器&#xff0c;加载数据源文件到jvm当中然后将加载好的数据存放在运行时数据区最后由引擎进行解释和编译的工作 1.Java 内存区域&#xff1a; 1.1 程序计数器 程序计数器&#xff08;Program Counter Register&a…

Vue 响应式渲染 - 条件渲染

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue响应式渲染 - 条件渲染 目录 条件渲染 v-if v-if-else 模版template 物流状态显示判断 设置数据 不同状态渲染 总结 条件渲染 v-if 使用Vue条件判断显示和 隐藏。 示例如下&#xff1a; <!DOCTYPE html> …

如何利用DeepSeek挖掘龙头股

如何利用DeepSeek挖掘龙头股&#xff0c;当我们输入这样的问题&#xff0c;看看DeepSeek是如何归纳总结的。所以你会了吗&#xff1f;

寒假2.8

题解 web&#xff1a;[RoarCTF 2019]Easy Calc 打开&#xff0c;是一个计算界面 看一下源代码&#xff0c;提示设置了WAF&#xff0c;并且有一个calc.php文件 访问一下calc.php文件&#xff0c;得到源码&#xff0c;使用get方式传参赋值给num&#xff0c;设置了黑名单&#x…

表单与交互:HTML表单标签全面解析

目录 前言 一.HTML表单的基本结构 基本结构 示例 二.常用表单控件 文本输入框 选择控件 文件上传 按钮 综合案例 三.标签的作用 四.注意事项 前言 HTML&#xff08;超文本标记语言&#xff09;是构建网页的基础&#xff0c;其中表单&#xff08;<form>&…

UE5导入模型报错:多边形退化

解决方案&#xff1a;取消勾选Remove Degenerates

Leetcode—1474. 删除链表 M 个节点之后的 N 个节点【简单】Plus

2025每日刷题&#xff08;212&#xff09; Leetcode—1474. 删除链表 M 个节点之后的 N 个节点 实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x…

OpenGL学习笔记(十二):初级光照:投光物/多光源(平行光、点光源、聚光)

文章目录 平行光点光源聚光多光源 现实世界中&#xff0c;我们有很多种类的光照&#xff0c;每种的表现都不同。将光投射(Cast)到物体的光源叫做投光物(Light Caster)。 平行光/定向光(Directional Light)点光源(Point Light)聚光(Spotlight) 平行光 当一个光源处于很远的地…

整合ES(Elasticsearch)+MQ(RabbitMQ)实现商品上下架/跨模块远程调用

商品上下架过程中&#xff0c;修改数据库表上下架状态&#xff0c;之后通过RabbitMQ发送消息&#xff0c;最终实现ES中数据同步 nacos服务发现和注册ES面向文档型数据库RabbitMQ ES 用户将数据提交到Elasticsearch数据库中通过分词控制器将对应的语句分词将其权重和分词结果一…

软件模拟I2C案例(寄存器实现)

引言 在经过前面对I2C基础知识的理解&#xff0c;对支持I2C通讯的EEPROM芯片M24C02的简单介绍以及涉及到的时序操作做了整理。接下来&#xff0c;我们就正式进入该案例的实现环节了。本次案例是基于寄存器开发方式通过软件模拟I2C通讯协议&#xff0c;然后去实现相关的需求。 阅…

爬虫技巧汇总

一、UA大列表 USER_AGENT_LIST 是一个包含多个用户代理字符串的列表&#xff0c;用于模拟不同浏览器和设备的请求。以下是一些常见的用户代理字符串&#xff1a; USER_AGENT_LIST [Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; Hot Lingo 2.0),Mozilla…

35~37.ppt

目录 35.张秘书-《会计行业中长期人才发展规划》 题目​ 解析 36.颐和园公园&#xff08;25张PPT) 题目​ 解析 37.颐和园公园&#xff08;22张PPT) 题目 解析 35.张秘书-《会计行业中长期人才发展规划》 题目 解析 插入自定义的幻灯片&#xff1a;新建幻灯片→重用…

【Android开发AI实战】基于CNN混合YOLOV实现多车牌颜色区分且针对车牌进行矫正识别(含源码)

文章目录 引言单层卷积神经网络&#xff08;Single-layer CNN&#xff09;&#x1f4cc; 单层 CNN 的基本结构&#x1f4cc; 单层 CNN 计算流程图像 透视变换矫正车牌c实现&#x1fa84;关键代码实现&#xff1a;&#x1fa84;crnn结构图 使用jni实现高级Android开发&#x1f3…

DeepSeek Window本地私有化部署

前言 最近大火的国产AI大模型Deepseek大家应该都不陌生。除了在手机上安装APP或通过官网在线体验&#xff0c;其实我们完全可以在Windows电脑上进行本地部署&#xff0c;从而带来更加便捷的使用体验。 之前也提到过&#xff0c;本地部署AI模型有很多好处&#xff0c;比如&…

STM32G474--Whetstone程序移植(单精度)笔记

1 准备基本工程代码 参考这篇笔记从我的仓库中选择合适的基本工程&#xff0c;进行程序移植。这里我用的是stm32g474的基本工程。 使用git clone一个指定文件或者目录 2 移植程序 2.1 修改Whetstone.c 主要修改原本变量定义的类型&#xff0c;以及函数接口全部更换为单精度…

【专题】2024-2025人工智能代理深度剖析:GenAI 前沿、LangChain 现状及演进影响与发展趋势报告汇总PDF洞察(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p39630 在科技飞速发展的当下&#xff0c;人工智能代理正经历着深刻的变革&#xff0c;其能力演变已然成为重塑各行业格局的关键力量。从早期简单的规则执行&#xff0c;到如今复杂的自主决策与多智能体协作&#xff0c;人工智能代理…

QT修仙之路1-1--遇见QT

文章目录 遇见QT二、QT概述2.1 定义与功能2.2 跨平台特性2.3 优点汇总 三、软件安装四、QT工具介绍(重要)4.1 Assistant4.2 Designer4.3 uic.exe4.4 moc.exe4.5 rcc.exe4.6 qmake4.7 QTcreater 五、QT工程项目解析(作业)5.1 配置文件&#xff08;.pro&#xff09;5.2 头文件&am…

Linux——基础命令1

$&#xff1a;普通用户 #&#xff1a;超级用户 cd 切换目录 cd 目录 &#xff08;进入目录&#xff09; cd ../ &#xff08;返回上一级目录&#xff09; cd ~ &#xff08;切换到当前用户的家目录&#xff09; cd - &#xff08;返回上次目录&#xff09; pwd 输出当前目录…

Office/WPS接入DeepSeek等多个AI工具,开启办公新模式!

在现代职场中&#xff0c;Office办公套件已成为工作和学习的必备工具&#xff0c;其功能强大但复杂&#xff0c;熟练掌握需要系统的学习。为了简化操作&#xff0c;使每个人都能轻松使用各种功能&#xff0c;市场上涌现出各类办公插件。这些插件不仅提升了用户体验&#xff0c;…

【提示词工程】探索大语言模型的参数设置:优化提示词交互的技巧

在与大语言模型(Large Language Model, LLM)进行交互时,提示词的设计和参数设置直接影响生成内容的质量和效果。无论是通过 API 调用还是直接使用模型,掌握模型的参数配置方法都至关重要。本文将为您详细解析常见的参数设置及其应用场景,帮助您更高效地利用大语言模型。 …