我面试的时候一般喜欢问应聘者一个问题:UART与RS232/RS485的区别与联系?很多人对于这个问题答得都不是很好。还有些人压根就没有想过这个问题,一直认为他们是同一个东西,就是咱们俗称的串口。

我刚入嵌入式的大门时,对这个问题也困惑过很久,后来终于弄明白了。跟大家一起分享一下吧。

简单来说,区别在于UART是一种接口,而RS232/RS485是一种总线。UART这个接口,后面可以接TTL电平,这就是我们俗称的普通的串口。而UART如果接了RS232/RS485的转换芯片,那么后面的总线上就是按照RS232/RS485规则来传输数据。RS232/RS485总线的具体规则我们后续再讨论,本篇主要详解TTL下的情况。UART接TTL电平时,+5V等价于逻辑“1”,0V等价于逻辑“0”。

如下例子主要说明一下UART接TTL电平这种方式是怎么传输二进制数据的。这是我在项目中的一个例子,用STM32F429的Uart4口采集TOF模块测量得到的距离信息。

UART的Rx连接测距模块TOF的Tx。TOF向UART发送了0x32 0x33 0x6d 0x6d 0x0a 五个字节,对应的ASCII码是23mm,表示测到的距离。

0x32 0x33 0x6d 0x6d 0x0a 对应的示波器上测到波形如下所示,我们来一起分析一下。

首先,UART的波特率,配置的是9600。对于串口来说,波特率=比特率,所以串口现在比特率为9600,所以每一个bit需要的时间为100us。所以示波器抓的波形对应的比特流是:

00100110010110011001010110110101011011010010100001

对于Uart,我配置的代码如下:

USART_InitStructure.USART_BaudRate = UART4_BAUD; //9600

USART_InitStructure.USART_WordLength = USART_WordLength_8b;

USART_InitStructure.USART_StopBits = USART_StopBits_1;

USART_InitStructure.USART_Parity = USART_Parity_No ;

USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

USART_Init(UART4, &USART_InitStructure);

所以Uart的数据位宽为8bit,再加上起始位0,结束为1.所以比特流分割为如下:

0  0100 1100  1

0  1100 1100  1

0  1011 0110  1

0  1011 0110  1

0  0101 0000  1

考虑硬件总线上的数据时序,CPU接收到后的比特序列颠倒:

0100 1100 颠倒为  0011 0010  即为0x32

1100 1100 颠倒为  0011 0011  即为0x33

1011 0110 颠倒为  0110 1101  即为0x6d

1011 0110 颠倒为  0110 1101  即为0x6d

0101 0000 颠倒为  0000 1010  即为0x0a

完美! 发送的0x32 0x33 0x6d 0x6d 0x0a 字节与示波器上测量到的高低电平信号完美相符。

作为嵌入式软件工程师,对软硬件的接口分析到这种程度,一般情况下,就够用了。

-----------------------------上善若水,大智若愚-----------------------------------

Uart接口的详细解释相关推荐

  1. HttpEntity接口的详细解释与应用

    爬虫之对接口HttpEntity的解释(二) 前言 之前写了一些关于如何使用HttpClient包基本功能HttpGet与HttpPost.在其中提到了HttpEntity接口.这篇文章是对HttpE ...

  2. Uart接口TTL电平详解

    Uart接口的详细解释 我面试的时候一般喜欢问应聘者一个问题:UART与RS232/RS485的区别与联系?很多人对于这个问题答得都不是很好.还有些人压根就没有想过这个问题,一直认为他们是同一个东西, ...

  3. UART接口的FPGA实现(二)——UART接口的Verilog代码实现以及仿真测试

    废话不多说,先上源代码链接和testbench的链接,推荐使用UE查看源代码,UE中的VHDL语法.Verilog语法和SystemVerilog语法高亮文件的下载链接在这里.上篇的最后给出了本篇所附 ...

  4. Python __name__ == ‘__main__’详细解释-Python零基础入门教程

    目录 一.简介 1.__name__ 2.'__main__' 3.__name__ == '__main__' 二.作用 三.猜你喜欢 ​ 零基础 Python 学习路线推荐 : Python 学习 ...

  5. python鸭制作类代码_详细解释ducktyping鸭子类型程序设计与Python的实现

    在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格.在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定. 这个概念的名字来源 ...

  6. MTK 驱动 (70)---MTK Projiectconfig.mk文件详细解释

    MTK Projiectconfig.mk文件详细解释 AUTO_ADD_GLOBAL_DEFINE_BY_NAME AUTO_ADD_GLOBAL_DEFINE_BY_VALUE AUTO_ADD_ ...

  7. Spring中IOC和AOP的详细解释(转)

    原文链接:Spring中IOC和AOP的详细解释 我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入,和AOP,面向切面编程,这两个是Spring的灵魂. 主要用到的设计模式有工厂 ...

  8. Linux UART接口调试技巧

    在嵌入式项目中,UART接口的使用频率很高,多种模块(2G通信模组.蓝牙模块,等等)都会通过UART接口与主控MCU相连.本文将梳理UART接口调试流程,为调试工作提供参考,解决调试过程中可能遇到的问 ...

  9. php.ini配置文件中文详细解释

    php.ini配置文件中文详细解释 ;;;;;;;;;;; ; 警告 ; ;;;;;;;;;;; ; 此配置文件是对于新安装的PHP的默认设置. ;  ; 此配置针对开发目的,并且*不是*针对生产环境 ...

最新文章

  1. P4722 【模板】最大流
  2. 存储引擎之必知必会 -- 检查点机制
  3. Boost:iostream客户端的测试程序
  4. maven编译项目时提示:cached in the local repository
  5. 软件测试方法之白盒测试与黑盒测试
  6. Mysql的int和bigint字段类型,映射到Java的Integer和Long类型时,勾选UNSIGNED无符号会导致越界转换。
  7. win+ubuntu系统引导修复
  8. 树莓派开发笔记(七):GPIO口的SPI使用(BME280三合一传感器:测量温度、湿度、气压、海拔高度)
  9. 设计模式:委托和代理
  10. CRMEB小程序商城v4.0二次开发对接集成阿里云短信
  11. CSS(定位、淘宝轮播图案例、网页布局总结、元素的显示和隐藏、鼠标经过显示遮罩)
  12. 女生学大数据好还是计算机好?都适合女生吗?就业前景好吗?
  13. Anima2D动画简单理解
  14. 一个计算机专业学生几年的Java编程经验汇总
  15. Android 手势操作GestureDetector
  16. 如何使用京东的关键字搜索你想要的商品详情
  17. 程序人生 - 二手房能延期过户吗?
  18. 析取 为什么是并集 合取
  19. jquery-美女相册案例
  20. TP5使用pgsql报错“没有匹配指定名称和参数类型的函数. 您也许需要增加明确的类型转换”的解决办法

热门文章

  1. Dockerfile构建nginx镜像
  2. linux系列(十六):which命令
  3. 预留创建时检查增强点:nbsp;MB_RE…
  4. myeclipse 8.5-9.0 安装 svn 方法 《转载》
  5. kali linux 设置固定IP地址步骤
  6. XSSFORK:新一代XSS自动扫描测试工具(精)
  7. Swift之深入解析基于闭包的类型擦除
  8. 选择最好用的PyCharm IDE
  9. Stark 组件:快速开发神器 —— 页面显示
  10. 历届试题 打印十字图