当前位置: 首页 > news >正文

串口通信技术及USART应用研究

串口通信技术及USART应用研究

 

# 串口通信技术及USART应用研究

摘要:本文深入探讨了串口通信技术的基本原理、硬件电路设计以及USART(通用同步/异步收发器)在STM32微控制器中的应用。首先对通信接口进行了概述,分析了不同通信协议的特点及应用场景,接着详细阐述了串口通信的优势、硬件电路连接方式以及电平标准的差异。重点对串口通信的数据帧结构、波特率设定等关键技术进行了剖析,并通过具体波形示例说明了数据帧传输过程。此外,全面介绍了USART的功能、结构组成、波特率发生器原理以及数据模式,还探讨了数据包的构建与接收处理方法,并给出了STM32单片机USART串口编程的代码示例,为相关领域的研究与开发提供了理论支持与实践参考。

 

**关键词** :串口通信;USART;STM32;数据帧;波特率;数据包

 

1. 通信接口概述

 

通信的核心目标是实现设备间的数据传输,以此来拓展硬件系统的功能。通信协议作为通信过程中的“规则”,规定了数据收发的具体方式,通信双方必须严格遵循协议进行操作。

 

以下是几种常见的通信接口及其特点:

 

名称| 引脚| 双工模式| 时钟同步方式| 电平类型| 适用设备场景

 

2. 串口通信

 

串口通信是一种广泛应用于多种设备间通信的接口方式。它具有成本低、易于实现、通信线路简单等优点,能够实现两设备间的双向数据交互。单片机通过串口可以与单片机、电脑以及其他各类模块进行通信,极大地拓展了单片机的应用范围,增强了单片机系统的硬件功能。

 

3. 硬件电路

 

当单片机与电脑进行连接时,通常需要借助一个转换器来实现信号的适配。在双向串口通信场景中,需要使用两根通信线,分别是发送端TX线和接收端RX线,且TX与RX要进行交叉连接。如果仅需进行单向数据传输,那么仅连接一根通信线即可满足需求。当遇到电平标准不一致的情况时,必须加入电平转换芯片,以确保信号的正确传输。

                              

4. 电平标准

 

电平标准是串口通信中用于表示数据1和数据0的关键方式,它是传输线缆中人为设定的电压与数据之间的对应关系。串口通信常用的电平标准主要有以下三种:

 

- **TTL电平** :用+3.3V或+5V表示数据1,0V表示数据0。

- **RS232电平** :-3V至-15V表示数据1,+3V至+15V表示数据0。

- **RS485电平** :两线压差+2V至+6V表示数据1,-2V至-6V表示数据0(采用差分信号方式)。

 

 5. 串口参数及时序

 

5.1 数据帧的构成

 

在串口通信过程中,每一个字节的数据都被封装在一个数据帧内进行传输。一个完整的数据帧由以下几部分构成:

 

- **起始位** :用于标识数据帧的起始位置。

- **数据位** :承载实际要传输的数据内容,通常由8位组成。

- **校验位(可选)** :主要用于对数据传输过程中的错误进行检测。

- **停止位** :标识数据帧的结束。

 

### 5.2 起始位

 

起始位的主要功能是标识一个数据帧的开始。其电平状态固定为低电平(0)。在串口通信的空闲状态下,信号线保持高电平(1)。当开始发送数据时,起始位通过从高电平跳变到低电平,产生一个明显的下降沿信号,以此通知接收设备数据传输即将开始。

 

### 5.3 数据位

 

数据位是数据帧中真正承载有效数据的部分。其长度一般为8位,代表一个字节的8位二进制数据。在传输过程中,数据位按照低位在前(LSB first)的顺序进行发送。具体来说,1用高电平表示,0用低电平表示。

 

### 5.4 校验位

 

校验位的主要作用是对数据进行验证,以便检测数据传输过程中是否出现错误。校验位主要有两种类型:奇校验和偶校验。奇校验的目的是确保整个数据帧中1的个数为奇数;而偶校验则是保证数据帧中1的个数为偶数。校验位是根据数据位的值计算得出,并添加在数据位的最后。例如,当数据位为00001111时,其中有4个1(为偶数),若采用奇校验,则校验位应为1,从而使数据帧中1的总数变为奇数(000011111)。

 

### 5.5 停止位

 

停止位的作用是标识一个数据帧的结束,并且为下一个数据帧的起始位做好准备。其电平状态固定为高电平(1)。在一个字节数据发送完成后,必须有一个停止位来作为数据帧之间的间隔。如果没有停止位,当数据的最后一位是0时,下一个数据帧的起始位的低电平就无法形成有效的下降沿,接收设备也就无法准确识别数据帧的开始位置。

 

### 5.6 波特率

 

波特率是串口通信中一个重要的参数,它规定了串口通信的速率,即每秒能够传输的码元数,其单位是波特(Baud)。与之相对应的还有比特率,比特率表示每秒传输的比特数,单位是比特每秒(bps)。在二进制调制的情况下,1个码元等同于1个比特,因此波特率与比特率相等。发送和接收设备必须事先约定好相同的波特率,这样才能确保数据能够被正确接收。例如,当波特率设定为1000bps时,意味着1秒内可以传输1000位数据,每位数据的时间间隔为1毫秒(ms)。发送设备会按照每隔1ms发送一位的频率进行数据发送,接收设备也会按照相同的频率每隔1ms接收一位数据。

 

### 5.7 数据帧传输过程示例

 

以发送端发送数据帧01100110(8位数据位)为例,其完整的数据帧结构如下:

 

- 起始位:0

- 数据位:01100110

- 校验位(采用奇校验):0(因为数据位中有4个1,补0以保持1的个数为奇数)

- 停止位:1

 

在接收端,收到数据帧后会进行奇校验位的验证。如果数据帧中1的个数为奇数,则认为数据传输正确;反之,若1的个数不是奇数,则判定数据传输出现错误。

 

**校验过程** :

 

- 发送端:先计算数据位的校验位,然后将校验位附加到数据位之后,一起发送出去。

- 接收端:接收到数据后,对校验位进行验证,检查数据的奇偶性是否与约定一致。如果不一致,则认为数据在传输过程中出现了错误。

 

**数据位表示方法** :

 

- 方法一:将校验位作为数据位的一部分,整个数据帧共有9位。

- 方法二:将校验位与数据位分开描述,数据位为8位,校验位独立为1位。

## 6. 串口时序

### 6.1 第一个波形解释

 

以下是对STM32的TX引脚在发送数据0x55时输出信号波形的详细解析:

 

- **波特率与时间间隔** :在当前设定的波特率下,发送每一位数据所需的时间间隔大约为104微秒。具体波特率为9600bps(比特每秒),每位时间计算公式为1 / 9600 ≈ 104微秒(us)。

- **空闲状态** :在没有数据传输时,TX引脚处于空闲状态,此时引脚保持高电平(1)。

- **数据帧结构** :

- **起始位** :低电平(0),其作用是标志数据帧的开始,通过产生一个从高电平到低电平的下降沿来通知接收设备数据即将传输。

    - **数据位** :发送的数据0x55转换为二进制形式为01010101。在传输过程中,数据位按照低位先行(LSB first)的顺序进行发送,即实际发送顺序为10101010。

    - **停止位** :高电平(1),用于标志数据帧的结束,并将引脚恢复到高电平状态,为下一个数据帧的传输做好准备。

    - **校验位** :在此例中未使用校验位。

- **整个数据帧的波形顺序** :起始位(0)→数据位(10101010)→停止位(1)。

- **波形生成** :在STM32微控制器中,这些波形是由USART(通用同步/异步收发器)外设自动根据设定的波特率和数据内容生成并处理的。

- **软件模拟** :也可以通过软件来模拟生成类似的波形,具体步骤如下:

    - 使用定时器设定104微秒的时间间隔。

    - 每到一个时间间隔,根据数据帧的要求,通过调用GPIO_WriteBit函数设置引脚的高低电平,从而产生与硬件相同的波形。

- **发送过程** :在TX引脚上,按照设定的时间间隔和数据帧的要求,依次设置高低电平,完成数据的发送任务。

- **接收过程** :在RX引脚上,通过读取引脚的高低电平来接收数据,具体步骤如下:

    - 设定一个外部中断,在检测到起始位的下降沿时触发接收状态。

    - 对接收时钟进行采样,根据设定的波特率每104微秒采样一次。

    - 依次采样8次,读取每一位数据,并将其组合成完整的数据字节。

 

通过对其他波形的观察和分析,可以更好地理解不同数据和配置下的波形特征。例如:

 

### 6.2 第二个波形

 

- **发送数据** :0x0A,其二进制形式为00001010。

- **数据帧顺序** :起始位(0)→数据位(01010000)→停止位(1)。

 

### 6.3 第三个波形

 

- **发送数据** :0xFF,其二进制形式为11111111。

- **数据帧顺序** :起始位(0)→数据位(11111111)→停止位(1)。

 

### 6.4 第四个波形

 

- **发送数据** :0x00,其二进制形式为00000000。

- **数据帧顺序** :起始位(0)→数据位(00000000)→停止位(1)。

 

每一个数据帧的生成和传输过程都遵循相同的规则,通过精确控制起始位、数据位和停止位的顺序以及电平状态,能够确保数据的准确传输和接收。

 

## 7. USART概述

 

USART(Universal Synchronous/Asynchronous Receiver/Transmitter,通用同步/异步收发器)是STM32微控制器内部集成的一个重要的硬件外设,专门用于实现串行数据通信。它具备强大的功能,能够根据数据寄存器中的一个字节数据自动生成数据帧的时序,并通过TX引脚将其发送出去。同时,USART也能够自动接收RX引脚的数据帧时序,并将其拼接成一个字节数据,然后存放在数据寄存器中,从而实现高效的数据通信。

 

### 7.1 波特率生成器

 

- **功能** :USART内置的波特率发生器能够支持最高达4.5Mbps的通信速率,满足不同场景下的高速数据传输需求。

- **工作原理** :波特率发生器通过对输入的时钟频率进行分频操作来生成所需的波特率时钟。例如,当APB2总线提供72MHz的频率时,波特率发生器会对该频率进行适当的分频处理,从而生成符合通信要求的波特率时钟。在该时钟的控制下进行数据的收发操作,确保通信过程按照指定的波特率进行。

 

### 7.2 配置选项

 

USART提供了丰富的配置选项,以适应不同的通信需求,具体如下:

 

- **数据位长度** :可灵活配置为8位或9位数据长度,为用户提供了更多的选择,以满足不同数据格式的传输要求。

- **停止位长度** :提供了多种选择,包括0.5、1、1.5或2个停止位,用户可以根据实际通信协议的要求进行配置,以确保数据帧的正确解析。

- **校验位** :支持无校验、奇校验或偶校验三种方式,用户可以根据数据传输的可靠性要求选择合适的校验方式,从而提高数据传输的准确性。

- **模式支持** :

    - **同步模式** :适用于需要时钟信号进行同步的通信场景,确保数据的准确传输。

    - **硬件流控制** :用于避免在高速数据传输过程中出现数据丢失的问题,通过硬件电路实现流量控制,提高通信的可靠性。

    - **DMA(直接存储器访问)** :支持DMA功能,用于大量数据的传输,能够减轻CPU的负担,提高数据传输效率,使系统能够更高效地处理其他任务。

    - **智能卡模式** :支持智能卡通信,为智能卡应用提供了硬件支持,拓展了STM32在智能卡领域的应用范围。

    - **IrDA(红外数据协会)** :支持红外通信,使STM32能够通过红外方式进行数据传输,满足特定场景下的无线通信需求。

    - **LIN(局域网络接口)** :支持汽车通信网络,为汽车电子系统中的数据通信提供了硬件基础,有助于实现汽车内部各模块之间的数据交互。

 

### 7.3 硬件流控制

 

- **问题** :在数据通信过程中,当A设备通过TX向B设备的RX发送数据时,如果A设备发送数据的速度过快,而B设备处理数据的速度跟不上,就可能导致数据丢失,影响通信的完整性。

- **解决方案** :硬件流控制通过在硬件电路上增加一根额外的信号线来实现流量控制。当B设备没有准备好接收数据时,会发送高电平信号;而当B设备准备好接收数据时,则发送低电平信号。A设备根据B设备反馈的信号来决定是否继续发送数据,从而有效避免了数据丢失的问题。

- **作用** :硬件流控制的主要作用是确保数据传输的可靠性,防止因发送速度与接收速度不匹配而导致的数据丢失现象,保证通信过程的顺利进行。

- **使用情况** :虽然STM32支持硬件流控制功能,但在一般的通信场景中并不常用,主要是在对数据传输可靠性要求极高的特殊场合才会采用。

 

### 7.4 DMA支持

 

- **功能** :USART支持DMA(直接存储器访问)功能,用于实现数据的高效传输。

- **优势** :在进行大量数据的收发操作时,DMA可以直接将数据从存储器传输到USART外设,或者从USART外设传输到存储器,无需CPU过多地参与数据传输过程。这样可以显著减轻CPU的负担,提高系统的整体性能,使CPU能够将更多的资源用于处理其他重要任务,从而提高数据传输效率。

 

### 7.5 STM32F103C8T6的USART资源

 

STM32F103C8T6微控制器提供了丰富的USART资源,具体如下:

 

- **USART1** :连接在APB2总线上,能够满足高速数据传输的需求。

- **USART2、USART3** :连接在APB1总线上,为用户提供了更多的串行通信接口选择,方便进行多设备的通信连接。

 

## 8. USART框图

### 8.1 引脚功能

 

- **SW_RX、IRDA_OUT/IN** :这些引脚主要用于智能卡和红外(IrDA)通信,为特定的通信协议提供了硬件接口支持。

 

### 8.2 数据寄存器

 

- **发送数据寄存器(TDR,Transmit Data Register)** :用于存储待发送的数据,是一个只写寄存器。用户将要发送的数据写入该寄存器后,硬件会自动将其发送出去。

- **接收数据寄存器(RDR,Receive Data Register)** :用于存储接收到的数据,是一个只读寄存器。当接收到外部设备发送过来的数据时,数据会被存储在该寄存器中,供用户读取。

- **数据寄存器(DR,Data Register)** :在程序中表现为一个统一的寄存器,但在硬件层面实际上是由发送数据寄存器(TDR)和接收数据寄存器(RDR)组成的。当对数据寄存器进行写操作时,数据会被写入TDR;而当进行读操作时,数据则是从RDR中读取的。

 

### 8.3 移位寄存器

 

- **发送移位寄存器** :

其主要功能是将一个字节的数据逐位通过TX引脚发送出去。例如,当TDR中写入数据0x55(二进制为0101 0101)时,硬件会检测到数据的写入,并检查发送移位寄存器是否处于空闲状态。如果发送移位寄存器为空闲,数据会立即从TDR转移到发送移位寄存器中。随后,TXE(Transmit Data Register Empty)标志位会被置1,表示TDR已空,可以写入新的数据。发送移位寄存器会在波特率的控制下,按照低位先行的顺序,逐位将数据通过TX引脚发送出去。

- **接收移位寄存器** :用于从RX引脚接收数据。它会逐位读取RX引脚上的电平,并将这些数据依次存入接收移位寄存器中。当一帧数据的移位操作完成后,整个字节的数据会被转移到RDR(接收数据寄存器)中,同时RXNE(Receive Data Register Not Empty)标志位会被置1,表示RDR中有数据可供读取。

 

### 8.4 数据发送过程

 

- **写入TDR** :首先将要发送的数据写入发送数据寄存器TDR。

- **数据转移** :数据从TDR转移到发送移位寄存器,并且TXE标志位会被置1,表明TDR已空,可以写入新的数据。

- **数据移位** :在波特率的控制下,发送移位寄存器逐位将数据通过TX引脚发送出去。

- **连续发送** :当一个字节的数据发送完毕后,如果TDR中有新的数据,它会自动转移到发送移位寄存器中,从而确保数据能够连续不断地发送。

 

### 8.5 数据接收过程

 

- **接收数据** :RX引脚接收到的数据会逐位存入接收移位寄存器中。

- **数据移位** :接收移位寄存器将接收到的数据逐位移位。

- **读取RDR** :当RXNE标志位被置1后,程序可以从RDR(接收数据寄存器)中读取完整的数据字节。

 

### 8.6 硬件数据流控制

 

- **nRTS(Request To Send)** :这是一个输出引脚,用于指示设备是否已经准备好接收数据。

- **nCTS(Clear To Send)** :这是一个输入引脚,用于指示对方设备是否可以开始发送数据。

- **使用步骤** :

    - **请求发送** :当设备准备好接收数据时,nRTS引脚会被置为低电平,向对方设备发送请求发送数据的信号。

    - **清除发送** :对方设备检测到nCTS引脚为低电平时,开始发送数据。当接收数据寄存器满时,nRTS引脚会被置为高电平,指示对方设备暂停发送数据,直到nRTS再次被置为低电平。

 

### 8.7 波特率发生器

 

- **工作原理** :波特率发生器通过对APB时钟进行分频操作,生成发送和接收移位寄存器所需的时钟信号。

- **USARTDIV** :分频系数,它包含整数和小数部分,能够支持更精确的波特率配置,从而满足不同通信场景对波特率精度的要求。

 

### 8.8 中断控制

 

- **中断申请位** :由状态寄存器中的各种标志位(如TXE、RXNE等)触发,当这些标志位被置1时,会产生中断申请信号。

- **中断处理** :通过中断服务程序(ISR)来处理数据的发送和接收操作,从而提高通信效率,使系统能够及时响应数据传输请求,确保数据的快速处理和传输。

 

### 8.9 唤醒单元

 

- **功能** :实现多设备通信中的设备唤醒功能,能够通过地址匹配唤醒特定的设备,使其进入通信状态。

- **工作原理** :为每个设备分配一个唯一的地址。发送设备在发送数据之前,先发送目标设备的地址。目标设备接收到地址后,会检测该地址是否与自身地址匹配。如果匹配,则目标设备被唤醒,开始进行通信;如果不匹配,则目标设备保持静默状态,不参与通信。

 

### 8.10 同步时钟模块

 

- **用途** :

    - 兼容其他通信协议,例如SPI(Serial Peripheral Interface,串行外设接口)协议,使USART能够与支持SPI协议的设备进行通信,拓展了USART的应用范围。

    - 实现自适应波特率功能,接收设备可以通过测量同步时钟周期来计算波特率,从而实现自动波特率匹配,提高了通信的灵活性和适应性。

 

## 9. USART基本结构

USART的基本结构由多个关键部分组成,共同协作完成数据的发送和接收任务。最左边是波特率发生器,它负责产生约定的通信速率。时钟来源可以是PCLK2或PCLK1,通过波特率发生器进行分频处理后,生成的时钟信号会被送到发送控制器和接收控制器。

 

### 9.1 发送部分

 

- **发送控制器和接收控制器** :这两个控制器分别负责控制发送和接收的数据移位操作,确保数据能够按照正确的顺序和时序进行发送和接收。

- **发送数据寄存器(TDR)和发送移位寄存器** :它们配合工作,将数据逐位移出。数据通过GPIO(General Purpose Input/Output,通用输入/输出)的复用功能输出到TX引脚,从而生成符合串口协议的波形。发送移位寄存器按照低位先行的顺序向右移位。

- **TXE标志位** :当数据从TDR转移到移位寄存器时,TXE(Transmit Data Register Empty)标志位会被置1。用户可以通过检查这个标志位来判断是否可以写入下一个数据,从而实现数据的连续发送。

 

### 9.2 接收部分

 

- **RX引脚** :接收外部设备发送过来的波形信号。

- **接收移位寄存器** :在接收控制器的控制下,RX引脚接收到的波形信号会逐位移入接收移位寄存器。

- **接收数据寄存器(RDR)** :当完整接收一帧数据后,数据会从接收移位寄存器转移到RDR中。

- **RXNE标志位** :在数据转移过程中,RXNE(Receive Data Register Not Empty)标志位会被置1,表示RDR中有数据可供读取。同时,该标志位也可以触发中断,使系统能够快速响应并读取数据,提高通信的实时性。

 

### 9.3 数据寄存器

 

在软件层面,用户只需要操作一个统一的数据寄存器(DR)来进行数据的读写操作。当向DR写入数据时,数据会沿着发送路径进行发送;而当从DR读取数据时,数据则会沿着接收路径进行接收。这种设计使得用户在编程时能够更加方便地进行数据的发送和接收操作,无需分别操作发送和接收寄存器,简化了编程流程。

 

## 10. 数据帧

STM32的串口数据帧有多种配置方式可供选择,具体包括9位字长(有校验或无校验)、8位字长(有校验或无校验)。在实际应用中,通常建议选择9位字长且有校验或者8位字长且无校验的配置方式,这样可以使每一帧的有效载荷恰好为1字节,便于数据的处理和解析。

 

### 10.1 停止位参数

STM32的串口可以配置停止位为0.5、1、1.5或2个。这四种参数的主要区别在于停止位的时长不同。具体来说,1位停止位的时长与数据位的一位时长相等;1.5个停止位的时长是数据位一位时长的1.5倍;2个停止位的时长则是数据位一位时长的2倍;0.5个停止位的时长为数据位一位时长的0.5倍。在实际应用中,一般情况下会选择1位停止位,因为这种配置在大多数通信场景下都能满足需求,同时也能保证数据帧的结构相对简洁。

 

### 10.2 输出(TX)部分

 

串口的输出(TX)部分相对较为简单。其主要任务是按照设定的波特率定时翻转TX引脚的高低电平,从而生成符合串口协议要求的波形信号,将数据发送出去。

 

### 10.3 输入(RX)部分

 

输入(RX)部分相比输出部分要复杂得多,它需要满足以下条件:

 

- **采样频率与波特率一致** :必须确保输入采样频率与设定的波特率完全相一致,这样才能准确地读取每一位数据的电平状态,避免因采样频率不匹配而导致的数据错误。

- **精确的采样位置** :每次采样必须正好位于每一位数据的正中间位置。只有在正中间采样,才能确保读取的高低电平是最可靠的。如果采样点偏前或偏后,电平可能正在翻转且不稳定,导致采样错误。

 

### 10.4 噪声处理

 

输入电路还需要具备一定的噪声判断能力。如果检测到噪声,应设置标志位以提醒存在噪声干扰。STM32的USART输入电路设计具备这种功能,能够有效识别和处理噪声信号,提高数据接收的可靠性。

 

### 10.5 起始位侦测

- **检测起始位** :输入电路检测到一个数据帧的起始位后,会以波特率的频率连续采样一帧数据。采样位置必须从起始位开始对齐到位的正中间。只要第一位对齐,后面的位也会对齐。

- **16倍采样率** :为了实现精确采样,输入电路以波特率的16倍频率进行采样,即在一位的时间内可以进行16次采样。这种高采样率能够提高采样的精度和可靠性,确保数据的准确接收。

 

### 10.6 采样策略

 

- **初始采样** :在空闲状态下,采样结果一直为高电平(1)。一旦在某个位置采集到低电平(0),说明出现了下降沿,可能是起始位。

- **连续采样** :在起始位期间进行16次连续采样。如果没有噪声,这16次采样结果应全为0。

- **噪声处理** :实际电路中可能存在噪声。因此,在检测到下降沿后,额外进行几次采样,例如第3、5、7次采样以及第8、9、10次采样。

- **噪声判断** :在两批采样中,每批3次采样中至少有2个0,才能确认是起始位。如果采样结果满足条件但有噪声,状态寄存器会设置NE(Noise Error)标志位,提醒数据有噪声。如果3次采样中只有一个0,则认为不是起始位,电路忽略前面的数据,重新捕捉下降沿。

 

### 10.7 起始位确认

如果通过了起始位检测,接收状态从空闲变为接收状态,并且第8、9、10次采样的位置正好是起始位的正中间。之后的数据位也在第8、9、10次进行采样,确保采样位置在每个位的正中间,从而保证数据的准确接收。

 

## 11. 波特率发生器

发送器和接收器的波特率由波特率寄存器BRR里的DIV确定。其计算公式为:

 

\[ \text{波特率} = \frac{f(\text{PCLK2/1})}{16 \times \text{DIV}} \]

 

通过调整DIV的值,可以精确地设置所需的波特率,从而满足不同通信场景对波特率的要求。

 

## 12. 数据模式(数据包)

### 12.1 数据模式类型

 

- **HEX模式/十六进制模式/二进制模式** :以原始数据的形式显示,直接传输数据的二进制或十六进制值,适用于需要直接处理原始数据的场景。

- **文本模式/字符模式** :以原始数据编码后的形式显示,通常将数据按照字符编码(如ASCII编码)进行处理和显示,适用于文本数据的传输和处理。

 

### 12.2 数据包的作用

 

数据包的主要作用是将单独的数据打包在一起,方便进行多字节的数据通信。例如,在将陀螺仪传感器的数据通过串口发送到STM32时,陀螺仪的数据包括X轴、Y轴和Z轴,每个轴的数据为一个字节,总共需要连续不断地发送三个字节的数据。当数据以XYZXYZXYZ的形式连续发送时,接收方可能无法区分哪个字节对应X轴,哪个字节对应Y轴,哪个字节对应Z轴,因为接收方可能从任意位置开始接收数据,这就可能导致数据错位。

 

为了解决这个问题,需要一种方式将数据分割开来,将XYZ这批数据打包成一个个数据包。这样在接收时,就可以明确数据包的第一个字节是X,第二个字节是Y,第三个字节是Z。数据包的任务就是将同一批的数据进行打包和分割,确保接收方能够正确解析数据。

 

### 12.3 实现串口数据包

 

串口数据包通常通过在数据前后额外添加包头和包尾来实现。为了确保数据包的唯一性和正确性,可以采用以下方法:

 

- **限制载荷数据的范围** :在发送数据时,对数据进行限幅,确保数据不会与包头和包尾相同,从而避免数据与包头包尾混淆。

- **使用固定长度的数据包** :尽量使用固定长度的数据包,使接收方能够按照固定长度解析数据,这样可以简化接收端的解析逻辑,提高数据处理的效率。

- **增加包头包尾的数量** :在数据包中增加包头和包尾的数量,使其呈现出载荷数据不会出现的状态,进一步确保数据包的唯一性,提高数据传输的可靠性。

 

## 13. HEX数据包

### 13.1 数据包类型

 

- **固定包长,含包头包尾** :数据包的长度固定,包含包头和包尾,便于接收端按照固定格式解析数据。

- **可变包长,含包头包尾** :数据包的长度可以根据需要进行调整,但仍然包含包头和包尾,接收端需要根据包头和包尾来确定数据包的起始和结束位置。

 

### 13.2 HEX数据包接收

 

#### 状态说明

 

- **等待包头状态(S = 0)** :初始状态,等待接收数据包的包头(0xFF)。如果接收到的数据不是包头,则继续等待。

- **接收数据状态(S = 1)** :当接收到包头(0xFF)后,进入此状态。开始接收数据,并记录接收到的数据个数。如果接收到的数据不足4个,则继续接收数据。当接收满4个数据后,状态转为等待包尾。

- **等待包尾状态(S = 2)** :接收到4个数据后,进入此状态,等待接收包尾(0xFE)。如果接收到的数据不是包尾,则继续等待包尾。当接收到包尾(0xFE)后,重置状态机回到初始状态,准备接收下一个数据包。

 

#### 状态机执行流程

 

- **初始状态** :S = 0,等待包头。

    - 收到一个数据,进入中断处理。

    - 根据S的值判断当前状态:

        - 如果S = 0,检查数据是否为包头(0xFF)。

            - 是包头,设置S = 1,退出中断。

            - 不是包头,继续等待包头,S保持为0。

- **接收数据状态** :S = 1,接收数据。

    - 再次进入中断处理,根据S的值判断当前状态:

        - 如果S = 1,接收数据并记录接收的数据个数。

            - 如果接收的数据不足4个,继续接收数据。

            - 如果接收满4个数据,设置S = 2,退出中断。

- **等待包尾状态** :S = 2,等待包尾。

    - 再次进入中断处理,根据S的值判断当前状态:

        - 如果S = 2,检查数据是否为包尾(0xFE)。

            - 是包尾,设置S = 0,回到初始状态,准备接收下一个数据包。

            - 不是包尾,继续等待包尾。

 

## 14. 文本数据包

### 14.1 数据包类型

 

- **固定包长,含包头包尾** :数据包的长度固定,包含包头和包尾,便于接收端按照固定格式解析数据。

- **可变包长,含包头包尾** :数据包的长度可以根据需要进行调整,但仍然包含包头和包尾,接收端需要根据包头和包尾来确定数据包的起始和结束位置。

 

### 14.2 文本数据包接收

 

文本数据包的接收过程可以参考HEX数据包的状态说明和流程,其基本原理和步骤是类似的。主要区别在于数据的编码方式和处理方式,文本数据包通常需要对数据进行字符编码处理,以便正确解析和显示文本内容。

 

 

 

 

 

相关文章:

  • 鸿蒙仓颉语言开发教程:自定义弹窗
  • 开始通信之旅-----话题通信
  • python 将音乐和人声分离
  • 如何编写GitLab-CI配置文件
  • 链表题解——合并两个有序链表【LeetCode】
  • 【数据结构】顺序表和链表详解(上)
  • 剪枝中的 `break` 与 `return` 区别详解
  • JS中的函数防抖和节流:提升性能的关键技术
  • barker-OFDM模糊函数原理及仿真
  • DelphiXe12创建DataSnap REST Application
  • 阴盘奇门 api数据接口
  • 中国高分辨率高质量地面NO2数据集(2008-2023)
  • ​​技术深度解析:《鸿蒙5.0+:无感续航的智能魔法》​
  • SSRF 接收器
  • 抖音客户端训练营--day2
  • 第13讲、Odoo 18 配置文件(odoo.conf)详细解读
  • [Android] APK安装器 V20160330-6.0
  • 重学计算机网络之以太网
  • 精英-探索双群协同优化(Elite-Exploration Dual Swarm Cooperative Optimization, EEDSCO)
  • 基于 Zynq 平台的 EtherCAT 主站的软硬件协同设计
  • 玉溪网站建设制作/潍坊在线制作网站
  • 云南做网站多少钱/百度2018旧版下载
  • 温州网站上排名/百度关键词搜索技巧
  • 一个空间如何做2个网站/搜索引擎是软件还是网站
  • 做网站是用wordpress还是DW/seo关键词排名优化哪好
  • 网站开发语言学习/体验营销是什么