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灯闪烁

你可能感兴趣的:(stm32)