6.串口通信

1.串口USART概述

1.1 USART就是通用同步异步收发器

  • TX:串口输出信号

  • RX:串行输入信号

  • nCTS:允许发送信号,低电平有效。例如:如果对方设备准备好接收数据了,对方设备发送低电平给nCTS,本机就可以发送数据了

  • nRTS:请求发送信号,低电平有效。例如:如果本机准备好接收数据了,就将nRTS设置为低电平,通知对方设备可以发送数据了

  • SCLK:发送器输出的时钟信号,这个时钟信号线仅用于同步模式

在这里插入图片描述

1.2 串口的三种工作模式:

  1. 普通异步通信: 使用引脚 TX 和 RX;(常用方式)
  2. 带硬件流控制信号的异步通信:使用引脚: TX RX nCTS nRTS
  3. 同步通信:TX RX SCLK

1.3 四种串口连接电路:(软件完全一致)

  1. 串口与串口连接电路
  2. 串口与RS232连接电路(电平转接芯片:SP3232)
  3. 串口与RS485连接电路(电平转接芯片:SP3485)
  4. 串口与USB连接电路(电平转接芯片:CH340或 PL2303)

1.4 常用功能函数

1.4.1 轮询模式常用功能函数

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout);      //发送一个缓冲区的数据,发送完成或超时后才返回,返回值为  HAL_OK
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
//接收一个缓冲区的数据,接收完成或超时后才返回,返回值为  HAL_OK

案例1:发送的轮询模式

uint8_t  clockStr[]="18:!45\n";
HAL_UART_Transmit(&huart2, clockStr, sizeof(clockStr), 200);    
  // 通过串口2     发送缓冲区指针clockStr内的数据     数据长度为 sizeof(clockStr)     需在200ms内传输完成。发送完成返回值为HAL_OK,否则可能是超时或其他错误

返回值有以下4种:

typedef enum 
{
  HAL_OK       = 0x00U,       //成功
  HAL_ERROR    = 0x01U,       //错误
  HAL_BUSY     = 0x02U,       //进行中
  HAL_TIMEOUT  = 0x03U        //超时
} HAL_StatusTypeDef;

案例2:接收的轮询模式

uint8_t  recvSTR[];
HAL_UART_Receive(&huart2, recvSTR, 10,200);
//通过串口2   接收数据放入长度为10的recvSTR数组中,如果超过200ms未完成,则返回超时,在固定时间内完成,则返回HAL_OK

1.4.2 中断/DMA模式常用功能函数

HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

案例1:以中断方式发送数据

HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size);

参数pData用于需要发送的数据缓冲区指针,参数Size是需要发送的数据长度。

通过该函数 以中断方式发送一定长度的数据,若函数返回值为 HAL_OK ,表示启动发送 成功,但并不表示数据发送完成了。

uint8_t  clockStr[]="18:!45\n";
HAL_UART_Transmit_IT(&huart2, clockStr, sizeof(clockStr));    
  // 通过串口2     发送缓冲区指针clockStr内的数据     数据长度为 sizeof(clockStr)     无超时时间限制。
  //发送完成返回值为HAL_OK,否则可能是超时或其他错误

发送结束后,会触发中断回调函数HAL_UART_TxCpltCallback(),其作用是:若要在数据发送结束时做一些处理,就需要编写该回调函数

案例2:以中断方式接收数据

HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

参数pData是存放接收数据的缓冲区指针,参数Size是需要接收的数据长度(以字节方式)。

通过该函数 以中断方式接收一定长度的数据,若该函数返回值为 HAL_OK,表示启动接收成功,并不表示已经接收完数据。

uint8_t  recvSTR[10];
HAL_UART_Receive_IT(&huart2, recvSTR, 10);
//通过串口2   接收数据放入长度为10的recvSTR数组中。

接收结束后,会触发中断回调函数HAL_UART_RxCpltCallback(),其作用是:若要在数据接收结束时做一些处理,就需要编写该回调函数

注意:HAL_UART_Receive_IT()该函数有需要注意的地方:

1.该函数执行一次,只能接收固定长度的数据

2.在处理不确定长度、不确定输入时间的串口数据输入时,会比较麻烦。后面案例中介绍处理方法

1.5 常用宏函数

1.6 中断事件及回调函数

2.电路原理图

在这里插入图片描述

本例程采用串口2,使用PA2(TX),PA3(RX) 分别接到 TPT3232芯片的输入和输出口。

3.配置CUBEMX

配置STM32的串口2
在这里插入图片描述

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值