TIM APP Inventor 2+STM32+ESP8266实现局域网互传数据功能(2)

STM32驱动ESP8266实现数据交换

一、串口初始化

void USART1_Config(u32 bt )//串口初始化函数
{
	GPIO_InitTypeDef GPIO_InitStruct;
	USART_InitTypeDef USART_InitStruct;
	NVIC_InitTypeDef NVIC_InitStruct;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
	
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	
	USART_InitStruct.USART_BaudRate=bt;//波特率设置
	USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
	USART_InitStruct.USART_Mode=USART_Mode_Rx|USART_Mode_Tx ;
	USART_InitStruct.USART_Parity=USART_Parity_No;
	USART_InitStruct.USART_StopBits=USART_StopBits_1 ;
	USART_InitStruct.USART_WordLength=USART_WordLength_8b ;
	USART_Init(USART1,&USART_InitStruct);
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	NVIC_InitStruct.NVIC_IRQChannel=USART1_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority=0;
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;         
	NVIC_Init(&NVIC_InitStruct);
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
  	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);   
	USART_Cmd(USART1,ENABLE);	
}

二、串口发送函数

  • 发送一个字符
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)//发送一个字符
{
	USART_SendData(pUSARTx,ch);
	while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
}
  • 发送字符串
void Usart_SendString( USART_TypeDef * pUSARTx, char *str)//发送字符串
{
		unsigned int k=0;
		do {
					Usart_SendByte( pUSARTx, *(str + k) );
					k++;
			}	
		while (*(str + k)!='\0');
		while (USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET) {}
}

三、串口接收函数

char receive_str[50]={0x00};//接收缓存数组
unsigned char receive_flag;//接受缓存数组标志位
void USART1_IRQHandler(void) //将接收到的数据存入接收缓存数组中,方便后面对接收内容进行判断
{	
		uint8_t ucTemp;
		if (USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
		{
				ucTemp=USART_ReceiveData(USART1);
				receive_str[receive_flag]= ucTemp;
				if(USART_ReceiveData(USART1)=='\n')
				{
					receive_flag=0;
				}
				else 
				{
					receive_flag=receive_flag+1;
				}
		}
}

四、ESP8266配置程序

  • AT指令发送函数
void AT_SEND(char  *str)
{
	Usart_SendString( USART1,str);
	Usart_SendByte( USART1, '\r');
	Usart_SendByte( USART1, '\n');
}
  • ESP8266初始化函数
char AT_CWMODE[]="AT+CWMODE=2";//设置为AP模式
char AT_CWSAP[]="\"ATKESP8266\",\"134134134\",1,4";//WIFI名字和密码以及加密方式和通道
char AT_RST[]="AT+RST"; //初始化模块
char AT_CIPMUX[]="AT+CIPMUX=1";//设置为多连接模式
char AT_CIPSERVER[]="AT+CIPSERVER=1,8086";//开启server模式,通道号为8086
char AT_CIPSTO[]="AT+CIPSTO=2880";//设置服务器超时时间为2880s
char AT_CIFSR[]="AT+CIFSR";//获取本地IP地址
char AT_CIPSEND[]="AT+CIPSEND=0,20";//发送给0号用户,20个字节


void ESP8266_Init()//ESP8266初始化函数
{
	AT_SEND(AT_CWMODE);
	Delay_ms(300);
	AT_SEND(AT_CWSAP);
	Delay_ms(300);
	AT_SEND(AT_RST);
	Delay_ms(500);
	AT_SEND(AT_CIPMUX);
	Delay_ms(300);
	AT_SEND(AT_CIPSERVER);
	Delay_ms(300);
	AT_SEND(AT_CIPSTO);
	Delay_ms(300);
	AT_SEND(AT_CIFSR);
	Delay_ms(300);
}

延时函数可以采用for循环的形式,此处就不给延时函数了。
经过测试延时200或者300毫秒都不会影响初始化,可自行修改。

五、接收比较函数

接收缓存字符串与该字符串进行比较,如果存在指定字符串就返回1否则返回0

unsigned char Compare_Receive(char *str)
{
 	 char *st_p=str;
	unsigned char i;
	  for(i=0;i<(50-1);i++)
	  {
			    if(*st_p == receive_str[i])
				   	 {
						      st_p++;     
							 if(*st_p == '\0')     
							    {
							        return 1;               
			     				 }
   					 }
   				 else
				    {
				      st_p=str; 
				    }
 	 }
  return 0;          
}

六、应用

以上代码基本完成,但是如何使用呢?

请看主函数

char PIPD_code[]="+IPD,";
char Search_code1[]="Search_A_1";
int main(void)
{
		USART1_Config(115200);	
		ESP8266_Init();
		receive_flag=0;
		 while(1)
			{
				if(Compare_Receive(PIPD_code))
				{
						if(Compare_Receive(Search_code1))
								{
										LED1_ON;//可改为你想实现的任何功能
										Clear(receive_str);//清除接收缓存
								}
				}
			}
}

以上就是STM32与ESP8266通信的全部内容,下一句我们使用MIT APP Inventor编写APP实现WIFI局域网控制LED灯闪烁

  • 4
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
以下是一个简单的STM32+ESP8266温湿度PWM控制风扇的main函数示例,供您参考: ```c #include "stm32f10x.h" #include "esp8266.h" #include "dht11.h" #define FAN_PIN GPIO_Pin_12 #define FAN_PORT GPIOB int main(void) { // 初始化时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 初始化GPIO GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = FAN_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(FAN_PORT, &GPIO_InitStructure); // 初始化定时器 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = 5999; TIM_TimeBaseStructure.TIM_Prescaler = 719; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); // 初始化PWM TIM_OCInitTypeDef TIM_OCInitStructure; TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 0; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC3Init(TIM3, &TIM_OCInitStructure); // 启动定时器 TIM_Cmd(TIM3, ENABLE); TIM_CtrlPWMOutputs(TIM3, ENABLE); // 初始化ESP8266 ESP8266_Init(); // 初始化DHT11 DHT11_Init(); while (1) { // 获取温湿度数据 DHT11_Read_Data(); float temperature = DHT11_Data[2]; float humidity = DHT11_Data[0]; // 将温度和湿度发送到服务器 char buf[64]; sprintf(buf, "AT+CIPSEND=0,%d\r\n", strlen(buf)); ESP8266_Send_AT_Command(buf); sprintf(buf, "Temperature: %.2f C, Humidity: %.2f %%", temperature, humidity); ESP8266_Send_Data(buf); // 根据温度和湿度控制风扇 if (temperature > 25.0) { TIM_OCInitStructure.TIM_Pulse = 3000; TIM_OC3Init(TIM3, &TIM_OCInitStructure); } else if (humidity > 60.0) { TIM_OCInitStructure.TIM_Pulse = 2000; TIM_OC3Init(TIM3, &TIM_OCInitStructure); } else { TIM_OCInitStructure.TIM_Pulse = 0; TIM_OC3Init(TIM3, &TIM_OCInitStructure); } // 等待10秒 Delay(10000); } } ``` 这个main函数中包含了以下几个主要步骤: 1. 初始化时钟和GPIO,使能PWM输出引脚,初始化定时器和PWM输出模式。 2. 初始化ESP8266模块,连接WiFi网络。 3. 初始化DHT11温湿度传感器,读取温湿度数据。 4. 将温湿度数据发送到服务器。 5. 根据温湿度数据控制风扇的PWM输出,实现温湿度控制风扇的功能。 6. 等待一段时间后重复上述步骤。 需要注意的是,这个示例代码中的ESP8266和DHT11驱动函数需要自行实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值