这里用到开发板为stm32f103,wifi模块为ESP8266,实验目的是PC机建立一个TCP server,ESP8266作为Client加入到此网络中,要求每次开发板启动时自动完成对Wifi模块的初始化
**目录:
定时器使用的是timer4,设置为每一秒产生中断,两个串口都要打开,其中串口2用于和PC端连接,串口1和wifi模块相连。这里与wifi模块用四根杜邦线连接,其中两根分别连接3.3V和GND分别对应开发板的管脚。PC10、PC9分别连接ESP8266的TX、RX管脚。至此,工程配置完成。
定时器的设置及初始化在此不再赘述,这里主要讲一下AT指令,首先看一下要用到的AT指令
用于是否连通,若是返回OK
这里有必要说一下,数字为1时表示为STA模式,只能加入到已有的网络
2表示为AP模式,类似于手机热点,可以让其他的终端加入到此网络
3表示同时兼容AP和STA模式
wifi模块可以同时连接多个TCP Server,这里我们设置为0,建立单连接,性能比较优越
8.用TCP方式连接服务器:AT+CIPSTART=”TCP”,”192.168.31.32”,3456
TCP前省略了一个参数,因为是单连接,这里就不用指定服务器ID了
9.Client发送数据:AT+CIPSEND=size
size是发送数据的位数,如果想要发送“123”,即size=3
这里可以设置成透传模式,即一直让模块传送数据,这样不必每次发送指令和指定大小,指令如下:
1.AT+CIPMODE=1
2.AT+CIPSEND
以上就是需要掌握的AT指令,放一张结构图,比较简陋,大家将就着看
意思就是只需要在F103内部写一个用串口1发送的函数,里面存放用于控制Wifi模块的AT指令就可以完成Wifi 的初始化
部分代码如下
char Test[]="AT\r\n";
char JoinWifi[]="AT+CWJAP=\"gjq\",\"12345678\"\r\n";
char TestJoin[]="AT+CWJAP?\r\n";
char SimpleConnect[]="AT+CIPMUX=0\r\n";
char JoinServer[]="AT+CIPSTART=\"TCP\",\"192.168.43.13\",3456\r\n";
char Mode[]="AT+CIPMODE=1\r\n";
char ModeSend[]="AT+CIPSEND\r\n";
这里把用到的指令用字符串存储起来,方便调用,大家也可以定义一个二维数组,会更简便一点,这里有个大坑!!!每个AT指令后面都要加上“\r\n”!!!(敲黑板!!!)
void command(char f[])
{
int i=strlen(f);
HAL_UART_Transmit(&huart1,f,i,1000);
HAL_Delay(2000);
}
定义一个command函数,用于发送AT指令,这里用到的是串口1
command(Test);
command(JoinWifi);
command(TestJoin);
command(SimpleConnect);
command(JoinServer);
command(Mode);
command(ModeSend);
分别发送AT指令,完成Wifi模块初始化
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart==&huart1)
{
HAL_UART_Receive_IT(&huart1,&my_re_buf1[++pt_w1],1);
}
if(huart==&huart2)
{
HAL_UART_Receive_IT(&huart2,&my_re_buf2[++pt_w2],1);
}
}
以上是串口的接收中断,分别用于接收Wifi数据(huart1)和串口助手输入的数据(huart2)
uint8_t my_re_buf1[2000];
uint8_t my_re_buf2[2000];
uint16_t pt_w1=1,pt_w2=0,pt_r1=1,pt_r2=0;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim==&htim4)
{
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);
while(pt_r1=pt_w1)
{
pt_w1=pt_r1=0;
}
while(pt_r2=pt_w2)
{
pt_w2=pt_r2=0;
}
}
}
这里把串口的两个发送都写到了定时器的溢出中断里,翻转小灯,向Wifi模块发送数据(huart1)以及向串口助手发送数据(huart2),这里的关键在于下面的while语句,用于判断每次的接收是否完全发送出去然后重置读指针和写指针,至此,Keil主要代码编写完成
我用的是SOCKET调试助手,类似的工具都可以,让PC机加入一个Wifi,然后查看本机的IP地址,打开SOCKET调试助手建立TCP Server,之后修改Keil里相应的AT指令,编译下载,界面如图所示
至此,stm32f103就可以自动完成对Wifi模块的初始化