int main(void) { char *ch; LED_Init(); USART_Init_Config(); while(1) { ch = getchar(); printf("½ÓÊÕµ½µÄÖ¸Á %c \n",ch); switch(ch) { case 'N': GPIO_SetBits(GPIOB,GPIO_Pin_6); printf("ϨÃðLEDµÆ\n"); break; case 'Y': GPIO_ResetBits(GPIOB,GPIO_Pin_6); printf("µãÁÁLEDµÆ \n"); break; default: printf("ÇëÊäÈëÕýÈ·µÄÖ¸ÁNϨÃðµÆ£¬YµãÁÁµÆ!\n"); break; } } }把输入字符替换成字符串,后续也可以通过字符串识别
时间: 2024-01-14 14:02:25 浏览: 31
可以把输入的字符替换成字符串,例如:
```
char input[10]; // 定义一个长度为10的字符数组
fgets(input, 10, stdin); // 从标准输入流中读取字符串,最多读取9个字符,最后一个字符为'\0'
```
然后在 `switch` 语句中,把 `ch` 替换成 `input` 即可识别字符串。例如:
```
switch(input[0]) // 只判断第一个字符
{
case 'N':
GPIO_SetBits(GPIOB,GPIO_Pin_6);
printf("ϨÃðLEDµÆ\n");
break;
case 'Y':
GPIO_ResetBits(GPIOB,GPIO_Pin_6);
printf("µãÁÁLEDµÆ \n");
break;
default:
printf("ÇëÊäÈëÕýÈ·µÄÖ¸ÁNϨÃðµÆ£¬YµãÁÁµÆ!\n");
break;
}
```
相关问题
修改以下程序,使其接收指令后发送一个hello,world字符串。#include "main.h"#include "usart.h"#include "gpio.h"#include "stdio.h"#include "string.h"uint8_t aRxBuffer;void SystemClock_Config(void);int fputc(int ch, FILE *f){ uint8_t temp[1] = {ch}; HAL_UART_Transmit(&huart1, temp, 1, 0xffff);return ch;}int fgetc(FILE * f){ uint8_t ch = 0; HAL_UART_Receive(&huart1,&ch, 1, 0xffff); return ch;}int main(void){ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART1_UART_Init(); /* USER CODE BEGIN 2 */ HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1); user_main_printf(""); /* USER CODE END 2 */ while (1) { }}void SystemClock_Config(void){ RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; 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_DIV2; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL2; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } 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_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) { Error_Handler(); }}void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){ char *pCmd = NULL; uint8_t len; switch(aRxBuffer){ case '1': pCmd = "command 1\r\n"; len = strlen(pCmd); break; case '2': pCmd = "command 2\r\n"; len = strlen(pCmd); break; case '3': pCmd = "command 3\r\n"; len = strlen(pCmd); break; case '4': pCmd = "command 4\r\n"; len = strlen(pCmd); break; default: pCmd = "command cmd\r\n"; len = strlen(pCmd); break; } HAL_UART_Transmit(&huart1, (uint8_t *)pCmd, len,0xFFFF); HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1); }void Error_Handler(void){}#ifdef USE_FULL_ASSERTvoid assert_failed(uint8_t *file, uint32_t line){ }#endif
请修改程序如下:
```
#include "main.h"
#include "usart.h"
#include "gpio.h"
#include "stdio.h"
#include "string.h"
uint8_t aRxBuffer;
void SystemClock_Config(void);
int fputc(int ch, FILE *f) {
uint8_t temp[1] = {ch};
HAL_UART_Transmit(&huart1, temp, 1, 0xffff);
return ch;
}
int fgetc(FILE * f) {
uint8_t ch = 0;
HAL_UART_Receive(&huart1,&ch, 1, 0xffff);
return ch;
}
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);
while (1) {
if (aRxBuffer != 0) {
HAL_UART_Transmit(&huart1, "hello, world\r\n", 14, 0xFFFF);
aRxBuffer = 0;
HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);
}
}
}
void SystemClock_Config(void) {
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
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_DIV2;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL2;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
Error_Handler();
}
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_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) {
Error_Handler();
}
}
void Error_Handler(void) {}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t *file, uint32_t line) {}
#endif
```
修改后的程序会在收到任何字符后发送 "hello, world" 字符串,然后再继续等待下一个字符。
stm32 gy-53-l1测距usart.c代码
以下是使用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缓冲区中,直到接收到换行符或缓冲区已满。然后从缓冲区中解析出距离数据,并打印到串口终端上。最后清空接收缓冲区和状态,并延时一段时间再次发送命令。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.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)