精华内容
下载资源
问答
  • 7046T并不是一款简单的串口wifi模块,它具有Modbus TCP、自定义注册报、自定义协议转化等多种高级功能,非常适合于物联网应用。只有wifi接口,功耗低,待机功耗3.8mA,全速工作95mA。7046T的高级功能包括:支

    串口无线模块ZLSN7046T是上海卓岚推出的wifi转串口模块。它能够将wifi信号转化为串口信号,且支持多种功能,邮票孔封装,体积小巧可以外置天线或者内置天线。7046T支持一个UART TTL电平串口转WIFI,可以作为STA或者AP方式。支持921.6Kbps的高波特率。7046T并不是一款简单的串口转wifi模块,它具有Modbus TCP、自定义注册报、自定义协议转化等多种高级功能,非常适合于物联网应用。只有wifi接口,功耗低,待机功耗3.8mA,全速工作95mA。7046T的高级功能包括:支持Modbus转RTU、支持多主机同时访问而不冲突、支持自定义心跳包和注册包功能、支持“转码”自定义协议的读取和转化功能、支持http方式的数据提交和下发功能、支持TCP服务器客户端共存。支持使用zlvircom工具跨网段搜索设备,支持远程升级和网页自定义下载。支持二进制格式的类AT指令,无需切换为AT配置模式。ZLSN7046TN支持P2P通讯方式。
    硬件上7046T采用了最新的WIFI芯片组,采用ARM M4内核,主频192MHz,采用实时操作系统。其中ZLSN7046T-5支持连接5.8G的WIFI热点。wifi模式支持802.11b/g/n,支持WEP64/128, TKIP, AES, WPA, WPA2, WAPI加密模式。7046T和计算机连接上同一个AP时,计算机和模块可以互相连通。7046T具有很强的接收灵敏度,在内置天线情况下室内可以达到70~100米通讯距离。7046T满足ROSH要求。
    7046T供电电压为3.3V,具有丰富的外部功能引脚,包括485发送控制脚、运行指示灯、数据活动指示灯、TCP连接指示灯、wifi工作模块指示灯、wifi连接指示灯等。
    特点
    支持802.11b/g/n。
    支持硬件流控CTS/RTS和软件流控XON/XOFF。
    支持在系统通过网口升级程序。
    支持模块之间的wifi对连。
    一键搜索配置。当wifi和PC或者路由器建立链路后,通过ZLVircom软件一键式搜索和配置设备参数,设备IP和PC不必处于同一个网段。
    支持DNS解析,支持作为DHCP Client,作为AP模式时也可以作为DHCP Server。
    支持TCPServer、TCP Client、UDP、UDP组播。作为Server时支持多达30个TCP连接同时和联网模块通信;作为Client时可以连接到7个目的IP。
    支持设备连接上发送MAC地址功能,方便云端管理设备。
    支持远程通过软件查看设备的TCP连接状态、串口数据发送、接收状态。虚拟串口支持数据监视功能。
    支持Modbus网关功能,支持Modbus RTU转Modbus TCP。可以支持存储型的Modbus,可以自动采集设备数据,并存储起来;也支持非存储模式的Modbus网关。
    支持多主机功能:在一问一答的查询方式下,支持网口端允许有多台计算机同时访问同一个串口设备。
    支持自定义心跳包和注册包功能:可以方便和云端进行通信和设备识别。
    支持TCP建立连接需要密码验证的功能,保证连接安全性。
    支持“转码”功能,可以实现对特定设备的协议的翻译工作,让不同的设备对接统一的软件平台。
    支持http方式的数据提交和下发功能,云端可以直接使用http的GET指令和设备的串口数据进行交互。

    展开全文
  • ESP8266串口WiFi模块

    万次阅读 多人点赞 2017-08-10 15:37:59
    参考和学习《ESP8266串口WIFI模块的基本使用》点击打开链接 ESP8266是一款超低功耗的UART-WiFi 透传模块,可将用户的物理设备连接到Wi-Fi 无线网络上,进行互联网或局域网通信,实现联网功能。 把硬件联网之后,...

    参考和学习《ESP8266串口WIFI模块的基本使用》点击打开链接

    ESP8266是一款超低功耗的UART-WiFi 透传模块,可将用户的物理设备连接到Wi-Fi 无线网络上,进行互联网或局域网通信,实现联网功能。


    把硬件联网之后,就再也不是“玩单机”了。配合服务器端的Socket网络编程,可以玩许多东西。所以我觉得WiFi模块是连接软件(网络编程)与硬件(单片机)的桥梁,把我所学的单片机和Web知识联系起来了。


    模块引脚和连线:




    实际接线:


    打开sscon4.2测试版,然后将CH_PD引脚的3.3V电源断了重接进行复位,若串口打印乱码后看到“ready”,说明模块上电初始化正常。如下:


    无法出现“ready”表示上电初始化成功。波特率调整为9600即可!如下:


    关于免冷启动下载器




    上图来自《AT指令集》


    关于WiFi模式这里要说明一下:

    sta模式下模块相当于客户端,像我们手机平板一样是要去连接路由器的;

    AP模式下模块相当于路由器,是发射WiFi被别人连的。

    sta模式连接WiFi演示


    操作:



    AP模演示

    连完WiFi那接下来就“开WiFi”吧!AP模式和手机开热点一样,只需设置WiFi名称和密码即可。



    TCP/IP相关AT指令

    透传模式下WiFi模块与服务器TCP网络通讯演示

    利用调试工具“网络调试助手”(软件在资料包中)即可创建一个TCP服务器,实现服务端对指定端口监听TCP连接请求。

    见识了TCP透传的强大,只要再稍微学习一下socket网络编程,那么对于通过单片机串口收发数据实现的功能,现在都可以通过自己编写服务器上的TCP程序来实现。当第一次在命令行看到打印的串口数据、体验到网络互通的魅力时,就知道——“WiFi门锁”有戏了!

    实现如下:



    透传模式此处的表现为:进入透传模式后,sscom4.2串口调试助手退出向8266模块发送指令,发送的是给服务器的字符;退出透传模式后,发送的字符就是给8266模块的命令!

    我们常互联网互联网,那两个连接到互联网的设备该如何相互“交流”呢?TCP连接就是其中一种最常用的方式。TCP是面向连接的传输层协议,通信双方都要实现TCP协议,其中一方只需目标ip地址和端口号就能发起连接,连接一旦建立,就像在双方之间拉了一条管子,管子两端可进行全双工(双向同时收发)通信。

    TCP是传输层协议,是在网络层IP协议的基础上封装而来。而这些封装的实现细节也是与我们无关,我们只需使用系统所提供的相关接口“拿来即用”,比如网络编程中的SocketESP8266模块中也实现了TCP/IP协议栈,模块作为客户端可轻松使用AT指令向服务端发起TCP连接。连接TCP服务器并开启透传模式后,模块串口收到的数据就会通过TCP连接透传到服务端,这样就完成了数据从硬件串口通过网络到程序进程的传输,实现软硬结合。

    脑洞大些:

    挖掘ESP8266串口WiFi模块在生活中的应用:

    比如共享单车的技术……

    采用此技术实现对四轮驱动视觉识别机械臂抓取的应用!

    WiFi控制无人机

    WiFi控制无人自动驾驶平衡自行车


    思考:如何将遥控器前后左右控制或者计算机键盘左右前后控制量通过WiFi控制四轮驱动机器人??

    这不就是可以坐在电脑前遥控无人机技术嘛!!




















    展开全文
  • ESP8266 WIFI串口通信模块应该是使用最广泛的一种WIFI模块之一了。为什么呢? 因为ESP8266模块是一款高性能的WIFI串口模块,可以不用知道太多WIFI相关知识就可以很好的上手。说白了,只是个WIFI转串口的设备,你...

    物联网,万物互联。这里涉及到的最基本的东西就是如何将所有的物联网设备连接在一起。最简单、最广泛使用的就是互联网。

    ESP8266 WIFI串口通信模块应该是使用最广泛的一种WIFI模块之一了。为什么呢?

    因为ESP8266模块是一款高性能的WIFI串口模块,可以不用知道太多WIFI相关知识就可以很好的上手。说白了,只是个WIFI转串口的设备,你只要知道串口怎么编程使用,就可以了,实现了所谓的透明传输。

    但是就是这么一个很常见的模块,网上很多的博客写的都是错的,或者都是很不详细的。

     

    模块名称:ESP8266 WIFI串口通信模块

    参考资料:ESP8266 WIFI串口通信模块官方资源ATK-ESP8266资源包(提取码: nhsh)

    知识储备:【STM32】串口通信基本原理(超基础、详细版)

    其他模块:USB转TTL模块

    项目下载链接:见本文文末

     

    WIFI模块的调试

    准备工作

    USB转TTL模块与ESP8266 WIFI模块的接线:

    现在市面上使用比较的ESP8266有两个版本,分别是官方的ESP8266(两排8引脚)、ATK-ESP8266(一排6引脚)。其实并没有太大的区别,只是将其中的一些引脚进行额外布局而已。

    如果是官方的ESP8266模块,接线方式如下:

    如果是ATK-ESP8266(正点原子)模块,接线方式如下:

    这六个引脚只需要4个就行了:RXD、TXD、GND、VCC,分别和USB转TTL模块的TXD、RXD、GND、VCC相连接就行了。

    需要注意两点:

    1、ESP8266的RXD(数据的接收端)需要连接USB转TTL模块的TXD,TXD(数据的发送端)需要连接USB转TTL模块的RXD,这是基本的;

    2、关于VCC的选取,在USB转TTL模块上有3.3V和5V两个引脚可以作为VCC,但是一般选取5V作为VCC。如果选取3.3V,可能会因为供电不足而引起不断的重启,从而不停的复位。

    AT指令

    在使用USB转TTL模块与电脑连接之后,就可以使用串口调试助手进行WIFI模块的调试了。首先有一点,AT指令不区分大小写,均以回车、换行结尾。下面介绍常用的AT指令:

    常用AT指令
    指令名 响应 含义
    AT OK 测试指令
    AT+CWMODE=<mode> OK 设置应用模式(需重启生效)
    AT+CWMODE? +CWMODE:<mode> 获得当前应用模式
    AT+CWLAP +CWLAP:<ecn>,<ssid>,<rssi> 返回目前的AP列表
    AT+CWJAP=<ssid>,<pwd> OK 加入某一AP
    AT+CWJAP? +CWJAP:<ssid> 返回当前加入的AP
    AT+CWQAP OK 退出当前加入的AP
    AT+CIPSTART=<type>,<addr>,<port> OK 建立TCP/UDP连接
    AT+CIPMUX=<mode> OK 是否启用多连接
    AT+CIPSEND=<param> OK 发送数据
    AT+CIPMODE=<mode> OK 是否进入透传模式

    需要补充几点:

    1、ESP8266的应用模式:ESP266支撑单AP模式、单STA模式和混合模式。简单的来说就是:

    • AP:可以将ESP8266作为热点,可以让其他的设备连接上它;
    • STA:可以连接上当前环境下的WIFI热点。

    2、什么是透传模式?

    透传就是指不需要关心wifi协议是如何实现的。所需要做的就是A通过串口发数据,B通过串口收数据,整个过程中A串口和B串口就像是用导线直接连接起来了一样。则对于开发人员来看,就是完全透明的。

    更简单地理解就是:

    如果不开启透传模式,我们怎么发送数据呢?在每次发送数据前都必须先发送指令AT+CIPSEND=<param>,例如:

    AT+CIPSEND=4
    
    OK
    >                //在 > 后面输入要上传的数据

    但是一旦开启了透传模式,我们就不需要在每次发送数据前都发送指令AT+CIPSEND=<param>了,只需要发送一次AT+CIPSEND,之后发送的所有内容全部当成是数据了!

    但是这也存在一个问题,要是我后来又想发送命令了,但是却也当成是数据发送过去了。这可怎么办?

    这就要退出透传模式了。怎么退出,发送数据"+++"就可以了。注意:此时“+++”后面,不接“发送新行”!

     

    WIFI模块的使用

    ESP8266的一般使用顺序

    这里的“一般”指的是:ESP8266连接当前环境的热点,与服务器建立TCP连接,传输数据。

    1. AT+CWMODE=1:设置工作模式(STA模式)
    2. AT+RST:模块重启(生效工作模式)
    3. AT+CWJAP="111","11111111":连接当前环境的WIFI热点(热点名,密码)
    4. AT+CIPMUX=0:设置单路连接模式
    5. AT+CIPSTART="TCP","xxx.xxx.xxx.xxx",xxxx:建立TCP连接
    6. AT+CIPMODE=1:开启透传模式
    7. AT+CIPSEND:透传模式下,传输数据
    8. +++:退出透传模式

    ESP8266的封装代码

    关于与单片机的引脚连接:ESP8266与USART3(引脚PB10、PB11)连接。

    首先是USART的配置:

    #include "delay.h"
    #include "usart3.h"
    #include "stdarg.h"	 	 
    #include "stdio.h"	 	 
    #include "string.h"	 
    #include "timer.h" 
    
    //串口接收缓存区 	
    u8 USART3_RX_BUF[USART3_MAX_RECV_LEN]; 				//接收缓冲,最大USART3_MAX_RECV_LEN个字节.
    u8  USART3_TX_BUF[USART3_MAX_SEND_LEN]; 			//发送缓冲,最大USART3_MAX_SEND_LEN字节
    
    //通过判断接收连续2个字符之间的时间差不大于10ms来决定是不是一次连续的数据.
    //如果2个字符接收间隔超过10ms,则认为不是1次连续数据.也就是超过10ms没有接收到
    //任何数据,则表示此次接收完毕.
    //接收到的数据状态
    //[15]:0,没有接收到数据;1,接收到了一批数据.
    //[14:0]:接收到的数据长度
    vu16 USART3_RX_STA=0;   	
    
    
    void USART3_IRQHandler(void)
    {
    	u8 res;	      
    	if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)//接收到数据
    	{	 
    		res =USART_ReceiveData(USART3);		 
    		if((USART3_RX_STA&(1<<15))==0)//接收完的一批数据,还没有被处理,则不再接收其他数据
    		{ 
    			if(USART3_RX_STA<USART3_MAX_RECV_LEN)	//还可以接收数据
    			{
    				TIM_SetCounter(TIM7,0);//计数器清空          				//计数器清空
    				if(USART3_RX_STA==0) 				//使能定时器7的中断 
    				{
    					TIM_Cmd(TIM7,ENABLE);//使能定时器7
    				}
    				USART3_RX_BUF[USART3_RX_STA++]=res;	//记录接收到的值	 
    			}else 
    			{
    				USART3_RX_STA|=1<<15;				//强制标记接收完成
    			} 
    		}
    	}  				 											 
    }   
    
    
    //初始化IO 串口3
    //pclk1:PCLK1时钟频率(Mhz)
    //bound:波特率	  
    void usart3_init(u32 bound)
    {  
    
    	NVIC_InitTypeDef NVIC_InitStructure;
    	GPIO_InitTypeDef GPIO_InitStructure;
    	USART_InitTypeDef USART_InitStructure;
    
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	// GPIOB时钟
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); //串口3时钟使能
    
     	USART_DeInit(USART3);  //复位串口3
    		 //USART3_TX   PB10
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB10
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
      GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB10
       
        //USART3_RX	  PB11
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
      GPIO_Init(GPIOB, &GPIO_InitStructure);  //初始化PB11
    	
    	USART_InitStructure.USART_BaudRate = bound;//波特率一般设置为9600;
    	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
    	USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
    	USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
    	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
    	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式
      
    	USART_Init(USART3, &USART_InitStructure); //初始化串口	3
      
    
    	USART_Cmd(USART3, ENABLE);                    //使能串口 
    	
    	//使能接收中断
      USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启中断   
    	
    	//设置中断优先级
    	NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级3
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
    	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器
    	
    	
    	TIM7_Int_Init(1000-1,7200-1);		//10ms中断
    	USART3_RX_STA=0;		//清零
    	TIM_Cmd(TIM7,DISABLE);			//关闭定时器7
    
    }
    
    //串口3,printf 函数
    //确保一次发送数据不超过USART3_MAX_SEND_LEN字节
    void u3_printf(char* fmt,...)  
    {  
    	u16 i,j; 
    	va_list ap; 
    	va_start(ap,fmt);
    	vsprintf((char*)USART3_TX_BUF,fmt,ap);
    	va_end(ap);
    	i=strlen((const char*)USART3_TX_BUF);		//此次发送数据的长度
    	for(j=0;j<i;j++)							//循环发送数据
    	{
    	  while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET); //循环发送,直到发送完毕   
    		USART_SendData(USART3,USART3_TX_BUF[j]); 
    	} 
    }

    由于在USART3中是通过判断接收连续2个字符之间的时间差不大于10ms来决定是不是一次连续的数据,而10ms怎么定呢?通过定时器来的,所以我们需要开启定时器:

    #include "timer.h"
    
    extern vu16 USART3_RX_STA;
    
    //定时器7中断服务程序		    
    void TIM7_IRQHandler(void)
    { 	
    	if (TIM_GetITStatus(TIM7, TIM_IT_Update) != RESET)//是更新中断
    	{	 			   
    		USART3_RX_STA|=1<<15;	//标记接收完成
    		TIM_ClearITPendingBit(TIM7, TIM_IT_Update  );  //清除TIM7更新中断标志    
    		TIM_Cmd(TIM7, DISABLE);  //关闭TIM7 
    	}	    
    }
     
    //通用定时器7中断初始化,这里时钟选择为APB1的2倍
    //arr:自动重装值 psc:时钟预分频数
    //定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
    //Ft=定时器工作频率,单位:Mhz 
    //通用定时器中断初始化 
    void TIM7_Int_Init(u16 arr,u16 psc)
    {	
    	NVIC_InitTypeDef NVIC_InitStructure;
    	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7, ENABLE);//TIM7时钟使能    
    	
    	//定时器TIM7初始化
    	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	
    	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
    	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
    	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
    	TIM_TimeBaseInit(TIM7, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
     
    	TIM_ITConfig(TIM7,TIM_IT_Update,ENABLE ); //使能指定的TIM7中断,允许更新中断
    	
    	TIM_Cmd(TIM7,ENABLE);//开启定时器7
    	
    	NVIC_InitStructure.NVIC_IRQChannel = TIM7_IRQn;
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;//抢占优先级0
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;		//子优先级2
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
    	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器
    	
    }

    这两个都完成了之后,就可以向ESP8266传输数据了:

    #include "esp8266.h"
    #include "string.h"
    #include "usart.h"
    #include "usart3.h"
    #include "stm32f10x.h"
    #include "sys.h" 
    #include "delay.h"
    
    //ESP8266模块和PC进入透传模式
    void esp8266_start_trans(void)
    {
    	//设置工作模式 1:station模式   2:AP模式  3:兼容 AP+station模式
    	esp8266_send_cmd("AT+CWMODE=1","OK",50);
    	
    	//让Wifi模块重启的命令
    	esp8266_send_cmd("AT+RST","ready",20);
    	
    	delay_ms(1000);         //延时3S等待重启成功
    	delay_ms(1000);
    	delay_ms(1000);
    	delay_ms(1000);
    	
    	//让模块连接上自己的路由
    	while(esp8266_send_cmd("AT+CWJAP=\"111\",\"11111111\"","WIFI GOT IP",600));
    	
    	//=0:单路连接模式     =1:多路连接模式
    	esp8266_send_cmd("AT+CIPMUX=0","OK",20);
    	
    	//建立TCP连接  这四项分别代表了 要连接的ID号0~4   连接类型  远程服务器IP地址   远程服务器端口号
    	while(esp8266_send_cmd("AT+CIPSTART=\"TCP\",\"xxx.xxx.xxx.xxx\",xxxx","CONNECT",200));
    	
    	//是否开启透传模式  0:表示关闭 1:表示开启透传
    	esp8266_send_cmd("AT+CIPMODE=1","OK",200);
    	
    	//透传模式下 开始发送数据的指令 这个指令之后就可以直接发数据了
    	esp8266_send_cmd("AT+CIPSEND","OK",50);
    }
    
    //ESP8266退出透传模式   返回值:0,退出成功;1,退出失败
    //配置wifi模块,通过想wifi模块连续发送3个+(每个+号之间 超过10ms,这样认为是连续三次发送+)
    u8 esp8266_quit_trans(void)
    {
    	u8 result=1;
    	u3_printf("+++");
    	delay_ms(1000);					//等待500ms太少 要1000ms才可以退出
    	result=esp8266_send_cmd("AT","OK",20);//退出透传判断.
    	if(result)
    		printf("quit_trans failed!");
    	else
    		printf("quit_trans success!");
    	return result;
    }
    
    
    //向ESP8266发送命令
    //cmd:发送的命令字符串;ack:期待的应答结果,如果为空,则表示不需要等待应答;waittime:等待时间(单位:10ms)
    //返回值:0,发送成功(得到了期待的应答结果);1,发送失败
    u8 esp8266_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
    {
    	u8 res=0; 
    	USART3_RX_STA=0;
    	u3_printf("%s\r\n",cmd);	//发送命令
    	if(ack&&waittime)		//需要等待应答
    	{
    		while(--waittime)	//等待倒计时
    		{
    			delay_ms(10);
    			if(USART3_RX_STA&0X8000)//接收到期待的应答结果
    			{
    				if(esp8266_check_cmd(ack))
    				{
    					printf("ack:%s\r\n",(u8*)ack);
    					break;//得到有效数据 
    				}
    					USART3_RX_STA=0;
    			} 
    		}
    		if(waittime==0)res=1; 
    	}
    	return res;
    } 
    
    
    //ESP8266发送命令后,检测接收到的应答
    //str:期待的应答结果
    //返回值:0,没有得到期待的应答结果;其他,期待应答结果的位置(str的位置)
    u8* esp8266_check_cmd(u8 *str)
    {
    	char *strx=0;
    	if(USART3_RX_STA&0X8000)		//接收到一次数据了
    	{ 
    		USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加结束符
    		strx=strstr((const char*)USART3_RX_BUF,(const char*)str);
    	} 
    	return (u8*)strx;
    }
    
    //向ESP8266发送数据
    //cmd:发送的命令字符串;waittime:等待时间(单位:10ms)
    //返回值:发送数据后,服务器的返回验证码
    u8* esp8266_send_data(u8 *cmd,u16 waittime)
    {
    	char temp[5];
    	char *ack=temp;
    	USART3_RX_STA=0;
    	u3_printf("%s",cmd);	//发送命令
    	if(waittime)		//需要等待应答
    	{
    		while(--waittime)	//等待倒计时
    		{
    			delay_ms(10);
    			if(USART3_RX_STA&0X8000)//接收到期待的应答结果
    			{
    				USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加结束符
    				ack=(char*)USART3_RX_BUF;
    				printf("ack:%s\r\n",(u8*)ack);
    				USART3_RX_STA=0;
    				break;//得到有效数据 
    			} 
    		}
    	}
    	return (u8*)ack;
    } 

    最后是主程序:

    #include "delay.h"
    #include "sys.h"
    #include "usart.h"
    #include "usart3.h"
    #include "esp8266.h"
    #include "string.h"
    #include "timer.h"
     
    /*
    项目的主要内容:STM32配合ESP8266模块与服务器数据交互
    
    ESP8266的连接:USART3(PB10、PB11)
    
    如何判断数据接收完全?
    1、出现了换行符;
    2、如果超过10ms了都没有下一条数据(TIM7来进行10ms的定时)。
    */
    
    
     int main(void)
     {		
    	delay_init();	    	 			//延时函数初始化	  
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 			//设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    	uart_init(115200);	 				//串口初始化为115200
    	usart3_init(115200);	 				//串口初始化为115200
    
    	esp8266_start_trans();							//esp8266进行初始化
    	 
    	esp8266_send_data("12",50);
    	 
    	esp8266_quit_trans();
    
     	while(1)
    	{
    		
    	}
     }

    完整项目链接:

    百度云盘链接: https://pan.baidu.com/s/1LKjJL06fHyt1O5p9Jxmbig 提取码: p8yn 

    展开全文
  • 安卓与ESP8266串口WIFI模块的通信实现

    千次阅读 多人点赞 2019-04-27 17:58:01
    软件简介 结合一个控制实例,简要介绍一下安卓客户端软件。 主界面非常简洁,左边一个方向控制盘,和右边4个Button。...串口WiFi模块配置成tcp Service模式,然后安卓连接串口wifi模块的热点,客...

    软件简介

    结合一个控制实例,简要介绍一下安卓客户端软件。

    主界面非常简洁,左边一个方向控制盘,和右边4个Button。方向盘是一个自定义的View,可以转动任意角度,程序里只响应4个方向,已经足够。四个Button分别对应相应的功能键。

     

    通信实现原理

    使用基于tcp协议的socket通信。串口WiFi模块配置成tcp Service模式,然后安卓连接串口wifi模块的热点,客户端作为tcp client 连接。连接成功后就可以相互发送数据。

     

    具体实现

    串口WiFi模块配置成tcp Service模式,IP设置为192.168.4.1,端口号3824。

    (安卓需要先连接到串口WiFi模块所创建的热点。)

    客户端的连接方式如下:

        private void Connect() {
            // 开启线程来发起网络请求
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        socket = new Socket();
                        socket.connect(new InetSocketAddress(HOST, PORT), 4000);
                        if(socket != null){
                            Message message = new Message();
                            message.what = CONNECTED_RESPONSE;
                            handler.sendMessage(message);
                        }
                    }catch (IOException ex) {
                        ex.printStackTrace();
                        Message message = new Message();
                        message.what = RESPONSE_TIMEOUT;
                        handler.sendMessage(message);
                    }
                }
            }).start();
        }

    网络操作需要在非UI线程中进行。程序开启一个线程进行连接操作,连接结果通过一个Handler通知主线程,以便UI更新连接状态指示。

    连接成功之后,就可以发送数据:

        private void TCPSend(final String data) {
            if(socket == null)
                return;
            // 开启线程来发起网络请求
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        PrintWriter writer = new PrintWriter(socket.getOutputStream());
                        writer.println(data);
                        writer.flush();
                    }catch (IOException ex){
                        ex.printStackTrace();
                        Message message = new Message();
                        message.what = SEND_RESPONSE;
                        // 将服务器返回的结果存放到Message中
                        message.obj = "操作失败!";
                        handler.sendMessage(message);
                    }
                }
            }).start();
        }

    同样的,开启一个线程来进行网络操作,结果也是通过Handler通知主线程。

     

    UI交互界面的响应

    网络操作结果的响应通过一个Handler来完成:

        private Handler handler = new Handler() {
            // 在这里进行UI操作,将结果显示到界面上
            public void handleMessage(Message msg) {
                switch (msg.what) {
                    case CONNECTED_RESPONSE:
                        bt_connect.setTextColor(Color.parseColor("#216F02"));
                        bt_connect.setText("已连接");
                        bt_connect.setClickable(false);
                        disconnect.setTextColor(Color.BLACK);
                        disconnect.setClickable(true);
                        break;
                    case RESPONSE_TIMEOUT:
                        Toast.makeText(getApplicationContext(),"连接失败!", Toast.LENGTH_SHORT).show();
                    case RECEIVER_RESPONSE:
                    case SEND_RESPONSE:
                    default:
                        break;
                }
            }
        };

    如果连接成功,那么"连接"Button将变成灰色"已连接",且不可点击,"断开连接"将变成可点击,以表明当前是连接状态。

    如果连接失败,就弹出一个Toast通知用户:

     

    Button的点击响应如下:

       @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.button_connect:
                    Connect();
                    break;
                case R.id.button_disconnect:
                    try {
                        socket.close();
                    }catch (IOException e){
                        e.printStackTrace();
                    }
                    socket = null;
                    bt_connect.setTextColor(Color.BLACK);
                    bt_connect.setText("连接");
                    bt_connect.setClickable(true);
                    disconnect.setTextColor(Color.GRAY);
                    disconnect.setClickable(false);
                    break;
                case R.id.button_auto:
                    TCPSend("auto\r\n");
                    btnAuto.setEnabled(false);
                    btnDisAuto.setEnabled(true);
                    break;
                case R.id.button_dis_auto:
                    TCPSend("hand\r\n");
                    btnDisAuto.setEnabled(false);
                    btnAuto.setEnabled(true);
                    break;
                default:
                    break;
            }
        }

    为防止重复的点击操作,在点击相应按钮后,根据当前状态,把相应的按钮设置成可点击或不可点击状态。

    方向操纵杆的响应:

    rockerViewLeft.setOnShakeListener(RockerView.DirectionMode.DIRECTION_4_ROTATE_45, new RockerView.OnShakeListener() {
                    @Override
                    public void onStart() {
                        mLogLeft.setText("停");
                    }
    
                    @Override
                    public void direction(RockerView.Direction direction) {
                        String message = "";
                        switch (direction) {
                            case DIRECTION_LEFT:
                                message = "左转";
                                TCPSend("left\r\n");
                                break;
                            case DIRECTION_RIGHT:
                                message = "右转";
                                TCPSend("right\r\n");
                                break;
                            case DIRECTION_UP:
                                message = "前进";
                                TCPSend("forward\r\n");
                                break;
                            case DIRECTION_DOWN:
                                message = "后退";
                                TCPSend("back\r\n");
                                break;
                            case DIRECTION_CENTER:
                            default:
                                break;
                        }
                        mLogLeft.setText(message);
                    }
                    @Override
                    public void onFinish() {
                        mLogLeft.setText("停");
                        TCPSend("stop\r\n");
                    }
                });

    操纵杆红点会跟随触摸位置而改变,上方有相应的状态指示,并且松手后会自动滑回中间的停止状态。

     

    END

     

    展开全文
  • W24 WiFi模块编程及其应用zip,W24 WiFi模块编程及其应用
  • Linux串口编程,结合ESP8266WIFI模块,实现开发板之间的wifi通信。本工程使用c语言对串口进行编程,运用read,write函数对串口进行AT指令发送以及数据传输。同时,也包含了对termios结构体的运用。
  • 由于本人一直从事医学信息处理与医学物联网设备研发,硬件联网一直以来都是比较麻烦的事情,而通过使用 ESP8266 这款WiFi模块,仅需要通过串口使用AT指令控制,就能满足大部分的网络功能需求。本文通过简单介绍及...
  • ESP8266EX 串口WIFI无线模块

    千次阅读 2019-05-06 13:45:29
    支持cloud server development/固件和sdk,用于快速片上编程 升级固件 UART Download/OTA(通过网络) 网络协议 IPV4 、 TCP/UDO/HTTP/FTP 安全机制 WPA/WPA2 加密类型 WEP/TKIP/...
  • 单独测试 ...AT //检测wifi模块是否一安装 AT+CWMODE=1 //STA模式 AT+CWJAP="pengchun","p2952870" //连接wifi热点 AT+CIPSTART="TCP","120.77.58.34",8700 //建立TCP连接 AT+CIPSEND=8...
  • 本篇文章正式对arduino d1 wifi模块进行编程。硬件是arduino D1 wifi模块(WeMos D1),开发环境是arduino 1.8.11。分析了源代码,也提供了源代码下载链接。只是这样还不够,本文还提供了一个解决编译成功却连接不...
  • 器通过无线网络远程配置模块参数 更高的传输性能,最高可达 11KB/S 的发送速率 应用领域  智能公交网络,如无线刷卡机  小额金融支付网络,如无线 POS 机  工业设备联网,如无线传感器  物联网
  • 模块参考购买:...amp;id=45511771023&amp;ns=1&amp;abbucket=5#detail参考的硬件电路 核心模块和核心模块的外围电路图:wifi模块作为客户端1) 设置 WIFI 模式:AT+CWMODE=1 //设置为...
  • 在我们这个信息爆炸式增长...刚好今年公司出了4G转WiFi路由器板卡模块。插卡上电就能上网。本来老家就拉有宽带,套餐送了不限流量电话卡。直接跟博晶网络公司申请了一个4G路由器插上在宿舍用。简单操作,最重要的是可以
  • 串口WiFi的调试心得

    千次阅读 2015-03-02 13:47:12
    物联网WiFi的使用,配置等分享
  • WIFI编程之客户端TcpClient

    热门讨论 2013-04-09 19:59:13
    基于Visual C++ 6.0编写,使用WINDOWS SOCKETS实现,用于我所买的WIFI模块(串口转WIFI),里面的IP和端口是我的串口WIFI模块,使用时必须修改。
  • ESP-01 ESP-07 ESP-07S ESP-12S ESP-12F相关及入门资料
  • wifi模块开发项目

    万次阅读 2017-03-02 20:35:38
    网上有关利用wifi模块来开发项目的资料,我百度了,但是觉得很少,大多是在电脑上利用串口调试助手来发送AT指令来调试wifi,还有就是和wifi固件编程有关,所以现在我就得利用自己已有的工具和知识来开发项目。...
  • ESP8266系列WIFI模块的使用

    千次阅读 2019-09-09 16:58:16
    ESP8266是由乐鑫公司出品的一款物联网芯片,因为价格较低,性能稳定等收到很大关注。该芯片可工作于三种种模式下,分别是:AP模式,STA模式以及AP+STA...ESP8266 WIFI串口通信模块应该是使用最广泛的一种WIFI模块...
  • 37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一...
  • esp8266 wifi模块的使用

    千次阅读 多人点赞 2017-07-12 16:03:49
    这两天,我们的项目卡在了无线模块的使用上,今天总算是有...那么现在问题来了,电脑需要做什么,wifi模块需要做什么,单片机又怎么和wifi模块进行数据交换呢?  一步步来分析。先从整体来看,我们通过什么手段来达成
  • WIFI模块使用心得

    千次阅读 2017-05-23 13:20:09
    WIFI模块有四种模式:默认模式、串口到以太网模式、串口到WIFI client模式、串口到WIFI AP模式。 如何进入网页设置界面: 1、复位出厂设置后,模块处于默认模式,通模块的以太网口。 2、登录模块产生的热点,...
  • 便宜的wifi模块就一定好吗

    千次阅读 2018-10-09 10:49:07
    早上接到一客户电话询问,为什么网上有卖几块钱的wifi网卡模块,我们的智能家居AP路由wifi模块却要几十块钱,满怀委屈的我来为您分析: wifi模块是wifi领域无线模块的一个统称。可以按照各种类别细分到各个小的分支...
  • 实验参考: https://www.arduino.cn/thread-82298-1-1.html#425316_2.3-%E7%83%A7%E5%BD%95esp8266 ... 实验原理:ESP8266可编程 第一步:安装软件开发环境 1、安装Arduino IDE 官网:https://www.arduin...
  • ESP8266 wifi模块开发汇总

    千次阅读 多人点赞 2018-10-23 08:35:19
    ESP8266 wifi模块开发汇总   ESP8266 wifi模块开发汇总本文档主要介绍开发者在ESP8266开发中常见的一些问题。 这些问题主要包括以下几大类: 基本概念相关 ESP8266 相关 AiCloud 相关 固件编译调试相关 文档...
  • 模块只需要一个外部3.3V电源。MT7688芯片组集成了1T1R 802.11n Wi-Fi无线电台, 580MHz MIPS?24KEc?CPU, 1端口快速以太网物理层,USB2.0主机,SD-XC, I2S/PCM和多个低速IOs在一个SOC。 MT7628支持两种操作模式...
  • ESP8266WIFI模块了解一下(新手入门级别)

    万次阅读 多人点赞 2018-05-01 10:02:51
    安信可ESP8266WIFI模块了解一下 ESP8266是有乐鑫公司开发的一套高度集成的WIFI芯片,可以方便进行而二次开发。乐鑫是ESP8266的芯片厂商,安信可是依据ESP8266生产模组,并提供一系列开发方案的厂家。 接...
  • ESP8266+WIFI模块+无线收发模块+透传模块+串口远距离+开发板.zip
  • 包含LGSR WIFI资源介绍、操作视频、串口编程注意事项、应用例子、问答和STM32及STC串口示例。可以使用lgsr-wifi模块零基础,零设置快速开发单片机联网应用。
  • 基于STM32的wifi模块连接实现

    热门讨论 2016-01-12 15:57:45
    使用ESP8266 wifi模块与STM32连接,提供C语言版的ESP8266库函数,并用串口打印实时连接状态,实现smartlink和TCP连接功能,亲自编写,测试可用。
  • WIFI转串口无线传输模块,个人体会

    千次阅读 2012-11-16 11:18:58
    WIFI模块可以认为是一个带AP的无线网卡,有两个工作模式。 1.AP模式:它可以作为“路由器”,多个设备连接到它,相互通信; 2.也可以作为无线网卡,连接到真实的无线路由器热点,进入网络,为他的宿主设备提供和...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,130
精华内容 852
关键字:

串口wifi模块编程