【蓝桥杯物联网赛项学习日志】Day4 关于USART/UART

关键词:USART UART 串口通信

理论基础

USART/UART

USART(Universal Synchronous/Asynchronous Receiver/Transmitter)

通用 同步/异步 串行 接收/发送器是一种串行通信接口。USART最多有5个信号,分别是TX,RX,nCTS.nRTS,SCLK

TX串行输出信号
RX串行输入信号
nCTS(clear to send)允许发送信号,低电平有效,(对方发出)
nRTS(request to send)请求发送信号,低电平有效,(对方发出)
SCLK时钟信号线,仅用于同步模式

TX和RX是必需的,nCTS和nRTS是硬件流控制信号。
在异步通信时可以选择是否使用硬件流控制信号,同步通信时没有硬件流控制信号。
SCLK只用于同步通信,异步通信时无SCLK

USART(Universal Asynchronous Receiver/Transmitter)

通用 异步 串行 接收/发送器 ,只有异步模式,没有SCLK时钟线,一般也没有nCTS,nRTS硬件流控制信号

串口通信的基本参数

数据位8位或9位,一般是八位,每八位一帧数据,刚好1字节
奇偶校验位分为奇校验,偶校验,或者无校验
停止位1或2个停止位,一般设置为1个
波特率串行数据通行速率,单位是bit/s(9600,19200,115200...)

串口配置

串口使用方法

流程

1.时钟使能
2.设置引脚复用器映射
3.GPIO端口模式设置
4.初始化串口参数
5.使能串口

配置步骤

这些步骤都可以在CubeMax里面进行配置。在上一文章中添加配置USART如下
        选择USART2
        mode 选择 (Asynchronous) 异步通信
        Baud Rate 波特率设置为9600
        关闭过载检测
        开启UART中断,配置中断优先级

 这样串口就配置好了

示例代码

在UART.C中添加代码

发送代码:

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

        huart   串口通道
        pData   发送数据数组
        Size      数据元素的数量
        Timeout 等待时间

接收代码

HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

        huart   串口通道
        pData   发送数据数组
        Size      数据元素的数量
        Timeout 等待时间

对串口发送数据和接收数据 代码进行改写

void UART_Transmit(uint8_t *ucData,uint8_t ucSize)
{
	HAL_UART_Transmit(&huart2,ucData,ucSize,100);
}

uint8_t UART_Receive(uint8_t *ucData)
{
	return HAL_UART_Receive(&huart2,ucData,1,0);
}

在UART.h头文件中添加

/* USER CODE BEGIN Prototypes */
void UART_Transmit(uint8_t *ucData,uint8_t ucSize);
uint8_t UART_Receive(uint8_t *ucData);
/* USER CODE END Prototypes */

在主函数中编写功能代码,实现数据的发送与接收

void UART_Proc(void)              	/* UART处理 */
{
  if(ucSec1 != ucSec)
  {                         				/* 1s到 */
    ucSec1 = ucSec;

    UART_Transmit(ucBuf, 4);				/* 发送4个字符 */
    printf(" %04u\r\n", ucSec);			/* 发送秒值和回车换行 */
  }
	
  if(UART_Receive(ucUrx) == 0)			/* 接收到字符 */
  {
    ucUrx[++ucUno] = ucUrx[0];			/* 保存字符 */
    if(ucUno >= 2)
    {																/* 修改秒值 */
      ucSec = (ucUrx[1]-0x30)*10+ucUrx[2]-0x30;
      ucUno = 0;
    }
  }
}

以上代码来自示例代码。

多种发送接受方式以及中断处理

发送数据的方式

//阻塞模式发送数据
HAL_UART_Transmit();
//中断模式发送数据
HAL_UART_Transmit_IT();
//DMA模式发送数据
HAL_UART_Transmit_DMA();

接受数据的方式

//阻塞模式接受数据
HAL_UART_Receivemit();
//中断模式接受数据
HAL_UART_Receivemit_IT();
//DMA模式接受数据
HAL_UART_Receivemit_DMA();

 中断处理

//接受中断处理
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	uint8_t* rex; 
		if(huart->Instance == USART2)
		{
            //发送接收到的字符数据
			HAL_UART_Receive(huart,rex,sizeof(rex),0); 
			HAL_UART_Transmit(huart,rex,sizeof(rex),10);
			HAL_GPIO_TogglePin(K1_GPIO_Port,K1_Pin);
		}
		__HAL_UART_CLEAR_FLAG(&huart2,UART_IT_TC);//清除中断标志位
}

//发送中断处理
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
	uint8_t* Tra; 
		if(huart->Instance == USART2)
		{
            //中断处理
			
		}
		__HAL_UART_CLEAR_FLAG(&huart2,UART_IT_TC);//清除中断标志位
}

DMA串口传输

*略

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值