0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

UART传输的数据被封装成数据包

电子设计 来源:电子设计 作者:电子设计 2022-02-21 11:17 次阅读

介绍UART

最早的串行通讯设备可以追溯到电报机,它使用长度可变的脉冲信号进行数据传输。要说早期的芯片级UART,不得不提一下DEC,该公司的PDP系列计算机用上了第一个UART。当时的UART的线路占据了整个电路板,体积巨大!可以联想一下早期计算机的样子,如下图。

如今PC机上的串口早已被USB取代,对RS-232(也称标准串口)有需求的用户通常使用USB转串口线,这里常见的有CH340串口驱动程序。在UART通信中,两个UART直接通信。

发送端的UART将来自控制设备(如CPU)的并行数据转换为串行数据,以串行方式将其发送到接收端的UART,然后由接收端的UART将串行数据转换为并行数据以用于接收设备的正常处理。这里只需要两条线RX/TX即可在两个UART之间传输数据,如下图所示。

UART传输的数据被封装成数据包。每个数据包包含1个起始位,5~9个数据位(取决于UART的具体设置),一个可选的奇偶校验位以及1个或2个停止位,如下图所示。

起始位

UART数据传输线通常在不传输数据时保持在高电平。为了开始数据传输,发送端UART在一个时钟周期内将传输线从高电平拉低到低电平。当接收端UART检测到高电压到低电压转换时,它开始以波特率的频率读取数据位中的每一位数据。

数据

数据位包含正在传输的实际数据。如果使用奇偶校验位,则可以是5位,最多8位。如果不使用奇偶校验位,则数据帧的长度可以为9位。在大多数情况下,数据首先以低有效位发送。

校验位

在串口通信中一种简单的检错方式。有四种检错方式:

偶校验

奇校验

高校验

低校验

对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。

停止位

发送端UART将数据传输线从低电压驱动到高电压至少持续两位数据的时间宽度来表示整个数据包的传输已经结束。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容错性越好,但是数据传输率同时也越慢。

波特率

波特率是串口数据的传输速度,即Bit/s,常见的波特率比如:9600,19200,38400,57600,115200等。假设目前UART的配置为,1个起始位,8个数据位,0个校验位,1个停止位,那么9600的波特率,可以计算出每一位数据的时间宽度为:

o4YBAGAHxKWADljhAAAQjK6T-sg963.png

那么传输一个字节(也就是10 bit 数据)需要的时间为 1.04 毫秒。

UART传输过程

①发送端UART从数据总线转换并行数据。

②发送端UART将起始位,奇偶校验位和停止位添加到数据包中,示意图如下。

③整个数据包从发送端UART串行发送到接收端UART,接收端UART按照预先配置好的波特率对数据线进行采样,示意图如下。

④接收端UART解析接收的数据,丢弃数据包中的起始位,奇偶校验位和停止位。

⑤接收UART将串行数据转换回并行数据,并将其传输到接收端的数据总线。

本文转自: STM32嵌入式开发(微信号:c-stm32),作者:acket,转载此文目的在于传递更多信息,版权归原作者所有。

审核编辑:何安

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6001

    文章

    43977

    浏览量

    620862
  • uart
    +关注

    关注

    22

    文章

    1159

    浏览量

    99968
  • 异步串行
    +关注

    关注

    0

    文章

    7

    浏览量

    6601
收藏 人收藏

    评论

    相关推荐

    STM32H7接收数据包异常,一接收的数据出现两发送的内容怎么解决?

    );__HAL_UART_DISABLE_IT( huart1, DMA_IT_HT); 2、发送数据包1
    发表于 03-08 08:05

    STM32H750如何提高数据包大小?

    我使用STM32H750官方的VCP例程,FS模式。 程序默认CDC_DATA_FS_MAX_PACKET_SIZE是64位,我试着修改最大只能到256,如果再大会导致接收不到数据。芯片资料MPSIZ设置范围可以到2047。 我想提高数据包大小应该怎么修改
    发表于 03-07 06:12

    Linux场景下数据包是如何在协议层传输

    所有互联网服务,均依赖于TCP/IP协议栈。懂得数据是如何在协议栈传输的,将会帮助你提升互联网程序的性能和解决TCP相关问题的能力。 我们讲述在Linux场景下数据包是如何在协议层传输
    的头像 发表于 11-11 11:33 779次阅读
    Linux场景下<b class='flag-5'>数据包</b>是如何在协议层<b class='flag-5'>传输</b>的

    UART数据帧与发送器

    数据帧 对于发送设备和接收设备来说,两者的串行通信配置应该设置为完全相同。 起始位:起始位是在实际数据之前添加的同步位。起始位标记数据包的开始。通常,空闲数据线,即当
    的头像 发表于 11-09 17:42 357次阅读

    modbus在通信的过程中如何实现大数据包传输

    modbus在通信的过程中如何实现大数据包传输
    发表于 10-15 12:23

    接收CAN公共汽车上数据包的代码

    应用程序: 这个样本代码接收 CAN 公共汽车上的数据包, 使用协议中断的检测来与 CAN 公共汽车通信的失败率匹配, 并动态调整 M253 CANFD 的失败率 。 BSP 版本:M253系列
    发表于 08-29 06:24

    NUC505如果USB发送一个512Byte的数据包,发送不出去是为什么?

    ] = {0};其中的64应改为512,这是HOST向USB虚拟串口发送大与64字节数据包时发现的。 2. 如果USB发送一个512Byte 的数据包,是发送不出去的。 改正方法: 对于512Byte 的数据包,再补充发送一个0
    发表于 06-16 06:15

    P4080 udp数据包接收乱序是什么原因造成的?

    我们有一个基于 P4080DS 的定制板。我们已经使用 QorIQ Linux SDK 构建了镜像。在我们使用 iperf 测试以太网功能的过程中,我们观察到一些数据包被乱序接收。无序数据包的数量随着带宽的增加而增加。
    发表于 06-06 08:31

    造成UDP数据包丢失的原因?

    芯片时遇到了使用 TCP 的延迟问题,所以我想“我将使用 UDP”。这个想法是我们在网络中,所以数据包丢失应该非常低,如果我在 X 时间内没有收到响应作为备份,我可以处理重新发送数据。 无论如何,我写了
    发表于 06-02 13:46

    ESP8266何时进入传入TCP连接数据包而不接收实际数据

    大家好!对于一个项目,我正在寻找一种方法来查看何时进入传入 TCP 连接数据包而不接收实际数据。我正在尝试从报警面板接收数据,并且在从面板连接后,我需要发送第一个数据包作为回复才能进行
    发表于 05-23 08:24

    esp8266如何接收完整的数据包吗?

    Beacon 数据包,但数据包有问题。 只收到部分数据包。 使用回调:static void sniffer_callback(uint8_t *buffer , uint16_t length
    发表于 05-19 09:58

    求助,是否可以发送deauth数据包

    嗨,大家好!是否可以发送 deauth 数据包?可以用来干扰 WIFI 路由器……讨厌!
    发表于 05-16 08:25

    UDP广播数据包并不总是发送的原因?怎么处理?

    UDP 作为广播工作似乎是一个奇怪的问题: - 始终发送在特定 IP 上发送的 UDP 数据包。工作正常。 - 在广播 IP (xx.xx.xx.255) 上发送的相同 UDP 数据包是随机发送
    发表于 05-10 08:36

    LS1046如何使用iperf3工具测试TCP数据包传输

    LS1046: 我尝试使用iperf3工具测试TCP数据包传输。 找到一些速度为 10Mb/s 的重传。数据包大小为 60 字节。(网络链接为 100Mbps) ethtool notify
    发表于 05-10 08:07