您的位置:首页 > 游戏 > 手游 > 网上引流推广_装修公司名字 有创意_站内免费推广有哪些_整站seo排名要多少钱

网上引流推广_装修公司名字 有创意_站内免费推广有哪些_整站seo排名要多少钱

2024/12/25 21:01:04 来源:https://blog.csdn.net/qq_65524926/article/details/143100423  浏览:    关键词:网上引流推广_装修公司名字 有创意_站内免费推广有哪些_整站seo排名要多少钱
网上引流推广_装修公司名字 有创意_站内免费推广有哪些_整站seo排名要多少钱

实验案例WIFI控制风扇

项目需求

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

项目框图

风扇模块封装 

#include "sys.h"
#include "fan.h"void fan_init(void)
{GPIO_InitTypeDef gpio_initstruct;//打开时钟__HAL_RCC_GPIOB_CLK_ENABLE();//调用GPIO初始化函数gpio_initstruct.Pin  = GPIO_PIN_6;gpio_initstruct.Mode = GPIO_MODE_OUTPUT_PP;gpio_initstruct.Pull = GPIO_PULLUP;//上拉需要给一个下降沿gpio_initstruct.Speed= GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOB,&gpio_initstruct);//关闭LEDfan1_off();
}
void fan1_on(void)
{//由电路图可知,将GPIO拉低HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET);}
//熄灭LED1的函数void fan1_off(void)
{//由电路图可知,将GPIO拉低HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET);}//获取继电器的状态uint8_t fan_status_get(void)
{return (uint8_t)HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_6);//要么返回0,要么返回1}


esp8266功能代码封装 

头文件

#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(uint32_t baudrate)//正常会有启动的流程只是作为一个串口的初始化
{/*esp8266 初始化设置*/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_HWCONTROL_NONE;            /* 无硬件流控 */esp8266_handle.Init.Mode = UART_MODE_TX_RX;                     /* 收发模式 */HAL_UART_Init(&esp8266_handle);                                 /*会使能esp8266 */                 
}

接收缓冲区配置

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;   if(__HAL_UART_GET_FLAG(&esp8266_handle, UART_FLAG_RXNE) != RESET){/* 获取接收RXNE标志位是否被置位 */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();__HAL_UART_CLEAR_IDLEFLAG(&esp8266_handle);              /* 清除UART总线空闲中断 */}
}

等待接收函数

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,char *res)//发送一个指令去   在指定时间内返回回来 否则没有接收到一个返回值
{uint8_t timeout_out = 250;esp8266_rx_clear(); //防止忍心内的数据影响HAL_UART_Transmit(&esp8266_handle,(uint8_t *)cmd,strlen(cmd),100);//发送命令 cmd在这里是一个uint8_t的数据 长度 阻塞的值//等待while(timeout_out--)//不停的等待{if(esp8266_wait_receive() == ESP8266_EOK){if(strstr((const char*)esp8266_rx_buf, res) != NULL)//判断是否又有期待的字符串return ESP8266_EOK;}delay_ms(10);}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_t 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);//发送
}

设置a模块是否存在测试

uint8_t esp8266_at_test(void)
{return esp8266_send_command("AT\r\n", "OK");//记得加回车换行才能作为指令发送期待返回值为OK  直接作为返回值发送}

设置模式

uint8_t esp8266_set_mode(uint8_t mode)//s四个函数
{switch(mode){case ESP8266_STA_MODE:return esp8266_send_command("AT+CWMODE=1\r\n","OK");case ESP8266_AP_MODE:return esp8266_send_command("AT+CWMODE=2\r\n","OK");case ESP8266_STA_AP_MODE:return esp8266_send_command("AT+CWMODE=3\r\n","OK");default:return ESP8266_EINVAL;//如果指令不存在}
}

加入AP


uint8_t esp8266_join_ap(char *ssid,char *pwd)//账号密码
{char cmd[64];sprintf(cmd, "AT+CWJAP=\"%s\",\"%s\"\r\n",ssid,pwd);//\"HUAWEIAP-1\",=\"%s\  就指令带引号直接写不行,我们需要如此就不会将“”认为是配对的return esp8266_send_command(cmd,"WIFI GOT IP");;//调用指令函数
}

连接模式

	
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");;//调用指令函数
}
//连接TCP服务器

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");;//调用指令函数
}

 esp8266连接tpc服务器ip和端口

uint8_t esp8266_connect_tcp_server(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(cmd,"CONNECT");;//调用指令函数
}

进入透传模式

uint8_t esp8266_enter_unvarnished(void)//发送的模式
{uint8_t ret;//取巧的方式定义一个返回值//两次返回值都等于0,如果有一个不为0就为不为零的情况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;		
}

建立tcp服务器

uint8_t esp8266_build_tcp_server(void)
{return esp8266_send_command("AT+CIPSERVER=1\r\n","OK");//发送AT+CIPSEVER=1,期待回复OK
}

初始化esp8266


void esp8266_init(uint32_t baudrate)//所以增加新添加一个
{printf("esp8266初始化开始...\r\n");esp8266_uart_init(baudrate);printf("1. 测试esp8266是否存在\r\n");while(esp8266_at_test())//esp8266_at_test();也是可以的不过一直不成功那就一直等待更为保险delay_ms(500);printf("2. 设置工作模式为AP...\r\n");while(esp8266_set_mode(ESP8266_AP_MODE))delay_ms(500);printf("3. 设置多路链接模式\r\n");while(esp8266_connect_mode(ESP8266_MULTI_CONNECTION))delay_ms(500);printf("4. 建立TCP服务器...\r\n");while(esp8266_build_tcp_server())delay_ms(500);		printf("esp8266初始化完成...\r\n");//esp8266的其他初始化
}

esp8266初始化测试

//测试函数
void esp8266_test(void)
{esp8266_send_data("this is from esp8266\r\n");esp8266_receiv_data();
}

main函数

#include "sys.h"
#include "delay.h"
#include "led.h"
#include "uart1.h"
#include "esp8266.h"
#include "fan.h"
#include "string.h"
int main(void)
{HAL_Init();                         /* 初始化HAL库 */stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */led_init();	/* LED初始化 */uart1_init(115200);esp8266_init(115200);fan_init();printf("helloworld!\r\n");char recv_data[ESP8266_RX_BUF_SIZE];//接收传入参数while(1){ esp8266_receive_data(recv_data);//接收到数据tcp服务器传输过来的字符串if(strstr(recv_data, "ON") != NULL)//判断字符串有ON,打开风扇fan1_on();else if(strstr(recv_data, "OFF") != NULL)fan1_off();delay_ms(10);}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com