单片机通过串口发送AT指令控制ESP8266连接服务器—Station模式

单片机发送AT指令控制ESP8266连接WIFI和服务器

把电脑发送AT指令的活交给单片机去干,单片机通过TX发送AT指令,这里用到的是普通的串口发送程序,ESP8266接收到AT指令后开始执行,把应答信息通过TX发送到单片机的RX,如果单片机有写接收中断,则可在串口助手中看到应答信息,如果没写,则单片机接收不到应答

在这里插入图片描述

这里先不用中断接收应答,可以换一种方法测试ESP8266是否有连上服务器,也叫白盒测试,可将ESP8266的TX接到CH340的RX上,而CH340连接着电脑,这样ESP8266的应答信息就可以通过TX发送到CH340的RX上,然后可通过安信可串口助手查看到应答信息

在这里插入图片描述

出现问题:

注意:如果采用上图这种连法,单片机发送AT指令,到达ESP8266,执行后的应答信息通过TX发送到CH340的RX,然后经过USB口理应在电脑串口助手上看到应答信息,但实际却是串口助手没有接收到应答信息,什么信息都没有!

这问题也困惑了挺久,反复查看接线,通过STC-ISP串口查看单片机TX发送的信息也是正常的,程序也没问题

问题解决:

后来发现,将单片机的供电插到电脑USB口,再次打开单片机,就可以在安信可串口助手看到ESP8266的应答信息了,这种供电方法需要开发板上有CH340模块,可以USB转TTL才行,接线如下:

在这里插入图片描述

为什么?

因为单片机一开始由充电宝单独供电时,是不与模块共地的,所以通讯时的基准就不一样,就无法通信;由电脑供电后,单片机与电脑是共地的,而CH340也插到了电脑上,ESP8266地线接到了CH340上(用能接负载的CH340为ESP8266供电),所以单片机、ESP8266、CH340、电脑都是共地的,此时单片机发送的AT指令便能被ESP8266接收到,ESP8266把应答信息通过TX发送到CH340的RX上,CH340再将应答信息发到电脑上串口调试助手显示

可看到应答信息,这里连接服务器返回ERROR应答是因为还没开启服务器

在这里插入图片描述

同时,开启STC-ISP的串口助手后,也可以查看单片机通过数据线发送的AT指令信息,这里的端口号与上面的安信可串口助手的不一样,说明这些指令是通过数据线传到电脑的

在这里插入图片描述

注意串口号要选对,因为此时有两个CH340的串口号连接电脑,一个是单片机板子自带的CH340芯片,一个是ESP8266的外接USB转TTL模块

最后,体验一下完整过程

在这里插入图片描述

服务器收到AT指令数据是因为,单片机的程序是循环执行的,在第一次连上服务器并开启透传模式后,再发送的AT指令就被当成了普通数据传输到服务器上

程序:

#include <REGX52.H>
#include "string.h"

#define size 12
unsigned char rec[size];

//AT指令
code char LJWF[] ="AT+CWJAP=\"315-WC-WFI\",\"fuweiyuan\"\r\n";
code char LJFWQ[] ="AT+CIPSTART=\"TCP\",\"172.30.168.50\",8880\r\n";
char TCMS[] = "AT+CIPMODE=1\r\n";
char SJCS[] = "AT+CIPSEND\r\n";
char AT[] = "AT\r\n";
char RST[] = "AT+RST\r\n";
char CWQAP[]="AT+CWQAP";
char CIFSR[]="AT+CIFSR";

/**
  * @brief延时1ms
  * @param无
  * @retval无
  */
void Delay1ms(unsigned int num)		//@11.0592MHz
{
	unsigned char i, j;
	while(num--)
	{
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
	}
}

/**
  * @brief串口初始化
  * @param无
  * @retval无
  */
void Uart_Init()		//9600
{
	PCON &= 0x7F;		//波特率不倍增
	SCON = 0x50;		//工作方式1,8位UART,REN=1,允许串行接收控制位
	TMOD &= 0x0F;		//高位清0
	TMOD |= 0x20;		//定时器1为8位自动重装载
	TH1 = 0xFD;		//波特率9600
	TL1 = 0xFD;
	ET1 = 0;			//禁止定时器1中断
	TR1 = 1;			//开启定时器1
	ES = 1;				//开启串行中断
	EA = 1;				//开启总中断	
}

/**
  * @brief串口发送一个字符
  * @param发送的数据
  * @retval无
  */
void Uart_SendChar(unsigned char Data)
{
	SBUF = Data;
	while(!TI);
	TI = 0;
}

/**
  * @brief串口发送一个字符串
  * @param发送的字符串
  * @retval无
  */
void Uart_SendString(char* str)
{
	while(*str != '\0')
	{
		Uart_SendChar(*str);
		str++;
	}
}
/**
 * @brief白盒测试主要是发送AT指令控制ESP8266,逻辑在main函数里,与中断没什么关系
  * @param无
  * @retval无
  */
void main()
{
	unsigned int i = 0;
	unsigned int j = 0;
	Usart_Init();
	while(1)
	{
		Delay1ms(3000);
		Uart_SendString(AT);
		Delay1ms(3000);
		for(;i<1;i++)
		{
			Uart_SendString(RST);
		}
		for(;j<3;j++)
		{
			Delay1ms(3000);
			Uart_SendString(LJWF);
			Delay1ms(8000);
			Uart_SendString(LJFWQ);
			Delay1ms(6000);
			Uart_SendString(TCMS);
			Delay1ms(6000);
			Uart_SendString(SJCS);
			Delay1ms(6000);
		}
	}
}


  • 6
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是ESP8266模块初始化程序的示例代码: ```c #include <SoftwareSerial.h> SoftwareSerial espSerial(2, 3); // 设置软串口接收和发送引脚 void setup() { Serial.begin(9600); // 初始化串口通信 espSerial.begin(115200); // 初始化ESP8266模块的波特率为115200 delay(1000); // 等待ESP8266模块启动完成 espSerial.println("AT"); // 发送AT指令,检查ESP8266模块是否正常工作 delay(1000); // 等待ESP8266模块响应 if (espSerial.find("OK")) { // 如果ESP8266模块响应了"OK" Serial.println("ESP8266 module is working properly."); // 输出信息 } else { Serial.println("ESP8266 module is not responding."); // 输出错误信息 } espSerial.println("AT+CWMODE=1"); // 设置ESP8266模块为Station模式 delay(1000); // 等待ESP8266模块响应 espSerial.println("AT+CWJAP=\"SSID\",\"password\""); // 连接WiFi网络 delay(5000); // 等待ESP8266模块连接WiFi网络 if (espSerial.find("OK")) { // 如果ESP8266模块连接WiFi网络成功 Serial.println("WiFi network is connected."); // 输出信息 } else { Serial.println("Failed to connect WiFi network."); // 输出错误信息 } } void loop() { // your code here } ``` 这个程序初始化了ESP8266模块的软串口,并设置ESP8266模块的波特率为115200。然后程序发送AT指令,检查ESP8266模块是否正常工作。如果ESP8266模块响应了"OK",则输出信息;否则输出错误信息。接着程序设置ESP8266模块为Station模式,并连接WiFi网络。如果ESP8266模块连接WiFi网络成功,输出信息;否则输出错误信息。 你需要将上述代码中的"SSID"和"password"替换成你所连接WiFi网络的名称和密码。另外,在实际使用中,你还需要根据具体需求修改程序中的"loop()"函数,实现你的具体功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值