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燈閃爍

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章