串行通信协议小结(Serial Protocols)(1)

UART是一种异步串行通信协议,涉及同步与异步通信的区别、波特率、数据帧结构以及硬件流量控制。在STM32中,配置UART参数包括波特率、数据位、停止位和校验位,并通过HAL库函数进行数据发送与接收。通信时需确保双方参数一致,以保证数据传输的准确性。
摘要由CSDN通过智能技术生成

通信关键点

  • 同步通信(例如SPI)-双方之间的数据传输使用公共时钟信号进行同步,数据以稳定的流传输。不需要额外的比特来标记传输的每个数据块的开始/结束,因此速度更快。
  • 异步通信(例如UART)-数据以不规则的间隔传输,设备的内部时钟不同步,但速度(波特)必须事先达成一致。需要额外的比特来标记传输的每个数据块的开始/结束,因此速度较慢。
  • 波特率-线路每秒可以改变状态的最大次数,即多久发一次1或0,常见的有4800、9600、12500。若波特率是9600那么它传输一位0或1的时间就是1/9600秒,理论上波特率越高,出错概率越大。

通信模式-允许双方交换数据的设置。 

  • 单工-只能在一个方向上传输
  • 半双工-一次可以在一个方向上传输,但方向可以来回切换。
  • 全双工-数据可以同时在两个方向上传输。

UART

通用异步收发器(UART)-用于将处理器的并行数据总线转换为串行通信的接口。                      特点

  • 硬件流量控制-检测接收器/传输FIFO上的数据溢出
  • 接收机/发射机握手
  • 传输速率为115 Kbps(标准UART,存在高速变体)

串行字节的解剖-可以使用硬件(例如UART设备)支持的标准(例如RS-232)进行传输:

  • 1个起始位
  • 5-8个数据位
  • 1个奇偶校验位(可选)。

如果1的数量是奇数,则偶数奇偶校验设置该位,否则该位保持为零。如果1的数量是偶数,则奇数奇偶校验设置该位,否则该位保持为零。Received知道您使用的是偶数还是奇数,并进行相应的检查。回调奇偶校验位只能检测奇数个错误,因此多个错误看起来可能是有效数据。

  • 1-2个停止位

示例:8E2表示1个起始位(始终)、8个数据位、偶数奇偶校验位、2个停止位。
示例:7N1表示1个起始位(始终)、7个数据位、无奇偶校验位、1个停止位。

UART通讯使用两根信号线进行数据传输:一根为数据线(TXD),负责发送数据;另一根为接收线(RXD),负责接收数据。发送方需要将发送的数据按照约定的通讯参数进行编码,然后通过TXD线发送出去,接收方则需要通过RXD线接收数据,并将接收到的数据进行解码。通信的过程中,发送方和接收方需要保持相同的波特率、数据位数、停止位数和校验方式等参数,才能正常进行数据传输。

UART通讯的数据传输是异步的,即发送方和接收方没有时钟信号进行同步。因此,在发送数据之前,发送方需要发送一个起始位(Start Bit)来告诉接收方数据的传输开始了;在数据传输完成后,发送方需要发送一个或多个停止位(Stop Bit)来告诉接收方数据的传输已经结束了。停止位的数量可以根据通讯参数进行配置,通常为1或2个。

UART通讯也可以使用校验位来检测数据传输是否出错。校验位是由发送方在数据包中添加的一位或多位数据,用于检测数据传输是否出错。接收方在接收到数据后,会对数据进行校验,并与校验位进行比对。如果接收到的数据与校验位不匹配,则说明数据传输出错,接收方会请求发送方重新发送数据。 总之,UART通讯是一种基于时序的异步串行通讯方式,通讯的双方需要事先约定好通讯参数,包括波特率、数据位数、停止位数和校验方式等。发送方需要将发送的数据按照约定的通讯参数进行编码,然后通过TXD线发送出去,接收方则需要通过RXD线接收数据,并将接收到的数据进行解码。在数据传输过程中,需要发送起始位和停止位来标识数据的开始和结束,也可以使用校验位来检测数据传输是否出错。

软件实现

1.确定通讯参数

        在使用UART通讯前,需要确定通讯参数,包括波特率、数据位数、停止位数和校验方式等。通常情况下,这些参数需要与外设或其他通讯方事先约定好,才能确保通讯的正确性。以STM32为例,可以在代码中通过以下方式配置UART通讯参数:

UART_HandleTypeDef uart;
uart.Instance = USART2;
uart.Init.BaudRate = 115200;
uart.Init.WordLength = UART_WORDLENGTH_8B;
uart.Init.StopBits = UART_STOPBITS_1;
uart.Init.Parity = UART_PARITY_NONE;
uart.Init.Mode = UART_MODE_TX_RX;
uart.Init.HwFlowCtl = UART_HWCONTROL_NONE;
uart.Init.OverSampling = UART_OVERSAMPLING_16;
HAL_UART_Init(&uart);

代码中,将波特率设置为115200bps,数据位数设置为8位,停止位数设置为1位,校验方式设置为无校验。

2. 发送数据

       在确定好通讯参数后,可以通过UART发送数据。以STM32为例,可以通过以下方式发送数据:

uint8_t data[] = "Hello, world!";
HAL_UART_Transmit(&uart, data, sizeof(data), 1000);

      这段代码中,将字符串"Hello, world!"发送出去,使用的是HAL库中的HAL_UART_Transmit函数。该函数的第一个参数为UART句柄,第二个参数为发送的数据缓冲区,第三个参数为发送数据的长度,第四个参数为超时时间。

3. 接收数据

接收UART数据的方式与发送类似,也需要使用特定的函数。以STM32为例,可以通过以下方式接收数据:

uint8_t buffer[100];
HAL_UART_Receive(&uart, buffer, sizeof(buffer), 1000);

这段代码中,接收数据的缓冲区为buffer,使用的是HAL库中的HAL_UART_Receive函数。该函数的第一个参数为UART句柄,第二个参数为接收数据的缓冲区,第三个参数为接收数据的长度,第四个参数为超时时间。

4. 其他常用函数

在UART通讯中,还有一些常用的函数,比如清除UART接收缓冲区、获取UART接收缓冲区中的数据长度等。以STM32为例,可以通过以下方式进行操作:

HAL_UART_ClearRxBuffer(&uart);
uint32_t len = __HAL_UART_GET_RX_DATA_LENGTH(&uart);

这段代码中,清除UART接收缓冲区使用的是HAL库中的HAL_UART_ClearRxBuffer函数;获取UART接收缓冲区中的数据长度使用的是HAL库中的__HAL_UART_GET_RX_DATA_LENGTH宏定义。

以上就是UART通讯的基本使用方法。需要注意的是,在使用UART通讯时,需要确保发送方和接收方的通讯参数相同,否则可能会导致数据传输错误。同时,也需要注意数据的编码和解码方式,以确保数据传输的正确性。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值