当前位置: 首页 > news >正文

stm32实现esp8266连接到TCP服务器(二)未完

1.2 连接到TCP Server

                1.2.1 使用网络助手,设立TCP服务器

编辑

                1.2.2 连接服务器

AT+CIPSTART="TCP","192.168.1.18",8080 //指令,注意双引号逗号都要半角(英文)输入 CONNECT //结果:成功 OK //结果:成功
OK

                1.2.3 发送数据

AT+CIPSEND=4 //设置即将发送数据的长度

>abcd        //看到大于号后,输入消息,abcd,不要带回车

Response :SEND OK //结果:成功

//注意,这种情况下,每次发送前都要线发送AT+CIPSEND=长度,的指令,在发数据!

1.3 透传

用AT + CIPSEND = 4,每次发送数据都要进行字符长度设定

今天透传模式

AT+CIPMODE=1 //开启透传模式

Response :OK

AT+CIPSEND //带回车

Response: > //这个时候随意发送接收数据咯

退出透传模式

 在透传发送数据过程中,若识别到单独的⼀包数据 “+++”,则退出透传发送

头文件

#include "sys.h"
#include "esp8266.h"
#include "string.h"
#include "delay.h"
#include "stdarg.h"
uint8_t esp8266_tx_buf[ESP8266_TX_BUF_SIZE];
uint8_t esp8266_rx_buf[ESP8266_RX_BUF_SIZE]; uint16_t esp8266_cnt = 0 ,esp8266_cntPre = 0; /* esp8266接收缓冲区 */UART_HandleTypeDef esp8266_handle;             /* esp8266句柄 */

esp8266模块串口配置初始化

//正常会有启动的流程只是作为一个串口的初始化
void esp8266_uart_init(uint16_t baudrate)
{esp8266_handle.Instance = USART2;                  /* USART1 */esp8266_handle.Init.Baudrate = baudrate;           /*波特率*/esp8266_handle.Init.WordLength= UART_WORDLENGTH_8B;/*字长为8位的数据格式传输*/esp8266_handle.Init.StopBits = UART_STOPBITS_1;    /*一个停止位*/ esp8266_handle.Init.Parity   = UART_PARITY_NONE;                   /*无奇偶校验位*/esp8266_handle.Init.HwFlowCtl = UART_HWCONTRL_NONE;/*无硬件流控制*/esp8266_handle.Init.Mode      = UART_MODE_TX_RX;   /*收发模式*/HAL_UART_Init(esp8266_handle);
}

清除接收缓存

void esp8266_rx_clear(void)
{memset(esp8266_rx_buf,0,sizeof(esp8266_rx_buf));esp8266_cnt = 0;
}

中断服务函数

void USART2_IRQHandler(void)
{uint8_t receive_data = 0;/* 获取接收RXNE标志位是否被置位 */if(__HAL_UART_GET_FLAG(&esp8266_handle,UART_FLAG_RXNE) !=RESET){/* 则将接收计数器清零 */if(esp8266_cnt >=sizeof(esp8266_rx_buf))esp8266_cnt = 0;/* 接收一个字符 */HAL_UART_Receive(&esp8266_handle,&receive_data, 1,1000);/* 将接收到的字符保存在接收缓冲区 */esp8266_rx_buf[esp8266_cnt++] = receive_data;
}/* 获取接收空闲中断标志位是否被置位 */if(__HAL_UART_GET_FLAG(&esp8266_handle,UART_FLAG_IDLE) != RESET){/* 将接收到的数据打印出来 */printf("recv: %s\r\n", esp8266_rx_buf);esp8266_rx_clear();      /* 清除UART总线空闲中断 */__HAL_UART_CLEAR_IDLEFLAG(&esp8266_handle)
}
}

接收等待

uint8_t esp8266_wait_receive(void)
{if(esp8266_cnt == 0)return ESP8266_ERROR;if(esp8266_cnt == esp8266_cntPre){esp8266_cnt = 0;return ESP8266_EOK;}esp8266_cntPre = esp8266_cnt;return ESP8266_ERROR;
}

发送命令与期待回复函数

uint8_t esp8266_send_command(char *cmd,cahr *res)
{uint8_t timeout_out = 250;esp8266_rx_clear();//防止缓冲区内的数据影响HAL__UART_Tramsmit(&esp8266_handle,(uint8_t *)cmd,strlen(cmd),100);while(timeout_out--)//不停的等待{if(esp8266_wait_receive() == ESP8266_EOK){if(strstr(const char *)esp8266_rx_buf, res) != NULL)//判断是否又有期待的字符串return ESP8266_EOK
}return ESP8266_ERROR;
}
}

接收数据

void esp8266_receiv_data(void)
{if(esp8266_wait_receive() = ESP8266_EOK){printf("esp8266 recv: %s\r\n",esp8266_rx_buf);esp8266_rx_clear();}
}

发送不定长数据

void esp8266_send_data(char *fmt, ...)
{va_list ap;uint16_len;va_start(ap,fmt);vsprintf((char *)esp8266_tx_buf,fmt,ap);va_end(ap);len = strlen((const char*)esp8266_tx_buf);HAL__UART_Transmit(&esp8266_handle,esp8266_tx_buf,len,100);// 发送
}

at测试指令

uint8_t esp8266_at_test(void)
{return esp8266_send_command("AT\r\n", "OK");//记得加回车
}

模式设置函数封装

uint8_t esp8266_set_mode(uint8_t mode)
{switch(mode)
{case ESP8266_STA_MODE:return esp8266_send_command("AT+CWMODE=1\r\n");case ESP8266_AP_MODE:return esp8266_send_command("AT+CWMODE=2\r\n");case ESP8266_STA_AP_MODE:return esp8266_send_command("AT+CWMODE=3\r\n");default:return esp8266_EINVL; 
}
}

加入服务器输入账号密码

uint8_t esp8266_join_ap(char *ssid,char *pwd)
{char cmd[64];sprintf(cmd, "AT+CWJAP=\"%s\",\"%s\"\r\n",ssid,pwd);//作为模式传输进入return esp8266_send_command(cmd."OK");
}

设置单路连接的esp8266连接模式

/*设置单路连接的模式(透传只能用此模式)*/
uint8_t esp8266_connect_mode(uint8_t mode)
{char cmd[64];sprintf(cmd,"AT+CIPMUX=%d\r\n",mode);return esp8266_send_command(cmd,"OK");//发送cmd指令期待回复OK
}

连接tcp服务器

uint8_t esp8266_connect_tcp_sever(char *server_ip,char *server port)
{char cmd[64];sprintf(cmd,"AT+CIPSTART=\"TCP\",\"%s\",%s\r\n",server_ip,server_port);return esp8266_send_command,"CONNECT");
}

进入透传模式

uint8_t esp8266_enter_unvarnished(void)//进入透传模式
{uint8_t ret;ret  =  esp8266_send_command("AT+CIPMODE=1\r\n","OK");ret +=  esp8266_send_command("AT+CIPSEND\r\n",">");//调用指令函数if(ret == ESP8266_EOK)return ESP8266_EOK;elsereturn ESP8266_ERROR;
}

esp8266初始化

uint8_t esp8266_init(uint32_t baudrate)
{printf("esp8266初始化开始...\r\n");    esp8266_init_uart(baudrate);printf("1. 测试esp8266是否存在\r\n")while(esp8266_at_test())delay_ms(500);printf("2. 设置工作模式为STA...\r\n");while(esp8266_set_mode(ESP8266_STA_MODE)delay_ms(500);printf("3. 设置单路链接模式\r\n");while(esp8266_connect_mode(ESP8266_SINGLE_CONNECTION))delay_ms(500);printf("4. 连接wifi,SSID: %s ,PWD:%s\r\n",WIFI_SSID,WIFI_PWD);while(esp8266_join_ap(WIFI_SSID,WIFI,PWD))delay_ms(1500);//时间长一些printf("6. 进入透传模式...\r\n");while(esp8266_enter_unvarnished())delay_ms(500);print("esp8266已经连接上tcp服务器并进入透传模式")
}

测试函数

void esp8266_test(void)
{esp8266_send_data("this is from esp8266\r\n");esp8266_receiv_data();
}

main函数

#include "delay.h"
#include "led.h"
#include "uart1.h"
#include "esp8266.h"
int main(void)
{HAL_Init();                         /* 初始化HAL库 */stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */led_init();	/* LED初始化 */uart1_init(115200);esp8266_init(115200);printf("helloworld!\r\n");		while(1){       			esp8266_test();delay_ms(500);}
}

2. ESP8266作为服务器

USB转TTL插入电脑,TX--RX RX-TX VCC-3.3V GND-GND

查询IP地址:AT+CIFSR

//1 配置成AP模式

AT+CWMODE=2

Response :OK

//2 使能多链接

AT+CIPMUX=1 Response :OK

//3 建立TCPServer

AT+CIPSERVER=1 // default port = 333 Response :OK

//4 发送数据

AT+CIPSEND=0,4      // 发送4个字节在连接0通道上 >abcd//输入数据,

Response :SEND OK //不带回车

//5 接收数据

+IPD, 0, n: xxxxxxxxxx //+IPD是固定字符串 0是通道,n是数据长度,xxx是数据

//断开连接

AT+CIPCLOSE=0

Response :0, CLOSED OK

 实验案例WIFI控制风扇

项目需求

电脑通过esp8266模块远程遥控风扇。

项目框图

编辑


http://www.mrgr.cn/news/54670.html

相关文章:

  • 23种设计模式具体实现方法
  • 【STM32学习】PWM学习(四),散热风扇的控制,PWM调速调制,
  • 滚雪球学Redis[7.0讲]:Redis在Web应用中的会话管理:实现、优化与安全性!
  • 在使用new Date()生成时间戳时,发现数据库中 的时间总是多出一秒钟。
  • 医学数据集做切片处理
  • 经营异常移除申请操作流程
  • 如何打开CMD界面?打开CMD界面有几种方式
  • Chromium html<lable>c++接口定义
  • 3、面向对象之封装与继承(找工作版)
  • 【OD】【E卷】【真题】【100分】流浪地球(PythonJavaJavaScriptC++C)
  • python 模块 输入与输出
  • 探究互联网数字化商品管理变革:从数据化到精准运营的路径转型
  • Leaflet地图中实现绘图(点、线、多边形、圆等)功能
  • 美学心得(第二百六十八集) 罗国正
  • 机器学习【工业高精度计算及其应用】
  • C++头文件大全及解释(补丁)
  • 一 、揭秘操作系统架构:从整体式到微内核的技术演变
  • <Project-11 Calculator> 计算器 0.3 年龄计算器 age Calculator HTML JS
  • 可达性分析法
  • 力扣71~75题
  • docker容器操作
  • 最近很火的ITIL证书是什么证书?
  • 软硬连接,Linux下的动静态库
  • Nat Comput Sci | 分而治之!基于子任务分解的单细胞扰动人工智能模型 STAMP
  • 洛谷 P1038 [NOIP2003 提高组] 神经网络(拓扑排序)
  • Redis之持久化机制和实现原理