stm32轮询接收字符串控制开关灯

博主在年假前利用STM32单片机进行学习实践,通过串口轮询接收字符串来控制板载灯的开关。示例代码基于STM32RCT6,通过修改库函数实现功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

即将放年假了,公司目前也没有什么事情是我可做的,便买了一块便宜的stm32板子重新系统学下单片机。目前学到了串口轮询接收字符串,例程是stm32板子自带的看门狗例程,可以把看门狗的实现函数和头文件注释掉,以免影响编译。

板子主控:stm32rct6,他们的库函数其实都差不多,适当修改下即可。主要实现代码如下:

while(1)
	{
		if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE) == 1)			//USART_FLAG_RXNE判断数据,== 1则有数据
		{ for(i=0;i<5;i++){
			while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE) == 0);
			USART1_ReceiveData[i] = USART_ReceiveData(USART1);				//通过USART1串口接收字符
		  USART_ClearFlag(USART1,USART_FLAG_RXNE);					//接收后先清空标志位
		}
		}
		if( USART1_ReceiveData[0]=='o' && USART1_ReceiveData[1]=='p' && USART1_ReceiveData[2]=='e' && USART1_ReceiveData[3]=='n')									//如果数据为1,LED1灯电平翻转
		{  
		
			printf("\r\n open light \r\n");
			LED0 =0;	
		}
		
  else if( 'c' == USART1_ReceiveData[0] && USART1_ReceiveData[1]=='l' && USART1_ReceiveData[2]=='o' && USART1_ReceiveData[3]=='s'  && USART1_ReceiveData[4]=='e')									//如果数据为2,LED2灯电平翻转
		{ 
			printf("\r\n close light \r\n");
			LED0=1;
		}
		/*else{
		    
			printf("\r\n input error \r\n");		
		}
		*/
		//USART1_ReceiveData = 0;											//数据清零
	}

usart,h

#ifndef __USART_H
#define __USART_H
#include "stdio.h"	
#include "sys.h" 

//1,增加了对UCOSII的支持
#define USART_REC_LEN  			200  	//定义最大接收字节数 200
#define EN_USART1_RX 			1		//使能(1)/禁止(0)串口1接收
	  	
extern u8  USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符 
extern u16 USART_RX_STA;         		//接收状态标记	
//如果想串口中断接收,请不要注释以下宏定义
void uart_init(u32 bound);
void USART1_Init();
#endif


usart.c

#include "sys.h"
#include "usart.h"	  
// 	 
//如果使用ucos,则包括下面的头文件即可.
#if SYSTEM_SUPPORT_OS
#include "includes.h"					//ucos 使用	  
#endif
 

//加入以下代码,支持printf函数,而不需要选择use MicroLIB	  
#if 1
#pragma import(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE 
{
    
	int handle; 

}; 

FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
_sys_exit(int x) 
{
    
	x = x; 
} 
//重定义fputc函数 
int fputc(int ch, FILE *f)
{
         
	while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
    USART1->DR = (u8) ch;      
	return ch;
}
#
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值