正点原子wifi模块厂家讲解在哪个盘中

使用wifi模块,调试过程中遇到的问题 - OpenEdv-开源电子网 - Powered by Discuz!
OpenEdv-开源电子网
标题: 使用wifi模块,调试过程中遇到的问题
作者: dogwaves& & 时间:
标题: 使用wifi模块,调试过程中遇到的问题
今天下了论坛上战舰提供的wifi模块的例程,并把程序下到战舰stm32F103zet.v2.2的板子里,触摸屏校准之后,一直是“SD Card Failed!”.
这张SD卡是我之前和开发板一起买回来的,之前一直在用,不过最初的内容被我删掉了。
我在想是不是里面的文件不对,所以导致检测不出SD卡。另外,我把战舰资料里的SD卡根目录文件也拷贝进去,还是过不了。
作者: dogwaves& & 时间:
回复【6楼】正点原子:
---------------------------------
谢谢原子哥~~上周五,程序的移植成功了。测试的时候有两个要注意的地方。一个是,字库放的位置,字库的存放路径/SYSTEM/FONT/;第二个,在使用sta模式时,要修改路由器的名字和密码。
作者: dogwaves& & 时间:
另外,我看到文档里说,按KEY0可以强制校准,但似乎没有效果
作者: dogwaves& & 时间:
回复【2楼】dogwaves:
---------------------------------
“SD&Card&Failed!”的问题找到了,原因是SD卡使用的是SDIO模式,V2.2版的上面要注意短接。
现在的问题是一直显示“Font Update Failed!”,还在调试中。
作者: dogwaves& & 时间:
通过检测update_font(20,110,16,"0:")返回值,返回值是8,我发现发现问题是:字库的文件少一个GBK24.BIN 。我在资料里没找到这个文件。
ca9b0e3f1e07a95cf6ebd5_790.png (0 Bytes, 下载次数: 14)
22:54 上传
作者: dogwaves& & 时间:
回复【4楼】dogwaves:
---------------------------------
我尝试用用字库生成软件生成一个新的字库GBK24,可是后缀是.DZK,原子提供的字库后缀是.font
作者: 正点原子& & 时间:
回复【5楼】dogwaves:
---------------------------------
自己手动修改下后缀即可.
作者: dogwaves& & 时间:
目前在我的板子上移植,调试WIFI-STA的功能,遇到了几个问题。
1)程序经常执行到sprintf函数就卡死了。
我看原子哥,都特地为sprintf函数的指针,分配了内存,而我没有这么做。所以,会不会是因为我的指针太长,分配地址时,出了故障。
2)有时候程序刚下好的时候,用网络助手是可以连上的,复位一下,就出现了上面的问题;有时候通过串口住手,我观察到程序运行正常,但是,网络助手连不上。
b049e298bef933cf065f_335.png (0 Bytes, 下载次数: 26)
22:54 上传
6ff37d636f46acd.png (0 Bytes, 下载次数: 23)
22:54 上传
bfbcdf85ed893a003ceb4d9f3.png (0 Bytes, 下载次数: 21)
22:54 上传
作者: dogwaves& & 时间:
回复【8楼】dogwaves:
---------------------------------上面我标注“卡死”的地方,程序经常在这卡住;有时候,第一次下载程序的时候不会有这个问题。
作者: dogwaves& & 时间:
回复【6楼】正点原子:
---------------------------------
原子哥,我目前调试的时候,开启服务器模式,总是不成功,返回值总是为1;其他几条初始化指令都是正常执行的。
(char*)p="AT+CIPSERVER=1,8086";
while(atk_8266_send_cmd(p,"OK",50));
就是上面这一句,之前我有调试成功过,当时比较巧合;而且这个时间“50”我不知道怎么定的?
作者: dogwaves& & 时间:
回复【9楼】dogwaves:
---------------------------------
关于sprintf函数,我查阅了一些资料,是我指针的用法没明白,这里是没有办法把字符串打印进去的,应该是内存分配时出现了问题,会存在偶尔成功的情况。将打印字符串的地方换成数组就能解决,或者向原子的例程一样,分配地址。
欢迎光临 OpenEdv-开源电子网 (http://www.openedv.com/)
Powered by Discuz! X3.2查看: 1321|回复: 6
ESP82266无线WIFI模块问题
主题帖子精华
初级会员, 积分 149, 距离下一级还需 51 积分
在线时间18 小时
最近在学习ESP8266型号的WIFI模块,将原子哥的例程下载进去战舰V3后,lcd屏幕一直在闪动,看提示说KEY0_PRESS 进入STA模式,完全没有作用,程序一直在复位,所以不能往下执行,大家遇到过这种情况??@原子哥@大家
是不是供电不足?
主题帖子精华
金钱123136
在线时间1019 小时
谢谢你,我这只能看看其他的了,原子哥的同一个例程下载在两块战舰V3上,一个能正常执行,不会lcd屏幕闪 ...
是不是供电不足?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子& &
主题帖子精华
中级会员, 积分 461, 距离下一级还需 39 积分
在线时间76 小时
送你个我自己写的ESP8266的程序,三种工作模式,可以参考下各种模式的工作流程,个人感觉自己写的挺清楚的了~~~
ESP8266.c文件上半部分如下:
[C] 纯文本查看 复制代码/*
*******************************************************************************
* 模块名称 : ESP8266 WIFI模块
* 文件名称 : esp8266.c
明 : 实现WIFI模块的客户端与服务器模式的TCP通信
*******************************************************************************
#include &usart3.h&
#include &stdio.h&
#include &stdlib.h&
#include &esp8266.h&
#include &string.h&
#include &delay.h&
#define MAXRECVBUFF
USART3_BUFF
#define DEBUG_EN
//模块工作模式
#define MODULE_SERVER
#define MODULE_CLIENT
#define MODULE_SERCLI
//指令列表
#define AT
#define ATRES
&AT+RST\r\n&
#define ATCIPSERVER
&AT+CIPSERVER=1,%d\r\n&
//服务器模式下,设置端口
#define ATCWMODE
&AT+CWMODE=%d\r\n&
//模块工作模式
#define ATCWMODE_CX
&AT+CWMODE?\r\n&
//查询wifi工作模式
#define ATCWLAPx
&AT+CWLAP\r\n&
//显示无线列表
#define ATCWJAPj
&AT+CWJAP=\&%s\&,\&%s\&\r\n&
//加入无线网络
#define ATCIPMUX
&AT+CIPMUX=1\r\n&
//开启多联模式
#define ATCIPSTART(x)
((x)?&AT+CIPSTART=2,\&TCP\&,\&%s\&,%d\r\n&\
:&AT+CIPSTART=\&UDP\&,\&%s\&,%d\r\n&)
//连接服务器、透传模式
#define ATCIPSEND(x)
((x)?&AT+CIPSEND=%d,%d\r\n&\
:&AT+CIPSEND\r\n&)
//发送数据字节、进入透传模式
#define ATCWSAP
&AT+CWSAP=\&%s\&,\&%s\&,1,%d\r\n&
//创建WIFI热点
#define ATCWSAP_CX
&AT+CWSAP?\r\n&
//查询wifi热点设置信息
#define ATCIPSTO
&AT+CIPSTO=%d\r\n&
//服务器模式下,链接超时时间
#define ATCIPSTATUS
&AT+CIPSTATUS\r\n&
//获得链接状态
#define ATCIPMODE
&AT+CIPMODE=1\r\n&
//透传模式设置
#define CLOSEDTU
//关闭透传
enum order{
_AT = 1,_ATRES,_ATCIPSERVER,_ATCWMODE,
_ATCWMODE_CX,_ATCWLAPx,_ATCWJAPj,_ATCIPMUX,
_ATCIPSTART,_ATCIPSEND,_ATDATA,_SENDDATAEND,
_ATCWSAP,_ATCIPSTO,_ATCWSAP_CX,_ATCIPSTATUS,
_ATCIPMODE,_CLOSEDTU
struct WifiData{
// 命令长度
// 命令类型
static char wifi_Data[MAXRECVBUFF]={0};
static int
wifi_Dlen = 0;
AT+CIPSTATUS
+CIPSTATUS:0,&TCP&,&192.168.4.100&,60154,1
+CIPSTATUS:2,&TCP&,&192.168.10.75&,8080,0
Client_Link_id = ERROR_LINK_ID;
//客户连接的ID号
Server_Link_id = ERROR_LINK_ID;
//服务器连接的ID号
static char Recv_Link_id = ERROR_LINK_ID;
//当有数据来时,记录下ID
static char SearchWifiName[50]=&&;
//需要查询的wifi名
static char Dtu_flay = 0;
//透传状态标志
/*********************************************************
* @function
read_wifi_list
解析wifi列表
接收到的数据
********************************************************/
static int read_wifi_list(char *pData)
node[5]=&&;
int i = wifinum, j = 0;
while(((p = strstr(pNext,&+CWLAP:(&)) != 0) && (i & 25))
wifitype[i] = 0;
wifitype[i] = p[0] - 48;
p = strchr(p,'&'); p++;
for (j = 0; (*p != '&') && (*p != '\0') && (j & 99);++p, ++j){
wifiname[i][j] = *p;
wifiname[i][j] = '\0';
memset(node,0,sizeof(node));
for (j = 0; (*p != ',') && (*p != '\0') && (j & 4);++p, ++j){
node[j] = *p;
node[j] = '\0';
wifimax[i] = atoi(node);
/*********************************************************
* @function
pow库函数的实现,计算num的n次幂,其中n为整数
******************************************************
static int mypow(int Num, int N)
int powint=1;
for(i=1;i&=N;i++) powint*=N
/*********************************************************
* @function
删除字符串中的字串,支持16进制数据,无视结束符
字符串、字符串总长度、开始删除的起始位置、要删除的长度
********************************************************/
static void FreeStr(char *pStr, int pStrsiz, int pHead, int pLen)
int i = 0;
while(pLen--)
for(i = pH i & pSi++)
pStr[i] = pStr[i+1];
pStr[i+1] = '\0';
/*********************************************************
* @function
GetRecvData
提取字符串中跟命令无关的数据
数据和数据长度
********************************************************/
static void GetRecvData(char *pBuff, int *pLen)
int rlen = 0;
char buff[5]=&&;
s32 i = 0;
char *p1 = NULL;
char *p2 = NULL;
if((pBuff == NULL) || (*pLen == 0))
if (((p1 = strstr(pBuff, &+IPD,&)) != 0) && ((p2 = strchr(pBuff, ':')) != 0))
Recv_Link_id = *p1 - '0';
for (i = 0; ((p1-pBuff) & *pLen) && (i & 5) && (*p1 != ':'); ++i,++p1) {
buff[i] = *p1;
buff[i] = '\0';
rlen = atoi(buff);
wifi_Dlen = ((rlen &= (*pLen - (p2 - pBuff)))?(*pLen - (p2 - pBuff)):rlen);
memcpy(wifi_Data, p2,wifi_Dlen);
rlen = wifi_D
p1 = strstr(pBuff, &+IPD,&);
p2 = strchr(pBuff, ':');
rlen += ((p2+1)-p1);
printf(&Rlen:[%d][%d][%d]\r\n&, *pLen,p1-pBuff, rlen);
FreeStr(pBuff, *pLen,p1-pBuff, rlen);
if((*pLen -rlen) &=3)
*pLen = 0;
/*********************************************************
* @function
GetFreeBuff
处理掉缓存中多余的数据,同时也起到延时200ms的作用,
读取数据函数自带延时10ms,所以这里num=20
********************************************************/
static void GetFreeBuff(int num)
char buff[MAXRECVBUFF] = &&;
int siz = 0;
while(num--)
siz = usart3_Receive((u8 *)buff,MAXRECVBUFF);
if(strstr(buff,&\r\nSEND OK\r\n&)){
GetRecvData((char *)buff, &siz);
/*********************************************************
* @function
发送AT指令并接收
wifi:要发送的参数
out:返回的参数
成功返回:_ATOK,失败返回:_ATERROR
********************************************************/
static s8 SendAT(struct WifiData *wifi, char *out, int Delay)
i = 0, j =0;
char buff[MAXRECVBUFF] = &&;
char node[100] = &&;
char *p = NULL;
char *p2 = NULL;
ret = _ATERROR;
#if DEBUG_EN
printf(&\r\n------------------------------\r\n&);
printf(&len[%d]\r\n&, wifi-&olen);
printf(&&&\r\n&);
if(wifi-&type != _ATDATA)
for(i = 0; i& wifi-& i++){
printf(&%c&, wifi-&order[i]);
printf(&&&\r\n&);
GetFreeBuff(2);//20ms,坑爹的不能太快,太快的话模块会返回&busy p...&,坑爹的没法关回显。
usart3_Send((u8 *)wifi-&order,wifi-&olen);
if(wifi-&type == _CLOSEDTU)
ret = _ATOK;
goto ESP8266_SENDATRET;
buff[0]='\0';
siz = 0; i = 0;
while(siz == 0)
siz = usart3_Receive((u8 *)buff,MAXRECVBUFF);
if(i++ & Delay){
ret = _ATERROR;
goto ESP8266_SENDATRET;
#if DEBUG_EN
printf(&\r\n--------------RECV1:[%d]----------------\r\n&,siz);
for(j = 0;j&j++)
printf(&%c&,buff[j]);
printf(&\r\n----------------------------------------\r\n&);
GetRecvData(buff, &siz);
printf(&\r\n-------RECV2:[%d]-------\r\n&,siz);
for(j = 0;j&j++)
printf(&%c&,buff[j]);
printf(&\r\n------------------------\r\n&);
switch(wifi-&type)
case _ATCIPMUX:
case _ATCWSAP:
case _ATCIPSTO:
case _ATCIPSTART:
case _ATCIPSERVER:
case _ATCIPMODE:
if(strstr(buff, &OK&)){
ret = _ATOK;
goto ESP8266_SENDATRET;
}else if(strstr(buff, &ERROR&)) {
ret = _ATERROR;
goto ESP8266_SENDATRET;
case _ATRES:
if(strstr(buff, &OK&))
while(i--)
siz = usart3_Receive((u8 *)buff,MAXRECVBUFF);
for(j = 0; j &j++){
if(buff[j] == 0x00)
buff[j] = '0';
#if (DEBUG_EN == 1)
printf(&\r\nrecv[%d]:\r\n%s\r\n&,siz,buff);
if(strstr(buff, &Ready&) || strstr(buff,&ready&))
ret = _ATOK;
goto ESP8266_SENDATRET;
ret = _ATERROR;
goto ESP8266_SENDATRET;
}else if(strstr(buff, &ERROR&)) {
ret = _ATERROR;
goto ESP8266_SENDATRET;
case _ATCWMODE:
if(strstr(buff, &OK&) || strstr(buff, &no change&)){
ret = _ATOK;
goto ESP8266_SENDATRET;
}else if(strstr(buff, &ERROR&)) {
ret = _ATERROR;
goto ESP8266_SENDATRET;
case _ATCWMODE_CX:
if(strstr(buff,&OK&) && ((p = (char *)strstr(buff,&+CWMODE:&)) != 0))
*out = *p;
ret = _ATOK;
goto ESP8266_SENDATRET;
}else if(strstr(buff, &ERROR&)) {
ret = _ATERROR;
goto ESP8266_SENDATRET;
ret = _ATERROR;
goto ESP8266_SENDATRET;
case _ATCWJAPj:
if(strstr(buff, &OK&) || strstr(buff, &FAIL&)){
ret = _ATOK;
goto ESP8266_SENDATRET;
}else if(strstr(buff, &ERROR&)) {
ret = _ATERROR;
goto ESP8266_SENDATRET;
case _ATCWLAPx:
if(out != NULL)
if(SearchWifiName[0] != 0x00)
if(strstr(buff,(char *)SearchWifiName))
*out = '1';
*out = '0';
if(strstr(buff, &OK&))
ret = _ATOK;
goto ESP8266_SENDATRET;
if(strstr(buff,&+CWLAP:&) && strstr(buff,&OK&)) {
wifinum = read_wifi_list((char *)buff);
ret = _ATOK;
goto ESP8266_SENDATRET;
}else if(strstr(buff,&+CWLAP:&)) {
wifinum = read_wifi_list((char *)buff);
memset(buff, 0, sizeof((char *)buff));
}else if(strstr(buff,&OK&))
ret = _ATOK;
goto ESP8266_SENDATRET;
ret = _ATERROR;
goto ESP8266_SENDATRET;
case _ATCIPSEND:
if(strstr(buff, &link is not&)){
ret = _LINKNOT;
goto ESP8266_SENDATRET;
else if (strstr(buff, &&&)) {
ret = _ATOK;
goto ESP8266_SENDATRET;
} else if (strstr(buff, &ERROR&) || strstr(buff, &busy&)) {
GetFreeBuff(2);
ret = _ATERROR;
goto ESP8266_SENDATRET;
case _ATDATA:
if (strstr(buff, &SEND OK&)) {
if(wifi-&olen & 1460)
GetFreeBuff(300);
ret = _ATOK;
goto ESP8266_SENDATRET;
}else if(strstr(buff, &ERROR&)) {
ret = _ATERROR;
goto ESP8266_SENDATRET;
if(strstr(buff, &Recv&) && strstr(buff, &bytes&)) {
usart3_FreeBuff();
return _ATOK;
case _ATCIPSTATUS:
if(strstr(buff, &OK&))
AT+CIPSTATUS
+CIPSTATUS:0,&TCP&,&192.168.4.100&,60154,1
+CIPSTATUS:2,&TCP&,&192.168.10.75&,8080,0
Server_Link_id = ERROR_LINK_ID;
Client_Link_id = ERROR_LINK_ID;
p2 = strstr(buff,&+CIPSTATUS:&);
//读取一行数据
for(i = 0; (*p2 != '\n') && (i&99); i++, p2++) {
node[i] = *p2;
node[i]='\0';
//printf(&Read Link ID:[%s]\r\n&,node);
if(strstr(node,&OK&))
else if((p = (char *)strstr(node,&+CIPSTATUS:&)) != 0)//提取出连接ID
//if(strstr(node,(char *)UserConfig[SER_IP])) {
if(strstr(node,&192.168.10.71&)) {
Server_Link_id = *p - '0';
printf(&Server_Link_id:[%d]\r\n&,Server_Link_id);
Client_Link_id = *p - '0';
printf(&Client_Link_id:[%d]\r\n&,Client_Link_id);
ret = _ATOK;
goto ESP8266_SENDATRET;
}else if(strstr(buff, &ERROR&)) {
ret = _ATERROR;
goto ESP8266_SENDATRET;
default: ret = _ATERROR; goto ESP8266_SENDATRET;
ESP8266_SENDATRET:
/*********************************************************
* @function
ESP8266_ExecuteOrder
成功返回:_ATOK,失败返回:_ATERROR,超时返回:_ATOTIME
********************************************************/
static s8 ESP8266_ExecuteOrder(char *Order, int len, enum order type, int num, char *pOut)
int i = 0;
int delay_time = 1000;
s8 ret = _ATOTIME;
struct WifiD
if((type == _ATCWLAPx) || (type == _ATCWJAPj) || (type == _ATDATA))
delay_time = 10000;
wifi.order = O
wifi.olen =
wifi.type =
while((ret = SendAT(&wifi, pOut, delay_time)) != _ATOK)
if(ret == _ATERROR) {
if(++i &= num) return _ATERROR;
delay_s(1);
}else return _ATOTIME;
return _ATOK;
/*********************************************************
* @function
ESP8266_init
WIFI初始化
成功返回:_ATOK,失败返回:_ATERROR,超时返回:_ATOTIME
********************************************************/
s8 ESP8266_init(char type)
char at_wifi[100]=&&;
s8 ret = _ATOTIME;
if(_ATOK != (ret = ESP8266_ExecuteOrder(ATRES, strlen(ATRES), _ATRES, 2, NULL)))
goto ESP8266_INITRET;
// 设置工作模式
sprintf(at_wifi, ATCWMODE, (type == MODE_DTU)? MODE_ST: type);
if(_ATOK != (ret = ESP8266_ExecuteOrder(at_wifi, strlen(at_wifi), _ATCWMODE, 2, NULL)))
goto ESP8266_INITRET;
ret = _ATOK;
ESP8266_INITRET:
/*********************************************************
* @function
ESP8266_list_wifi
获取无线列表
成功返回:_ATOK,失败返回:_ATERROR,超时返回:_ATOTIME
********************************************************/
s8 ESP8266_list_wifi(int *pWifiNum)
char num[20]=&&;
struct WifiD
// 显示无线列表
wifi.order = ATCWLAPx;
wifi.olen = strlen(ATCWLAPx);
wifi.type = _ATCWLAPx;
while(_ATERROR == SendAT(&wifi, &num, 1000)) {
if(3 & i++) return -1;
*pWifiNum = atoi(num);
/*********************************************************
* @function
ESP8266_SearchWifiName
查找某个wifi信号
要查找的名字
成功返回:_ATOK,失败返回:_ATERROR,超时返回:_ATOTIME
********************************************************/
s8 ESP8266_SearchWifiName(char *pWifi)
char cwm = 0;
char at_wifi[100] = &&;
s8 ret = _ATOTIME;
if(pWifi == NULL) return -1;
strcpy((char *)SearchWifiName,(char *)pWifi);
// 查询工作模式,如果不是AP兼station模式,就进行修改
if(_ATOK != (ret = ESP8266_ExecuteOrder(ATCWMODE_CX, strlen(ATCWMODE_CX), _ATCWMODE_CX, 2, &cwm)))
goto ESP8266_SEARCHWIFINAME_END;
if(cwm != '3')
// 设置工作模式
sprintf((char *)at_wifi, (char *)ATCWMODE, MODE_SA);
if(_ATOK != (ret = ESP8266_ExecuteOrder(at_wifi, strlen(at_wifi), _ATCWMODE, 2, NULL)))
goto ESP8266_SEARCHWIFINAME_END;
// 查询WIFI
if(_ATOK != (ret = ESP8266_ExecuteOrder(ATCWLAPx, strlen(ATCWLAPx), _ATCWLAPx, 2, &cwm)))
goto ESP8266_SEARCHWIFINAME_END;
if(cwm == '1') ret = _ATOK;
else ret = _ATERROR;
ESP8266_SEARCHWIFINAME_END:
/*********************************************************
* @function
ESP8266_TCP_Client
连接到wifi和服务器,当服务器端口为0时,只连接到wifi
wifi名字、密码、服务器IP、服务器端口
成功返回:_ATOK,失败返回:_ATERROR,超时返回:_ATOTIME
********************************************************/
s8 ESP8266_TCP_Client(struct ESP8266_Config *WifiConfig, char muxlock)
char at_wifi[100] = &&;
s8 ret = _ATOTIME;
if( WifiConfig-&wifi_ssid == NULL ||
WifiConfig-&wifi_pass == NULL ||
WifiConfig-&server_ip == NULL)
if( !strlen(WifiConfig-&wifi_ssid) ||
!strlen(WifiConfig-&wifi_pass) ||
!strlen(WifiConfig-&server_ip))
// 连接到wifi
sprintf((char *)at_wifi,(char *)ATCWJAPj,WifiConfig-&wifi_ssid, WifiConfig-&wifi_pass);
if(_ATOK != (ret = ESP8266_ExecuteOrder(at_wifi, strlen(at_wifi), _ATCWJAPj, 2, NULL)))
goto ESP8266_TCP_CLIENTRET;
// 开启多连模式
if(muxlock)
if(_ATOK != (ret = ESP8266_ExecuteOrder(ATCIPMUX, strlen(ATCIPMUX), _ATCIPMUX, 2, NULL)))
goto ESP8266_TCP_CLIENTRET;
if(WifiConfig-&server_port != 0)
// 连接服务器
sprintf(at_wifi,ATCIPSTART(1),WifiConfig-&server_ip, WifiConfig-&server_port);
if(_ATOK != (ret = ESP8266_ExecuteOrder(at_wifi, strlen(at_wifi), _ATCIPSTART, 2, NULL)))
goto ESP8266_TCP_CLIENTRET;
/* 查询出服务器连接ID号 */
if(_ATOK != (ret = ESP8266_ExecuteOrder(ATCIPSTATUS, strlen(ATCIPSTATUS), _ATCIPSTATUS, 2, NULL)))
goto ESP8266_TCP_CLIENTRET;
ESP8266_TCP_CLIENTRET:
后面还有下半部分,回复有字数限制,我分开发
主题帖子精华
中级会员, 积分 461, 距离下一级还需 39 积分
在线时间76 小时
送你个我自己写的ESP8266的程序,三种工作模式,可以参考下各种模式的工作流程,个人感觉自己写的挺清楚的 ...
[C] 纯文本查看 复制代码ESP8266.c下半部分
/*********************************************************
* @function
ESP8266_TCP_Server
设置服务器基本信息
wifi名字、密码、服务器端口、服务器模式、超时时间
成功返回:_ATOK,失败返回:_ATERROR,超时返回:_ATOTIME
********************************************************/
s8 ESP8266_TCP_Server(struct ESP8266_Config * WifiConfig)
at_wifi[100]=&&;
s8 ret = _ATOTIME;
if( WifiConfig-&ssid == NULL ||
WifiConfig-&pass == NULL ||
WifiConfig-&port == 0)
if( !strlen(WifiConfig-&ssid) ||
!strlen(WifiConfig-&pass))
/* 查询WIFI设置信息,判断是否和当前设置一样,如果不一样,就重新设置 */
// 创建WIFI热点
sprintf(at_wifi, ATCWSAP,WifiConfig-&ssid, WifiConfig-&pass, WifiConfig-&ecn);
if(_ATOK != (ret = ESP8266_ExecuteOrder(at_wifi, strlen(at_wifi), _ATCWSAP, 2, NULL)))
goto ESP8266_TCP_SERVERRET;
if(_ATOK != (ret = ESP8266_ExecuteOrder(ATRES, strlen(ATRES), _ATRES, 2, NULL)))
goto ESP8266_TCP_SERVERRET;
// 开启多连模式
if(_ATOK != (ret = ESP8266_ExecuteOrder(ATCIPMUX, strlen(ATCIPMUX), _ATCIPMUX, 2, NULL)))
goto ESP8266_TCP_SERVERRET;
// 配置为服务器模式,并设置端口号
sprintf(at_wifi,ATCIPSERVER, WifiConfig-&port);
if(_ATOK != (ret = ESP8266_ExecuteOrder(at_wifi, strlen(at_wifi), _ATCIPSERVER, 2, NULL)))
goto ESP8266_TCP_SERVERRET;
// 设置服务器超时时间(s)
sprintf(at_wifi,ATCIPSTO, WifiConfig-&out_time);
if(_ATOK != (ret = ESP8266_ExecuteOrder(at_wifi, strlen(at_wifi), _ATCIPSTO, 2, NULL)))
goto ESP8266_TCP_SERVERRET;
ESP8266_TCP_SERVERRET:
/*********************************************************
* @function
ESP8266_TCP_ServerClient
服务器+客户端模式
wifi名字、密码、服务器端口、服务器模式、超时时间
成功返回:_ATOK,失败返回:_ATERROR,超时返回:_ATOTIME
********************************************************/
s8 ESP8266_TCP_ServerClient(struct ESP8266_Config * WifiConfig, u8 muxlock)
char at_wifi[100]=&&;
s8 ret = _ATOTIME;
if( WifiConfig-&ssid == NULL ||
WifiConfig-&pass == NULL ||
WifiConfig-&port == 0)
return _ATOTIME;
if( !strlen(WifiConfig-&ssid) ||
!strlen(WifiConfig-&pass))
return _ATOTIME;
/* 查询WIFI设置信息,判断是否和当前设置一样,如果不一样,就重新设置 */
// 创建WIFI热点
sprintf(at_wifi,ATCWSAP,WifiConfig-&ssid, WifiConfig-&pass, WifiConfig-&ecn);
if(_ATOK != (ret = ESP8266_ExecuteOrder(at_wifi, strlen(at_wifi), _ATCWSAP, 2, NULL)))
goto ESP8266_TCP_SERVERCLIENTRET;
if(_ATOK != (ret = ESP8266_ExecuteOrder(ATRES, strlen(ATRES), _ATRES, 2, NULL)))
goto ESP8266_TCP_SERVERCLIENTRET;
// 开启多连模式
if(_ATOK != (ret = ESP8266_ExecuteOrder(ATCIPMUX, strlen(ATCIPMUX), _ATCIPMUX, 2, NULL)))
goto ESP8266_TCP_SERVERCLIENTRET;
// 配置为服务器模式,并设置端口号
sprintf(at_wifi,ATCIPSERVER, WifiConfig-&port);
if(_ATOK != (ret = ESP8266_ExecuteOrder(at_wifi, strlen(at_wifi), _ATCIPSERVER, 2, NULL)))
goto ESP8266_TCP_SERVERCLIENTRET;
// 设置服务器超时时间(s)
sprintf(at_wifi,ATCIPSTO, WifiConfig-&out_time);
if(_ATOK != (ret = ESP8266_ExecuteOrder(at_wifi, strlen(at_wifi), _ATCIPSTO, 2, NULL)))
goto ESP8266_TCP_SERVERCLIENTRET;
// 链接到服务器
if(_ATOK != (ret = ESP8266_TCP_Client(WifiConfig, muxlock)))
goto ESP8266_TCP_SERVERCLIENTRET;
ESP8266_TCP_SERVERCLIENTRET:
/*********************************************************
* @function
ESP8266_TCP_ClientDtu
客户端透传模式
wifi名字、密码、服务器端口、服务器模式、超时时间
成功返回:_ATOK,失败返回:_ATERROR,超时返回:_ATOTIME
********************************************************/
s8 ESP8266_TCP_ClientDtu(struct ESP8266_Config * WifiConfig)
char at_wifi[100] = &&;
s8 ret = _ATOTIME;
//设置工作模式
sprintf(at_wifi, ATCWMODE, MODE_ST);
if(_ATOK != (ret = ESP8266_ExecuteOrder(at_wifi, strlen(at_wifi), _ATCWMODE, 2, NULL)))
goto ESP8266_TCP_CLIENTDTU_END;
if(_ATOK != (ret = ESP8266_ExecuteOrder(ATRES, strlen(ATRES), _ATRES, 2, NULL)))
goto ESP8266_TCP_CLIENTDTU_END;
//设置为透传模式
if(_ATOK != (ret = ESP8266_ExecuteOrder(ATCIPMODE, strlen(ATCIPMODE), _ATCIPMODE, 2, NULL)))
goto ESP8266_TCP_CLIENTDTU_END;
//连接到wifi
sprintf((char *)at_wifi,(char *)ATCWJAPj,WifiConfig-&wifi_ssid, WifiConfig-&wifi_pass);
if(_ATOK != (ret = ESP8266_ExecuteOrder(at_wifi, strlen(at_wifi), _ATCWJAPj, 2, NULL)))
goto ESP8266_TCP_CLIENTDTU_END;
if(WifiConfig-&server_port != 0)
// 连接服务器
sprintf((char *)at_wifi,(char *)ATCIPSTART(0),WifiConfig-&server_ip, WifiConfig-&server_port);
if(_ATOK != (ret = ESP8266_ExecuteOrder(at_wifi, strlen(at_wifi), _ATCIPSTART, 2, NULL)))
goto ESP8266_TCP_CLIENTDTU_END;
/* 查询出服务器连接ID号 */
if(_ATOK != (ret = ESP8266_ExecuteOrder(ATCIPSTATUS, strlen(ATCIPSTATUS), _ATCIPSTATUS, 2, NULL)))
goto ESP8266_TCP_CLIENTDTU_END;
//进入透传模式
if(_ATOK != (ret = ESP8266_ExecuteOrder(ATCIPSEND(0), strlen(ATCIPSEND(0)), _ATCIPSEND, 2, NULL))){
Dtu_flay = 0;
goto ESP8266_TCP_CLIENTDTU_END;
} else Dtu_flay = 1;
ESP8266_TCP_CLIENTDTU_END:
/*********************************************************
* @function
ESP8266_DtuOrAT
透传模式与AT模式转换
成功返回:_ATOK,失败返回:_ATERROR,超时返回:_ATOTIME
********************************************************/
s8 ESP8266_DtuOrAT(int offon)
//切换到命令模式
delay_s(2);
ESP8266_ExecuteOrder(CLOSEDTU, strlen(CLOSEDTU), _CLOSEDTU, 0, NULL);
delay_s(2);
//测试是否关闭
return ESP8266_ExecuteOrder(AT, strlen(AT), _AT, 2, NULL);
return _ATOK;
/*********************************************************
* @function
ESP8266_TCP_Read
pout:接收到的数据
pTypeId: 数据来源的ID号
返回数据长度
********************************************************/
int ESP8266_TCP_Read(char *pTypeId, char *pout, int len)
if(!Dtu_flay)
if(wifi_Dlen){
for(i = 0;i& wifi_Dlen && (i & MAXRECVBUFF) && (i & (len-1)); i++) {
pout[i] = wifi_Data[i];
wifi_Data[i] = 0;
pout[i] = '\0';
wifi_Dlen = 0;
= Recv_Link_
GetFreeBuff(1);
if(wifi_Dlen) goto READTCP;
*pTypeId = 2;
return usart3_Receive((u8 *)pout,len);
/*********************************************************
* @function
ESP8266_TCP_Send
发送的地址ID,发送的数据、要发送的字节数
成功返回:_ATOK,失败返回:_ATERROR,超时返回:_ATOTIME
********************************************************/
s8 ESP8266_TCP_Send(u8 pTypeId, char *data, u32 len)
s8 ret = _ATERROR;
at_wifi[100] = &&;
if((len == 0) || (data == NULL)) return -1;
if(pTypeId == ERROR_LINK_ID) return -1;
if(!Dtu_flay)
printf(&%d\r\n&,__LINE__);
// 设置字节数
sprintf(at_wifi, ATCIPSEND(1), pTypeId,len);
printf(&%d\r\n&,__LINE__);
if(_ATOK != (ret = ESP8266_ExecuteOrder(at_wifi, strlen(at_wifi), _ATCIPSEND, 2, NULL)))
printf(&%d\r\n&,__LINE__);
goto ESP8266_TCP_SENDRET;
if(ret == _LINKNOT)
while(-1 == ESP8266_LinkState()) // 查询链接状态
if(3 & i++){
goto ESP8266_TCP_SENDRET;
if((pTypeId == Server_Link_id) || (pTypeId == Client_Link_id)) {
ret = -1; goto ESP8266_TCP_SENDRET;
ret = 1; goto ESP8266_TCP_SENDRET;
printf(&[%d][%d][%s]\r\n&,__LINE__,len,data);
/* 发送数据 */
ret = ESP8266_ExecuteOrder(data, len, _ATDATA, 0, NULL);
printf(&%d\r\n&,__LINE__);
//发送数据
usart3_Send((u8 *)data, len);
ret = _ATOK;
ESP8266_TCP_SENDRET:
/*********************************************************
* @function
ESP8266_LinkState
网络连接状态查询
成功返回:_ATOK,失败返回:_ATERROR,超时返回:_ATOTIME
什么都没连接返回0,服务器连接了,返回1,客户端连接了,返回2,服务器和客户端同时连接了,返回3
********************************************************/
s8 ESP8266_LinkState(void)
s8 ret = _ATERROR;
/* 查询出服务器连接ID号 */
if(_ATOK != (ret = ESP8266_ExecuteOrder(ATCIPSTATUS, strlen(ATCIPSTATUS), _ATCIPSTATUS, 2, NULL)))
goto ESP8266_LINKSTATERET;
if((Server_Link_id != ERROR_LINK_ID) && (Client_Link_id != ERROR_LINK_ID)) {
ret = 3; goto ESP8266_LINKSTATERET;
}else if(Client_Link_id != ERROR_LINK_ID) {
ret = 2; goto ESP8266_LINKSTATERET;
}else if(Server_Link_id != ERROR_LINK_ID) {
ret = 1; goto ESP8266_LINKSTATERET;
ret = _ATOK; goto ESP8266_LINKSTATERET;
ESP8266_LINKSTATERET:
/**************************** ESP9266 END **************************************/
esp8266.h文件
[C] 纯文本查看 复制代码#ifndef __ESP8266_H_
#define __ESP8266_H_
#include &sys.h&
//模块工作模式选择,如果是在客户端模式下,选择station模式,如果是在服务器模式下,选择AP模式
#define MODE_ST
//station 模式
#define MODE_AP
#define MODE_SA
//AP兼station模式
#define MODE_DTU
//station 透传模式
#define TASK_WIFILIST_EN
#define ERROR_LINK_ID
//错误信息
#define _ATOK
//执行成功
#define _ATERROR
//执行错误
#define _ATOTIME
//执行超时
#define _LINKNOT
//服务器模式下,WIFI加密
WIFI_WPA_PSK
WIFI_WPA2_PSK
WIFI_WPA_WPA2_PSK
struct ESP8266_Config{
char *wifi_
//需要连接的WIFI名字
char *wifi_
//需要连接的WIFI密码
//需要设置的WIFI名字
//需要设置的WIFI密码
//热点的端口
//热点的加密方式
char *server_
//服务器IP
//服务器端口
//超时时间(0~28800,单位:秒)
extern char Client_Link_ //客户连接的ID号
extern char Server_Link_ //服务器连接的ID号
ESP8266_init(char type);
ESP8266_TCP_Client(struct ESP8266_Config *WifiConfig, char muxlock);
ESP8266_TCP_ClientDtu(struct ESP8266_Config * WifiConfig);
ESP8266_TCP_Server(struct ESP8266_Config *WifiConfig);
ESP8266_TCP_ServerClient(struct ESP8266_Config * WifiConfig, u8 muxlock);
int ESP8266_TCP_Read(char *pTypeId, char *pout, int len);
ESP8266_TCP_Send(u8 pTypeId, char *data, u32 len);
ESP8266_LinkState(void);
ESP8266_SearchWifiName(char *pWifi);
ESP8266_DtuOrAT(int offon);
main.c文件
[C] 纯文本查看 复制代码#include &string.h&
#include &stdlib.h&
#include &stdio.h&
#include &delay.h&
#include &config.h&
#include &usart1.h&
#include &usart2.h&
#include &usart3.h&
#include &usart4.h&
#include &usart5.h&
#include &esp8266.h&
int main(void)
u8 data[500]=&&;
int ret = 0;
wifi_mode = MODE_ST;
link_id = ERROR_LINK_ID;
delay_init();
usart1_Configuration(115200);
usart3_Configuration(9600);
// wifi usart GPIO initialize.
delay_s(3);
strcpy((char *)Wifi_Server_Ip,&192.168.10.75&);
printf(&Begin ... \r\n&);
while(ESP8266_init(wifi_mode) & 0) {
printf(&ESP8266 error!\r\n&);
delay_s(1);
printf(&start wifi tcp socket...\r\n&);
WifiConfig.wifi_ssid = (u8 *)&TP-LINK_5F4328&;
WifiConfig.wifi_pass = (u8 *)&x&;
WifiConfig.ssid = (u8 *)&GRB_wifi&;
WifiConfig.pass = (u8 *)&&;
WifiConfig.port = 8081;
WifiConfig.ecn = WIFI_WPA2_PSK;
WifiConfig.out_time = 120;
WifiConfig.server_ip = Wifi_Server_Ip;
WifiConfig.server_port = 8080;
switch(wifi_mode)
case MODE_ST:
printf(&ST.........................\r\n&);
while (ESP8266_TCP_Client(&WifiConfig) & 0)
printf(&start wifi tcp socket error!\r\n&);
delay_ms(1000);
case MODE_AP:
printf(&AP.........................\r\n&);
while (ESP8266_TCP_Server(&WifiConfig) & 0)
printf(&start wifi tcp socket error!\r\n&);
delay_ms(1000);
case MODE_SA:
printf(&SA.........................\r\n&);
while (ESP8266_TCP_ServerClient(&WifiConfig) & 0)
printf(&start wifi tcp socket error!\r\n&);
delay_ms(1000);
printf(&start wifi tcp socket ok.\r\n&);
//等待有网络连接
ret = ESP8266_LinkState();
if((ret != -1) && (ret != 0))
else delay_s(3);
//接收数据
ret = ESP8266_TCP_Read(&link_id,data,sizeof(data));
if(ret && (link_id != ERROR_LINK_ID))
printf(&接收到数据:[%d][%s]\r\n&, ret, data);
delay_s(1);
ESP8266_TCP_Send(link_id,(u8 *)&OK&, strlen(&OK&));
主题帖子精华
初级会员, 积分 149, 距离下一级还需 51 积分
在线时间18 小时
送你个我自己写的ESP8266的程序,三种工作模式,可以参考下各种模式的工作流程,个人感觉自己写的挺清楚的 ...
谢谢你,我这只能看看其他的了,原子哥的同一个例程下载在两块战舰V3上,一个能正常执行,不会lcd屏幕闪动,而其他的战舰V3会闪动,就是一直在清屏,一直在复位,
主题帖子精华
新手入门, 积分 24, 距离下一级还需 -4 积分
在线时间5 小时
& && &顶起
主题帖子精华
初级会员, 积分 149, 距离下一级还需 51 积分
在线时间18 小时
是不是供电不足?
是的,没错,供电不足,
Powered by

我要回帖

更多关于 8266wifi模块 的文章

 

随机推荐