stm32 gy-53-l1测距usart.c代码
时间: 2023-08-03 19:02:58 浏览: 187
以下是使用USART通信实现STM32与GY-53-L1测距模块进行通信的示例代码:
```
#include "stm32f10x.h"
#include <stdio.h>
// 定义USART相关的GPIO口
#define USARTx USART1
#define USARTx_CLK RCC_APB2Periph_USART1
#define USARTx_TX_PIN GPIO_Pin_9
#define USARTx_TX_GPIO_PORT GPIOA
#define USARTx_TX_GPIO_CLK RCC_APB2Periph_GPIOA
#define USARTx_RX_PIN GPIO_Pin_10
#define USARTx_RX_GPIO_PORT GPIOA
#define USARTx_RX_GPIO_CLK RCC_APB2Periph_GPIOA
// 定义USART接收缓冲区大小
#define USART_RX_BUF_SIZE 100
// 定义发送和接收状态
#define USART_SENDING 0
#define USART_RECEIVING 1
// 定义USART接收缓冲区
uint8_t USART_RX_BUF[USART_RX_BUF_SIZE];
uint16_t USART_RX_STA = 0;
uint8_t USART_RX_STATUS = USART_RECEIVING;
// USART初始化函数
void USART_Config(void)
{
USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(USARTx_CLK | USARTx_TX_GPIO_CLK | USARTx_RX_GPIO_CLK, ENABLE);
// 配置USARTx_TX的GPIO口
GPIO_InitStructure.GPIO_Pin = USARTx_TX_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(USARTx_TX_GPIO_PORT, &GPIO_InitStructure);
// 配置USARTx_RX的GPIO口
GPIO_InitStructure.GPIO_Pin = USARTx_RX_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(USARTx_RX_GPIO_PORT, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USARTx, &USART_InitStructure);
USART_Cmd(USARTx, ENABLE);
}
// USART发送一个字节
void USART_SendByte(USART_TypeDef *USARTx, uint8_t byte)
{
while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);
USART_SendData(USARTx, byte);
}
// USART发送字符串
void USART_SendString(USART_TypeDef *USARTx, char *str)
{
while (*str)
{
USART_SendByte(USARTx, *str++);
}
}
// USART接收中断处理函数
void USART1_IRQHandler(void)
{
uint8_t ch;
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
ch = USART_ReceiveData(USART1);
// 如果接收到换行符,则表示一行数据接收完成
if (ch == '\n' || ch == '\r')
{
USART_RX_BUF[USART_RX_STA++] = ch;
USART_RX_STATUS = USART_SENDING;
}
else
{
USART_RX_BUF[USART_RX_STA++] = ch;
if (USART_RX_STA >= USART_RX_BUF_SIZE)
{
USART_RX_STATUS = USART_SENDING;
}
else
{
USART_RX_STATUS = USART_RECEIVING;
}
}
}
}
int main(void)
{
uint32_t distance;
USART_Config();
// 使能接收中断
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
while (1)
{
// 发送获取距离命令
USART_SendString(USART1, "AT+DIST?\r\n");
// 等待接收到距离数据
while (USART_RX_STATUS == USART_RECEIVING);
// 解析距离数据
sscanf((const char *)USART_RX_BUF, "+DIST:%ldmm", &distance);
printf("Distance: %ldmm\r\n", distance);
// 清空接收缓冲区和状态
USART_RX_STA = 0;
USART_RX_STATUS = USART_RECEIVING;
// 延时一段时间
Delay(1000);
}
}
```
在上述代码中,使用USART1与GY-53-L1测距模块进行通信,通过发送"AT+DIST?"命令获取距离数据。当接收到一行数据时,会将数据存储到USART_RX_BUF缓冲区中,直到接收到换行符或缓冲区已满。然后从缓冲区中解析出距离数据,并打印到串口终端上。最后清空接收缓冲区和状态,并延时一段时间再次发送命令。
阅读全文