#define ENUM_STR(s) #s 解释一下代码
时间: 2024-04-07 15:33:29 浏览: 47
这段代码是一个宏定义,它的作用是将传入的参数s转换为字符串。具体来说,#s 是一个预处理操作符,可以将宏参数s转换为字符串常量。当我们调用这个宏时,传入的参数会被替换到#s的位置,然后预处理器会将其转换为相应的字符串。举个例子:
```
ENUM_STR(enum_value)
```
经过预处理后,会被替换为:
```
"enum_value"
```
所以这个宏定义可以用于在代码中获取枚举值的字符串表示。
相关问题
C语言枚举类能否得到枚举类型的名称? 比如 enum season{spring=1,summer,fall,winter} 如果知道数值为2,能否得到summer字符串?
在C语言中,枚举类型的名称本身就是一个标识符,不能直接得到对应的字符串。不过,可以通过使用预处理器中的字符串化操作符#,将枚举类型的名称转换为字符串,从而实现获取枚举类型名称的效果。
以下是一个简单的示例代码,演示如何通过枚举类型值来获取对应的枚举类型名称:
```
#include <stdio.h>
#define ENUM_TO_STR(x) #x
enum season {
spring = 1,
summer,
fall,
winter,
};
int main() {
int enum_value = 2;
const char* enum_name = ENUM_TO_STR(summer);
printf("Enum value: %d, Enum name: %s\n", enum_value, enum_name);
return 0;
}
```
在上面的示例代码中,我们定义了一个枚举类型season,然后定义了一个整型变量enum_value,并将其赋值为2。接着,我们通过预处理器中的字符串化操作符#,将枚举类型summer转换为字符串,并将其赋值给enum_name。最后,我们通过printf函数将枚举类型值和名称输出到控制台。
需要注意的是,上述示例代码中获取的枚举类型名称是硬编码的,如果需要根据枚举类型值动态获取对应的名称,则需要另寻他法。
我有一个stm32f407,请给我实现界面登录功能的代码示例
好的,我们可以使用STM32CubeIDE来编写代码,这是一个官方提供的开发环境,可以方便地配置和编写代码。下面是一个简单的界面登录功能的代码示例:
首先,在STM32CubeIDE中创建一个新项目,并选择你的开发板型号,然后在代码生成器中选择以下模块:
- RCC(系统时钟配置)
- GPIO(控制IO口)
- USART(串口通信)
- TIM(定时器)
然后在工程中创建一个新的源文件“main.c”并添加以下代码:
```c
#include "stm32f4xx.h"
#include "stdio.h"
#include "string.h"
// 定义串口号
#define USARTx USART2
// 定义串口时钟
#define USARTx_CLK_ENABLE() __HAL_RCC_USART2_CLK_ENABLE();
#define USARTx_RX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE()
#define USARTx_TX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE()
// 定义串口引脚
#define USARTx_TX_PIN GPIO_PIN_2
#define USARTx_TX_GPIO_PORT GPIOA
#define USARTx_TX_AF GPIO_AF7_USART2
#define USARTx_RX_PIN GPIO_PIN_3
#define USARTx_RX_GPIO_PORT GPIOA
#define USARTx_RX_AF GPIO_AF7_USART2
// 定义串口波特率
#define USARTx_BAUDRATE 115200
// 定义定时器号
#define TIMx TIM3
// 定义定时器时钟
#define TIMx_CLK_ENABLE() __HAL_RCC_TIM3_CLK_ENABLE()
// 定义定时器周期
#define TIMx_PERIOD ((SystemCoreClock / 1000) - 1)
// 定义按键引脚
#define KEY_PIN GPIO_PIN_0
#define KEY_GPIO_PORT GPIOA
#define KEY_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE()
// 定义LED引脚
#define LED_PIN GPIO_PIN_5
#define LED_GPIO_PORT GPIOA
#define LED_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE()
// 定义登录账号和密码
#define USERNAME "admin"
#define PASSWORD "123456"
// 定义状态枚举类型
typedef enum {
STATUS_IDLE = 0,
STATUS_INPUT_USERNAME,
STATUS_INPUT_PASSWORD,
STATUS_LOGIN_SUCCESS,
STATUS_LOGIN_FAILED
} StatusTypeDef;
// 定义全局变量
char username[20] = {0};
char password[20] = {0};
StatusTypeDef status = STATUS_IDLE;
// 定义函数原型
void SystemClock_Config(void);
void GPIO_Init(void);
void USART_Init(void);
void TIM_Init(void);
void TIM_Delay(uint32_t ms);
void USART_SendString(char* str);
void Login(void);
int main(void)
{
// 初始化系统时钟
HAL_Init();
SystemClock_Config();
// 初始化GPIO
GPIO_Init();
// 初始化USART
USART_Init();
// 初始化定时器
TIM_Init();
// 输出欢迎信息
USART_SendString("Welcome to login system!\r\n");
// 进入主循环
while (1)
{
switch (status)
{
case STATUS_IDLE:
// 空闲状态,等待按键触发
if (HAL_GPIO_ReadPin(KEY_GPIO_PORT, KEY_PIN) == GPIO_PIN_RESET)
{
// 按键按下,开始输入账号
status = STATUS_INPUT_USERNAME;
USART_SendString("Please input your username:\r\n");
}
break;
case STATUS_INPUT_USERNAME:
// 输入账号状态,等待串口输入
if (HAL_UART_Receive(&huart2, (uint8_t*)username, 20, 1000) == HAL_OK)
{
// 输入完成,开始输入密码
username[strlen(username)-1] = '\0'; // 删除输入时的回车符
status = STATUS_INPUT_PASSWORD;
USART_SendString("Please input your password:\r\n");
}
break;
case STATUS_INPUT_PASSWORD:
// 输入密码状态,等待串口输入
if (HAL_UART_Receive(&huart2, (uint8_t*)password, 20, 1000) == HAL_OK)
{
// 输入完成,进行登录验证
password[strlen(password)-1] = '\0'; // 删除输入时的回车符
Login();
}
break;
case STATUS_LOGIN_SUCCESS:
// 登录成功,闪烁LED灯3次
for (int i = 0; i < 3; i++)
{
HAL_GPIO_TogglePin(LED_GPIO_PORT, LED_PIN);
TIM_Delay(500);
HAL_GPIO_TogglePin(LED_GPIO_PORT, LED_PIN);
TIM_Delay(500);
}
// 返回空闲状态
status = STATUS_IDLE;
break;
case STATUS_LOGIN_FAILED:
// 登录失败,提示并返回空闲状态
USART_SendString("Username or password is incorrect!\r\n");
status = STATUS_IDLE;
break;
}
}
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Supply configuration update enable
*/
HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
/** Configure the main internal regulator output voltage
*/
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
RCC_OscInitStruct.PLL.PLLM = 8;
RCC_OscInitStruct.PLL.PLLN = 168;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 4;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
{
Error_Handler();
}
}
void GPIO_Init(void)
{
// 初始化按键引脚
GPIO_InitTypeDef GPIO_InitStruct = {0};
KEY_GPIO_CLK_ENABLE();
GPIO_InitStruct.Pin = KEY_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(KEY_GPIO_PORT, &GPIO_InitStruct);
// 初始化LED引脚
LED_GPIO_CLK_ENABLE();
GPIO_InitStruct.Pin = LED_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(LED_GPIO_PORT, &GPIO_InitStruct);
}
void USART_Init(void)
{
huart2.Instance = USARTx;
huart2.Init.BaudRate = USARTx_BAUDRATE;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
USARTx_CLK_ENABLE();
USARTx_RX_GPIO_CLK_ENABLE();
USARTx_TX_GPIO_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = USARTx_TX_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = USARTx_TX_AF;
HAL_GPIO_Init(USARTx_TX_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = USARTx_RX_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Alternate = USARTx_RX_AF;
HAL_GPIO_Init(USARTx_RX_GPIO_PORT, &GPIO_InitStruct);
if (HAL_UART_Init(&huart2) != HAL_OK)
{
Error_Handler();
}
}
void TIM_Init(void)
{
TIM_HandleTypeDef htim;
htim.Instance = TIMx;
htim.Init.Prescaler = 0;
htim.Init.CounterMode = TIM_COUNTERMODE_UP;
htim.Init.Period = TIMx_PERIOD;
htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
TIMx_CLK_ENABLE();
if (HAL_TIM_Base_Init(&htim) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_Base_Start(&htim) != HAL_OK)
{
Error_Handler();
}
}
void TIM_Delay(uint32_t ms)
{
uint32_t ticks = HAL_GetTick() + ms;
while (HAL_GetTick() < ticks)
{
// 等待计时器到达指定时间
}
}
void USART_SendString(char* str)
{
HAL_UART_Transmit(&huart2, (uint8_t*)str, strlen(str), 1000);
}
void Login(void)
{
// 验证账号和密码是否正确
if (strcmp(username, USERNAME) == 0 && strcmp(password, PASSWORD) == 0)
{
// 登录成功
USART_SendString("Login success!\r\n");
status = STATUS_LOGIN_SUCCESS;
}
else
{
// 登录失败
USART_SendString("Login failed!\r\n");
status = STATUS_LOGIN_FAILED;
}
}
```
这段代码实现了一个简单的登录界面,当按下开发板上的按键后,会提示输入用户名和密码,输入完成后进行验证,并根据验证结果闪烁LED灯来表示登录成功或失败。需要注意的是,这里使用了定时器来延时,因为在HAL库中没有提供延时函数。
请根据你的实际情况修改代码中的引脚号、波特率、账号密码等参数。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)