ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

嵌入式:深刻理解UART与USART串口通信的波特率与帧格式

嵌入式:深刻理解UART与USART串口通信的波特率与帧格式 前言文章合集嵌入式系列https://blog.csdn.net/2401_88433210/category_13196870.html?fromshareblogcolumnsharetypeblogcolumnsharerId13196870sharereferPCsharesource2401_88433210sharefromfrom_link文章以STM32F103ZET6芯片为例来介绍建议先看一下这一篇博客了解UART与USART串口通信的特点嵌入式深刻理解UART与USART串口通信的特点-CSDN博客本文以STM32F103ZET6芯片为例介绍了UART通用异步收发器的基本概念和工作原理。UART采用串行异步通信方式通过Tx发送和Rx接收两根数据线实现全双工通信通信双方需交叉连接并共地。文章对比了串行与并行通信的优缺点解释了同步与异步通信的区别并强调UART作为MCU片上外设的重要性。此外还区分了UART与功能更强大的USART支持同步模式说明USART在忽略同步功能时等同于UART。最后指出通信双方必须遵守波特率和帧格式等约定规则才能实现有效数据传输。https://blog.csdn.net/2401_88433210/article/details/163635212?spm1011.2415.3001.10575sharefrommp_manage_link一、MCU 和 USART 设备通信的宏观过程和问题如下图所示使用 USART 进行通信的设备之间用 Tx 和 Rx 交叉相连意思就是一端发送、一端接收。 此处是 MCU 内部的 USART 模块和外部的 USART 设备之间进行通信。宏观数据传输流程如下发送端Tx发送二进制数据‘1’时输出高电平接收端Rx读取到高电平时代表得到二进制数据‘1’发送端Tx发送二进制数据‘0’时输出低电平接收端Rx读取到低电平时代表得到二进制数据‘0’数据会按顺序拆分成一个个的数据位并依次进行发送和接收。示例 (以 MCU 端发送为例)假定 MCU 要传输 1 个字节的数据 0x55二进制序列为0101 0101发送端依次输出以下电平序列高、低、高、低、高、低、高、低接收端依次读取到电平序列高、低、高、低、高、低、高、低就代表接收到了二进制数0101 0101但是上述的通信过程看似可行实则不行主要有以下 2 个问题通信双方发送和接收数据快慢的问题接收端怎么知道发送端什么时间开始或者结束数据发送的一次计划携带多少数据“波特率”和“帧格式”就是为了解决这两个问题。二、波特率与比特率关于对波特率与比特率的理解详见下面一篇博文嵌入式深刻理解比特率与波特率-CSDN博客【比特率与波特率区别摘要】比特率bit/s衡量每秒传输的二进制位数反映有效信息传输速度如千兆宽带1000Mbit/s125MB/s波特率Baud表示每秒传输的码元数量一个码元可携带多比特信息。两者关系为比特率波特率×每码元比特数例4色球系统波特率1Baud时比特率为2bps。注意单位换算差异1Kbit1000bit vs 1KB1024B。https://blog.csdn.net/2401_88433210/article/details/163636836?spm1011.2415.3001.10575sharefrommp_manage_link三、USART 速度与波特率结合之前所讲USART 在串行通信的过程中速度由波特率 (Baud Rate) 决定的USART 是硬件电路所以速度问题重点应该在表示电气过程中的速率上面。后面在使用 USART 的过程中需要我们提前设置好通信双方的波特率进而让双方进行串口通信。单片机的 USART使用的是高低电平两种状态传递的通信方式属于 2 进制码元也就是波特率 比特率所以后面我们能见到很多工具在设置波特率的时候单位用 b/s 也不要觉得奇怪能理解即可。为了进一步理解波特率和速度的关系我们举一个极度极端的例子在比特率 波特率的场景中不考虑什么帧格式1S 内如果全部都是低电平波特率是 10那么就是传递 10 个 0但是如果波特率是 20就会被理解成为 20 个 0。结论一般而言波特率设置的越高单位时间内传递的信息量未来会越大换句话说波特率越高传输速度越快波特率其实是一个个数单位只不过是单位时间的个数 (速度单位)波特率背后的潜在含义单个信号在传输的过程中会持续多长时间比如有一个波特率为 10 的信号那么波特率会决定什么呢除之前的速度问题决定了前面讲的发送高低电平的持续时长❓ 那么未来给 USART 设置波特率我们另一个朴素的理解就是对于发送方你打算多长时间发一个数据持续发多长时间。对于接收方你就是打算多长时间收一个数据持续收多长时间这里的 一个数据就理解成为 1bitUSART 波特率STM32 中USART 一般的常用波特率是 9600 Bd 或者 115200Bd通信双方发送和接收数据快慢的问题可以由通信双方设置相同的波特率来解决四、 USART 帧格式通过设置通信双方的波特率我们已经解决了通信速度的问题。可是对应接收方它怎么知道数据开始发了它怎么知道有多少个数据它怎么知道数据什么时候传递完毕了这就需要通信双方继续约定通信格式了这个格式我们叫做‑帧格式。❓ 注意:帧格式是人约定出来的相当于人让通信设备使用相同的规则通信这个约定的通信格式也可以叫做协议不过在单片机通信领域更喜欢叫做帧格式USART 是异步通信模式有了双方已知的数据帧格式这样接收端才能正确解析数据。如下图所示就是UART 的通信帧格式。组成部分状态 / 电平作用空闲状态 (Idle State)高电平逻辑 1当没有数据传输时通信线保持高电平。起始位 (Start Bit)低电平逻辑 0持续一个位周期bit period通知接收端数据传输开始同步时钟。数据位 (Data Bits)可变实际传输的数据通常为 5 到 9 位最常见的是 8 位数据。低有效位 (LSB) 开头先传输。奇偶校验位 (Parity Bit)可选用于错误检测。如果启用它位于数据位和停止位之间。校验Odd Parity或偶校验Even Parity用于确保传输的个数为奇数或偶数。停止位 (Stop Bit)高电平逻辑 1持续 1、1.5 或 2 个位周期标志数据帧的结束并使接收准备接收下一个起始位。❓ 注意:其中空闲起始位停止位都是必须要有的。数据帧的本质是约定上述表格中最重要的是数据帧由哪些部分组成的约定就是绿色字体部分。而数据位和校验位虽然可变或者可选但是可以完全不用担心因为未来设置数据帧格式的时候通信双方都要设置相同的格式通信双方完全可以自由准确的识别。当然STM32F103 官方手册中数据位通常是其中工作中用的最多的是 8 位数据位1 位校验。1. 空闲状态Idle State在没有数据传输时串口线路应保持逻辑高电平 (其实叫做逻辑 1)也就是空闲状态如通信帧格式中 ① 标识区域所示。❓ 为什么串行通信甚至单片机通信在没有信号的时候默认很多都是处于高电平。而未来 USART 需要用拉低电平表示起始所以 USART 这里默认也是高电平或者说默认是高电平所以起始位就只能用拉低电平来表示了。2. 起始位Start Bit起始位的下降沿1‑0是从空闲状态进入新帧的标志。起始位逻辑低电平 (0)持续 1 个比特位时间具体长度由波特率决定起始位用于告知接收端一个新数据帧的开始这是接收端进行比特位同步的关键信号如通信帧格式中 ② 标识区域所示。3. 数据位Data BitsSTM32 中数据位个数通常可选 8 位或者 9 位最常见的是 8 位一个字节承载实际要传输的信息内容逻辑高 (1) 或逻辑低 ( 0 ) 代表数据位本身。USART 中数据 LSBLeast Significant Bit最低有效位最先发送然后是次低位依此类推最后发送 MSB Most Significant Bit最高有效位。如通信帧格式中 ③ 标识区域所示。。❓ 注意什么是 LSB?LSB是 Least Significant Bit 的缩写意为最低有效位。定义在一个二进制数中LSB 是位于最右边的那个位具有最小的位权示例在二进制数 1011 中最右边的 1 就是 LSB。1 × 2³ 0 × 2² 1 × 2¹ 1 × 2⁰也就是要发送 1011发送顺序是 1 1 0 1先发送低有效位再发高有效位在 USART 中的应用在大多数异步串行通信如 USART、RS‑232中数据通常是从 LSB 开始先传输LSB first。这是为了让接收设备能够更快地开始处理数据而不需要等待整个字节接收完毕。什么是 MSB?MSB是 Most Significant Bit 的缩写意为最高有效位。定义在一个二进制数中MSB 是位于最左边的那个位具有最大的位权。示例在二进制数 1011 中最左边的 1 就是 MSB。1 × 2³ 0 × 2² 1 × 2¹ 1 × 2⁰也就是要发送 1011发送顺序是 1 0 1 1先发送高有效位再发低有效位在 USART 中的应用少数通信协议或系统可能配置为 MSB‑first 传输但不如 LSB‑first 常见。4. 校验位Parity Bit校验位如通信帧格式中 ④ 标识区域所示。校验位是简单的错误检测机制用于检测传输过程中特定数量的比特是否发生了翻转错误可配置的校验类型如下无校验None不发送校验位即无校验。奇校验Odd设置校验位使得数据位和校验位中 1 的总个数为奇数。偶校验Even设置校验位使得数据位和校验位中 1 的总个数为偶数。⭐示例8 位数据奇校验示例假定数据为 “11110000”那么校验位需要设置为 1变成 11110000 1这样就有奇数个‘1’5 个‘1’。假定数据为 “11111110”那么校验位需要设置为 0变成 11111110 0这样还是奇数个‘1’7 个‘1’。奇校验 (Odd Parity) 的核心目的就是确保包括数据位和校验位在内的整个数据包中二进制 1 的总数是奇数个。偶校验示例假定数据为 “11110000”那么校验位需要设置为 0变成 11110000 0这样就有偶数个‘1’4 个‘1’。假定数据为 “11111110”那么校验位需要设置为 1变成 11111110 1这样就有偶数个‘1’8 个‘1’。偶校验 (Even Parity) 的核心目的就是确保包括数据位和校验位在内的整个数据包中二进制 1 的总数是偶数个。⚠注意无论是奇校验还是偶校验都只能检测奇数个比特位翻转错误如1 位、3 位翻转…无法检测偶数个比特翻转错误也无法纠正错误。奇偶校验只能从概率上甄别出部分比特位翻转等错误问题说明 想象我们用偶校验规则一袋苹果必须是偶数个。场景一1 个错误奇数个错误发送方装了 6 个完好的苹果偶数。路上有 1 个苹果坏了。接收方数到 5 个完好的苹果奇数。接收方惊呼“不对应该都是好的偶数个出错了”错误被发现场景二2 个错误偶数个错误发送方装了 6 个完好的苹果偶数。路上同时有 2 个苹果坏了。接收方数到 4 个完好的苹果偶数。接收方满意地说“没错是偶数个好的一切正常。”错误没被发现想象我们用奇校验规则一袋完好的苹果必须是奇数个。场景一1 个错误奇数个错误发送方装了 5 个完好的苹果奇数。路上有 1 个苹果坏了。接收方数到 4 个完好的苹果偶数。接收方惊呼“不对应该是奇数个好的出错了”错误被发现场景二2 个错误偶数个错误发送方装了 5 个完好的苹果奇数。路上同时有 2 个苹果坏了。接收方数到 3 个完好的苹果奇数。接收方满意地说“没错是奇数个好的一切正常。”错误没被发现5. 停止位Stop Bits停止位表示帧的结束固定为逻辑高电平 (1)可以配置为 1 位、1.5 位、2 位停止位结束后会回到空闲状态。如通信帧格式中 ⑤ 标识区域所示。注意这里说的 1 位、1.5 位、2 位是指逻辑高电平1需要保持的时间长度具体多长和波特率有关。问题 1有没有有可能在串口通信的时候把起始位当做数据位不可能因为串口通信的时候起始位数据位校验位有多少个都是双方约定好格式比如通信双方约定拉高的起始位8 位数据位1 位校验位刚开始遇到的第一个拉低位就一定会被接收方判断成为起始位。问题 2有没有有可能在串口通信的时候把数据位当成结束位为什么不可能因为串口通信的时候起始位数据位校验位有多少个都是双方约定好格式比如通信双方约定 1 位拉低的起始位8 位数据位1 位校验位18110如果在没有收到这 10 个 bit 信息的时候是不会有判断结束位逻辑的也就不会把数据位当成结束位。问题 3有没有有可能在串口通信的时候把结束位当成数据位的一部分为什么不可能因为串口通信的时候起始位数据位校验位有多少个都是双方约定好格式比如通信双方约定 1 位拉低的起始位8 位数据位1 位校验位18110也就是固定大小的 10 个比特位只要收完有效数据传输就完成了再收到高电平就判定数据帧结束了不会把结束位当做数据位。问题 4: 为什么结束位需要拉高起始位需要拉低电平表征起始位。如果当前帧传递完毕没有结束位即没有强制拉高电平此时 tx 输出的电平就取决于当前帧的最后一位这个高低电平都有可能。那么传递下一帧它的起始位就不能 100% 有一个拉低的动作会影响下一帧的正确开始。如果当前帧传递完毕必须有结束位即强制拉高电平就保证了在下一帧的起始位到来之前线路上至少有 1 个或 1.5/2 个比特周期的高电平方便下一帧拉低。当然停止位之后如果没有发送下一帧数据线路就会维持高电平恢复默认状态。✨ 让一切具有确定性是 USART 追求的。细节每一帧格式起始位数据位校验位 (可选)停止位都必须要有尤其是起始和结束。发送 5 个 8 位数据时会形成 5 个独立的数据帧Frame。每一帧都必须包含自己的起始位、数据位和停止位。因此发送 5 个 8 位数据确实会有 5 个停止位。 整个传输过程是这样的发送第 1 个数据字节[起始位] [8 个数据位] [停止位]发送第 2 个数据字节[起始位] [8 个数据位] [停止位]发送第 3 个数据字节[起始位] [8 个数据位] [停止位]发送第 4 个数据字节[起始位] [8 个数据位] [停止位]发送第 5 个数据字节[起始位] [8 个数据位] [停止位]如果把停止位看作是每一帧数据的 “结束标志” 或 “句号”那么每发送一个数据都需要画上一个句号以便接收端知道这一帧结束了准备接收下一帧的起始位。它是 UART 通信中最核心的参数之一直接决定了通信双方能否正确解读数据。波特率的单位为 bpsbaud per second例如9600 波特率表示每秒传输 9600 个信号单元。五、USART 帧格式与波特率有了 USART 帧格式和波特率的理解那么我们来算一笔账示例 1假定波特率为 9600 Bd在 USART 中波特率 比特率。假定帧结构1 起始位 8 数据位 无校验位 1 停止位 10 位。理论每秒传输字节 (即字节传输速率) 9600bps / 10bits/byte 960 字节 / 秒示例 2假定波特率为 115200 Bd在 USART 中波特率 比特率。假定帧结构1 起始位 8 数据位 无校验位 1 停止位 10 位。理论每秒传输字节 (即字节传输速率) 115200bps / 10bits/byte 11520 字节 / 秒通过上面的计算主要是让大家对 USART 的速度有一个量化的认识也能直观看到波特率对于 USART 传输速度的影响。
返回列表