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;
}
}
}
void AT_SEND(char *str)
{
Usart_SendString( USART1,str);
Usart_SendByte( USART1, '\r');
Usart_SendByte( USART1, '\n');
}
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灯闪烁