Вот как следует использовать ESP8266 в Интернете вещей!
Вот как следует использовать ESP8266 в Интернете вещей!

🙌Домашняя страница программиста Акинаямы 😂oi Игрок на пенсии, увлекается Java, большими данными, микроконтроллерами и Интернетом вещей, любит технологии, технологии не виноваты. 🎉Добро пожаловать, подписывайтесь🔎Мне нравится👍Собрать⭐️Оставить сообщение📝


1. Предисловие

В процессе изучения Интернета вещей первое, что приходит на ум, это Bluetooth и Wi-Fi. Среди Wi-Fi относительно известен быстрый рост esp32, который также неотделим от его встроенного модуля Bluetooth. сам может быть подключен. Маршрутизатор также можно использовать в качестве точки доступа для подключения к нему вашего мобильного телефона. В этой статье в основном объясняются следующие аспекты:

  1. Краткий обзор esp8266
  2. Получите набор AT-команд
  3. Обзор протокола MQTT
  4. Пример

2. Обзор esp8266

ESP8266этоЧип контроллера Ethernet,От Эспрессиф Системс(Espressif Systems)посадочная дистанция。этоНедорогой и высокопроизводительный модуль Wi-Fi.,Широко используется в Интернете вещи и область встраиваемых систем.

  1. Полное сетевое решение WIFE, которое может работать независимо или устанавливаться на других SOC в качестве подчиненного модуля.
  2. ESP8266Модуль интегрируетWi-Fiникто Функция линейной связи,Поддержка стандарта 802.11b/g/n,Можетсоединятьприезжатьниктосети и выполнять передачу данных。Он связывается с основным устройством управления через последовательный порт.,И предоставляет набор AT-команд,Упрощенная связь с главным устройством управленияизвзаимодействие
  3. Можно использовать различные среды разработки, такие как Arduino IDE, MicroPython и NodeMCU.
  4. ESP8266 обладает хорошей масштабируемостью, емкость его памяти можно расширить за счет внешней флэш-памяти, а также поддерживает обновление прошивки OTA (по воздуху).
  5. ESP8266 RTOS SDK, поддерживает операционную систему FreeRTOS.

Конкретные параметры:

Введение в аппаратный интерфейс:

  • Интерфейс UART: Интерфейс UART (универсальный асинхронный приемник-передатчик) является основным интерфейсом ESP8266 для последовательной связи с другими устройствами, к нему можно подключиться через контакты RX и TX. Через UART данные можно отправлять, получать и управлять ими с помощью компьютеров, датчиков, других микроконтроллеров и других устройств.
  • Порты GPIO: ESP8266 имеет несколько портов GPIO (ввод-вывод общего назначения) для взаимодействия с другими периферийными устройствами. Порт GPIO поддерживает цифровой ввод и вывод, а также функции ШИМ и может быть запрограммирован для управления различными периферийными устройствами, такими как светодиодные фонари, реле, переключатели и т. д.
  • I2Cинтерфейс:I2C(Inter-Integrated Circuit) — это тип интерфейса последовательной связи, который может соединять несколько устройств, используя два провода (SDA и SCL) для передачи данных. ESP8266 может взаимодействовать с другими устройствами I2C, такими как датчики, дисплеи и т. д., через I2C.
  • SPIинтерфейс:SPI(Serial Peripheral Interface) также является своего рода интерфейсом последовательной связи, который может соединять несколько устройств с помощью четырех проводов (MISO, MOSI, SCK и SS) для передачи данных. ESP8266 может взаимодействовать с другими устройствами SPI через интерфейс SPI, такими как флэш-память, ЖК-дисплей и т. д.
  • Интерфейс АЦП: ESP8266 включает в себя АЦП (аналогово-цифровой преобразователь) для преобразования аналоговых сигналов в цифровые. АЦП может подключаться к аналоговым устройствам, таким как датчики, считывать аналоговые значения и преобразовывать их в цифровые данные.
  • ШИМ-интерфейс: порт GPIO ESP8266 поддерживает функцию ШИМ (широтно-импульсной модуляции), которую можно использовать для управления яркостью и скоростью периферийных устройств, таких как двигатели и светильники.
  • SDIOинтерфейс:SDIO(Secure Digital Input Выходной интерфейс) — это высокоскоростной интерфейс последовательной передачи данных, обычно используемый для операций чтения и записи на картах SD и MMC. ESP8266 может подключаться к SD-карте или карте MMC через интерфейс SDIO для хранения и чтения данных.

3. АТ-команды для управления модулем

Согласно Espressif Systems существуют сотни официальных инструкций для esp8266, но наиболее часто используемых инструкций я перечислю лишь около 10. Другие читатели могут при необходимости загрузить руководство пользователя Espressif Systems.

  1. AT: Проверьте, находится ли модуль ESP8266 в сети, и верните «ОК», чтобы указать, что модуль работает нормально.
  2. AT+RST: сброс модуля ESP8266 и возврат «готов», чтобы указать, что модуль готов.
  3. AT+CWMODE=: установите рабочий режим ESP8266, где значение параметра равно 1, 2 или 3, что соответствует режиму STA, режиму AP и режиму STA+AP соответственно.
  4. AT+CWJAP=,:соединятьприезжать指定изWi-Fiсеть,где и соответственно представляют потребностисоединятьизWi-Fiсетьимя称和密码。После успешного выполнения команды,ESP8266 автоматически получит IP-адрес.
  5. AT+CIFSR: получить текущий IP-адрес ESP8266.
  6. AT+CIPMUX=:настраиватьESP8266измногосоединятьмодель,Значение параметра – 0 или 1.,Представляет режим одиночного соединения и режим множественного соединения соответственно.
  7. AT+CIPSTART=,,: Установить TCP или UDPсоединять,где параметр «TCP» или «UDP»,Параметр — целевой IP-адрес.,Параметром является номер целевого порта.
  8. AT+CIPSEND=: установите длину данных, отправляемых ESP8266, где параметр — это длина отправляемых данных. Эту команду необходимо выполнить в первую очередь при отправке данных.
  9. AT+CIPCLOSE: закрыть текущее состояние ESP8266.

Не забудьте открыть порт:Windows открывает определенные порты

В качестве помощника по отладке используется многофункциональный помощник по отладке Wildfire.

ссылка на АТ

4. Обзор протокола MQTT

MQTT (Message Queuing Telemetry Transport) — это облегченный протокол передачи сообщений, основанный на модели публикации/подписки. Он подходит для таких сценариев, как Интернет вещей и мобильные приложения. Взаимосвязь между ними примерно такая же, как на следующем рисунке.

Конкретный протокол будет представлен в отдельной статье, когда появится такая возможность.

5. Пример

Код взят с Wildfire, полный код есть на форуме Wildfire, публичная информация

Общий код:

  1. функция инициализации
Язык кода:javascript
копировать
void ESP8266_Init ( void )
{
	ESP8266_GPIO_Config (); 
	
	ESP8266_USART_Config (); 
	
	
	macESP8266_RST_HIGH_LEVEL();

	macESP8266_CH_ENABLE();
	
	
}
  1. Инициализировать GPIO
Язык кода:javascript
копировать
static void ESP8266_GPIO_Config ( void )
{
	/*Определяем структуру типа GPIO_InitTypeDef*/
	GPIO_InitTypeDef GPIO_InitStructure;


	/* Конфигурация CH_PD приколоть*/
	macESP8266_CH_PD_APBxClock_FUN ( macESP8266_CH_PD_CLK, ENABLE ); 
											   
	GPIO_InitStructure.GPIO_Pin = macESP8266_CH_PD_PIN;	

	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   
   
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

	GPIO_Init ( macESP8266_CH_PD_PORT, & GPIO_InitStructure );	 

	
	/* Конфигурация RST приколоть*/
	macESP8266_RST_APBxClock_FUN ( macESP8266_RST_CLK, ENABLE ); 
											   
	GPIO_InitStructure.GPIO_Pin = macESP8266_RST_PIN;	

	GPIO_Init ( macESP8266_RST_PORT, & GPIO_InitStructure );	 


}
  1. Инициализировать последовательный порт
Язык кода:javascript
копировать
static void ESP8266_USART_Config ( void )
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	
	
	/* config USART clock */
	macESP8266_USART_APBxClock_FUN ( macESP8266_USART_CLK, ENABLE );
	macESP8266_USART_GPIO_APBxClock_FUN ( macESP8266_USART_GPIO_CLK, ENABLE );
	
	/* USART GPIO config */
	/* Configure USART Tx as alternate function push-pull */
	GPIO_InitStructure.GPIO_Pin =  macESP8266_USART_TX_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(macESP8266_USART_TX_PORT, &GPIO_InitStructure);  
  
	/* Configure USART Rx as input floating */
	GPIO_InitStructure.GPIO_Pin = macESP8266_USART_RX_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(macESP8266_USART_RX_PORT, &GPIO_InitStructure);
	
	/* USART1 mode config */
	USART_InitStructure.USART_BaudRate = macESP8266_USART_BAUD_RATE;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	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(macESP8266_USARTx, &USART_InitStructure);
	
	
	/* прерывать Конфигурация */
	USART_ITConfig ( macESP8266_USARTx, USART_IT_RXNE, ENABLE ); //Включаем прерывание приема последовательного порта 
	USART_ITConfig ( macESP8266_USARTx, USART_IT_IDLE, ENABLE ); //Включаем прерывание простоя последовательной шины 	

	ESP8266_USART_NVIC_Configuration ();
	
	
	USART_Cmd(macESP8266_USARTx, ENABLE);
	
	
}
  1. Прерывание конфигурации
Язык кода:javascript
копировать
static void ESP8266_USART_NVIC_Configuration ( void )
{
	NVIC_InitTypeDef NVIC_InitStructure; 
	
	
	/* Configure the NVIC Preemption Priority Bits */  
	NVIC_PriorityGroupConfig ( macNVIC_PriorityGroup_x );

	/* Enable the USART2 Interrupt */
	NVIC_InitStructure.NVIC_IRQChannel = macESP8266_USART_IRQ;	 
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);

}

Рутина окончена, следующий шаг — пересадка кода ESP8266, получение и отправка модульного кода.

Язык кода:javascript
копировать
/*
 * функцияимя:ESP8266_Rst * описывать  :Перезапустите модуль WF-ESP8266.
 * входить  :никто
 * возвращаться  : никто
 * вызов  :одеяло ESP8266_AT_Test вызов
 */
void ESP8266_Rst ( void )
{
	#if 0
	 ESP8266_Cmd ( "AT+RST", "OK", "ready", 2500 );   	
	
	#else
	 macESP8266_RST_LOW_LEVEL();
	 Delay_ms ( 500 ); 
	 macESP8266_RST_HIGH_LEVEL();
	#endif

}


/*
 * функцияимя:ESP8266_Cmd * описывать  : Отправьте AT-команду на модуль WF-ESP8266.
 * входить  : cmd, команда для отправки
 *         ответ1, ответ2, ожидаемый ответ, имеет значение NULL и не требует ответа. Эти два параметра находятся в логической связи ИЛИ.
 *         время ожидания, время ожидания ответа
 * возвращаться  : 1. Команда отправлена ​​успешно.
 *         0, отправка команды не удалась
 * вызов  :одеяловнешнийвызов
 */
bool ESP8266_Cmd ( char * cmd, char * reply1, char * reply2, u32 waittime )
{    
	strEsp8266_Fram_Record .InfBit .FramLength = 0;               //Получаем новые пакеты данных с нуля

	macESP8266_Usart ( "%s\r\n", cmd );

	if ( ( reply1 == 0 ) && ( reply2 == 0 ) )                      //Нет необходимости получать данные
		return true;
	
	Delay_ms ( waittime );                 //Задерживать
	
	strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ]  = '\0';

	macPC_Usart ( "%s", strEsp8266_Fram_Record .Data_RX_BUF );
  
	if ( ( reply1 != 0 ) && ( reply2 != 0 ) )
		return ( ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply1 ) || 
						 ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply2 ) ); 
 	
	else if ( reply1 != 0 )
		return ( ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply1 ) );
	
	else
		return ( ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply2 ) );
	
}


/*
 * функцияимя:ESP8266_AT_Test * описывать  : Запустить AT-тест на модуле WF-ESP8266.
 * входить  :никто
 * возвращаться  : никто
 * вызов  :одеяловнешнийвызов
 */
//void ESP8266_AT_Test ( void )
//{
//	macESP8266_RST_HIGH_LEVEL();
//	
//	Delay_ms ( 1000 ); 
//	
//	while ( ! ESP8266_Cmd ( "AT", "OK", NULL, 500 ) ) ESP8266_Rst ();  	

//}
void ESP8266_AT_Test ( void )
{
	char count=0;
	
	macESP8266_RST_HIGH_LEVEL();	
	Delay_ms ( 1000 );
	while ( count < 10 )
	{
		if( ESP8266_Cmd ( "AT", "OK", NULL, 500 ) ) return;
		ESP8266_Rst();
		++ count;
	}
}


/*
 * функцияимя:ESP8266_Net_Mode_Choose * описывать  :Выберите режим работы модуля WF-ESP8266.
 * входить  : enumMode, рабочий режим
 * возвращаться  : 1. Выбирайте успех
 *         0, выбор не удался
 * вызов  :одеяловнешнийвызов
 */
bool ESP8266_Net_Mode_Choose ( ENUM_Net_ModeTypeDef enumMode )
{
	switch ( enumMode )
	{
		case STA:
			return ESP8266_Cmd ( "AT+CWMODE=1", "OK", "no change", 2500 ); 
		
	  case AP:
		  return ESP8266_Cmd ( "AT+CWMODE=2", "OK", "no change", 2500 ); 
		
		case STA_AP:
		  return ESP8266_Cmd ( "AT+CWMODE=3", "OK", "no change", 2500 ); 
		
	  default:
		  return false;
  }
	
}


/*
 * функцияимя:ESP8266_JoinAP * описывать  : Модуль WF-ESP8266 для подключения внешнего Wi-Fi
 * входить  : pSSID, строка имени Wi-Fi.
 *       :passWord,строка пароля WiFi
 * возвращаться  : 1,соединятьуспех *         0,соединятьнеудача * вызов  :одеяловнешнийвызов
 */
bool ESP8266_JoinAP ( char * pSSID, char * pPassWord )
{
	char cCmd [120];

	sprintf ( cCmd, "AT+CWJAP=\"%s\",\"%s\"", pSSID, pPassWord );
	
	return ESP8266_Cmd ( cCmd, "OK", NULL, 5000 );
	
}


/*
 * функцияимя:ESP8266_BuildAP * описывать  : Модуль WF-ESP8266 создает точку доступа Wi-Fi.
 * входить  : pSSID, строка имени Wi-Fi.
 *       :passWord,строка пароля WiFi
 *       : enunPsdMode, строка кода режима шифрования Wi-Fi.
 * возвращаться  : 1. Создано успешно
 *         0, создание не удалось
 * вызов  :одеяловнешнийвызов
 */
bool ESP8266_BuildAP ( char * pSSID, char * pPassWord, ENUM_AP_PsdMode_TypeDef enunPsdMode )
{
	char cCmd [120];

	sprintf ( cCmd, "AT+CWSAP=\"%s\",\"%s\",1,%d", pSSID, pPassWord, enunPsdMode );
	
	return ESP8266_Cmd ( cCmd, "OK", 0, 1000 );
	
}


/*
 * функцияимя:ESP8266_Enable_MultipleId * описывать  : Модуль WF-ESP8266 запускается мультисоединять
 * входить  :enumEnUnvarnishTx,Конфигурация是否многосоединять
 * возвращаться  : 1,Конфигурацияуспех
 *         0,Конфигурациянеудача
 * вызов  :одеяловнешнийвызов
 */
bool ESP8266_Enable_MultipleId ( FunctionalState enumEnUnvarnishTx )
{
	char cStr [20];
	
	sprintf ( cStr, "AT+CIPMUX=%d", ( enumEnUnvarnishTx ? 1 : 0 ) );
	
	return ESP8266_Cmd ( cStr, "OK", 0, 500 );
	
}


/*
 * функцияимя:ESP8266_Link_Server * описывать  : Модуль WF-ESP8266 для подключения внешнего сервера
 * входить  : enumE, сетевой протокол
 *       :ip, IP-строка сервера
 *       :ComNum, строка порта сервера
 *       :id, идентификатор модуля подключения сервера
 * возвращаться  : 1,соединятьуспех *         0,соединятьнеудача * вызов  :одеяловнешнийвызов
 */
bool ESP8266_Link_Server ( ENUM_NetPro_TypeDef enumE, char * ip, char * ComNum, ENUM_ID_NO_TypeDef id)
{
	char cStr [100] = { 0 }, cCmd [120];

  switch (  enumE )
  {
		case enumTCP:
		  sprintf ( cStr, "\"%s\",\"%s\",%s", "TCP", ip, ComNum );
		  break;
		
		case enumUDP:
		  sprintf ( cStr, "\"%s\",\"%s\",%s", "UDP", ip, ComNum );
		  break;
		
		default:
			break;
  }

  if ( id < 5 )
    sprintf ( cCmd, "AT+CIPSTART=%d,%s", id, cStr);

  else
	  sprintf ( cCmd, "AT+CIPSTART=%s", cStr );

	return ESP8266_Cmd ( cCmd, "OK", "ALREAY CONNECT", 4000 );
	
}


/*
 * функцияимя:ESP8266_StartOrShutServer * описывать  : Модуль WF-ESP8266 включает или выключает режим сервера.
 * входить  : enumMode, включить/выключить
 *       :pPortNum, строка номера порта сервера
 *       :pTimeOver, строка времени ожидания сервера, единица измерения: секунды.
 * возвращаться  : 1. Операция прошла успешно
 *         0, операция не удалась
 * вызов  :одеяловнешнийвызов
 */
bool ESP8266_StartOrShutServer ( FunctionalState enumMode, char * pPortNum, char * pTimeOver )
{
	char cCmd1 [120], cCmd2 [120];

	if ( enumMode )
	{
		sprintf ( cCmd1, "AT+CIPSERVER=%d,%s", 1, pPortNum );
		
		sprintf ( cCmd2, "AT+CIPSTO=%s", pTimeOver );

		return ( ESP8266_Cmd ( cCmd1, "OK", 0, 500 ) &&
						 ESP8266_Cmd ( cCmd2, "OK", 0, 500 ) );
	}
	
	else
	{
		sprintf ( cCmd1, "AT+CIPSERVER=%d,%s", 0, pPortNum );

		return ESP8266_Cmd ( cCmd1, "OK", 0, 500 );
	}
	
}


/*
 * функцияимя:ESP8266_Get_LinkStatus * описывать  : получать WF-ESP8266 Статус совместного использования, больше подходит для использования с одним портом
 * входить  :никто
 * возвращаться  : 2. Получить IP
 *         3,Учреждатьсоединять *         3,терятьсоединять *         0, не удалось получить статус
 * вызов  :одеяловнешнийвызов
 */
uint8_t ESP8266_Get_LinkStatus ( void )
{
	if ( ESP8266_Cmd ( "AT+CIPSTATUS", "OK", 0, 500 ) )
	{
		if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "STATUS:2\r\n" ) )
			return 2;
		
		else if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "STATUS:3\r\n" ) )
			return 3;
		
		else if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "STATUS:4\r\n" ) )
			return 4;		

	}
	
	return 0;
	
}


/*
 * функцияимя:ESP8266_Get_IdLinkStatus * описывать  : получать WF-ESP8266 Статус подключения порта (Id), более подходит для использования с несколькими портами.
 * входить  :никто
 * возвращаться  : Состояние порта (Id), младшие 5 бит являются действительными и соответствуют Id5~0 соответственно. Если определенный бит установлен в 1, это означает, что идентификатор установлен. Если он сброшен в 0, это означает, что идентификатор не установлен.
 * вызов  :одеяловнешнийвызов
 */
uint8_t ESP8266_Get_IdLinkStatus ( void )
{
	uint8_t ucIdLinkStatus = 0x00;
	
	
	if ( ESP8266_Cmd ( "AT+CIPSTATUS", "OK", 0, 500 ) )
	{
		if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:0," ) )
			ucIdLinkStatus |= 0x01;
		else 
			ucIdLinkStatus &= ~ 0x01;
		
		if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:1," ) )
			ucIdLinkStatus |= 0x02;
		else 
			ucIdLinkStatus &= ~ 0x02;
		
		if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:2," ) )
			ucIdLinkStatus |= 0x04;
		else 
			ucIdLinkStatus &= ~ 0x04;
		
		if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:3," ) )
			ucIdLinkStatus |= 0x08;
		else 
			ucIdLinkStatus &= ~ 0x08;
		
		if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:4," ) )
			ucIdLinkStatus |= 0x10;
		else 
			ucIdLinkStatus &= ~ 0x10;	

	}
	
	return ucIdLinkStatus;
	
}


/*
 * функцияимя:ESP8266_Inquire_ApIp * описывать  : получать F-ESP8266 из AP IP
 * входить  : PAPIP, хранилище AP IP измассивизпервого адреса
 *         ucArrayLength, хранилище AP IP измассивиздлина
 * возвращаться  : 0, получение не удалось
 *         1. Добейтесь успеха
 * вызов  :одеяловнешнийвызов
 */
uint8_t ESP8266_Inquire_ApIp ( char * pApIp, uint8_t ucArrayLength )
{
	char uc;
	
	char * pCh;
	
	
  ESP8266_Cmd ( "AT+CIFSR", "OK", 0, 500 );
	
	pCh = strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "APIP,\"" );
	
	if ( pCh )
		pCh += 6;
	
	else
		return 0;
	
	for ( uc = 0; uc < ucArrayLength; uc ++ )
	{
		pApIp [ uc ] = * ( pCh + uc);
		
		if ( pApIp [ uc ] == '\"' )
		{
			pApIp [ uc ] = '\0';
			break;
		}
		
	}
	
	return 1;
	
}


/*
 * функцияимя:ESP8266_UnvarnishSend * описывать  :Конфигурация Модуль WF-ESP8266 переходит в режим прозрачной передачи
 * входить  :никто
 * возвращаться  : 1,Конфигурацияуспех
 *         0,Конфигурациянеудача
 * вызов  :одеяловнешнийвызов
 */
bool ESP8266_UnvarnishSend ( void )
{
	if ( ! ESP8266_Cmd ( "AT+CIPMODE=1", "OK", 0, 500 ) )
		return false;
	
	return 
	  ESP8266_Cmd ( "AT+CIPSEND", "OK", ">", 500 );
	
}


/*
 * функцияимя:ESP8266_ExitUnvarnishSend * описывать  :КонфигурацияWF-ESP8266模块退出透传модель
 * входить  :никто
 * возвращаться  : никто
 * вызов  :одеяловнешнийвызов
 */
void ESP8266_ExitUnvarnishSend ( void )
{
	Delay_ms ( 1000 );
	
	macESP8266_Usart ( "+++" );
	
	Delay_ms ( 500 ); 
	
}


/*
 * функцияимя:ESP8266_SendString * описывать  : Модуль WF-ESP8266 отправляет строку
 * входить  : enumEnUnvarnishTx, объявляет, включен ли прозрачный режим передачи.
 *       :pStr,Отправить из строки
 *       :ulStrLength,Отправить из строкииз字节数
 *       :ucId,КоторыйIDотправлятьизнить
 * возвращаться  : 1.Отправлено успешно
 *         0, отправка не удалась
 * вызов  :одеяловнешнийвызов
 */
bool ESP8266_SendString ( FunctionalState enumEnUnvarnishTx, char * pStr, u32 ulStrLength, ENUM_ID_NO_TypeDef ucId )
{
	char cStr [20];
	bool bRet = false;
	
		
	if ( enumEnUnvarnishTx )
	{
		macESP8266_Usart ( "%s", pStr );
		
		bRet = true;
		
	}

	else
	{
		if ( ucId < 5 )
			sprintf ( cStr, "AT+CIPSEND=%d,%d", ucId, ulStrLength + 2 );

		else
			sprintf ( cStr, "AT+CIPSEND=%d", ulStrLength + 2 );
		
		ESP8266_Cmd ( cStr, "> ", 0, 1000 );

		bRet = ESP8266_Cmd ( pStr, "SEND OK", 0, 1000 );
  }
	
	return bRet;

}


/*
 * функцияимя:ESP8266_ReceiveString * описывать  : Модуль WF-ESP8266 получает строку
 * входить  : enumEnUnvarnishTx, объявляет, включен ли прозрачный режим передачи.
 * возвращаться  : 接收приезжатьизнить首地址
 * вызов  :одеяловнешнийвызов
 */
char * ESP8266_ReceiveString ( FunctionalState enumEnUnvarnishTx )
{
	char * pRecStr = 0;
	
	
	strEsp8266_Fram_Record .InfBit .FramLength = 0;
	strEsp8266_Fram_Record .InfBit .FramFinishFlag = 0;
	
	while ( ! strEsp8266_Fram_Record .InfBit .FramFinishFlag );
	strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ] = '\0';
	
	if ( enumEnUnvarnishTx )
		pRecStr = strEsp8266_Fram_Record .Data_RX_BUF;
	
	else 
	{
		if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+IPD" ) )
			pRecStr = strEsp8266_Fram_Record .Data_RX_BUF;

	}

	return pRecStr;
	
}
 
boy illustration
[Спецификация] Результаты и исключения возврата интерфейса SpringBoot обрабатываются единообразно, поэтому инкапсуляция является элегантной.
boy illustration
Интерпретация каталога веб-проекта Flask
boy illustration
Что такое подробное объяснение файла WSDL_wsdl
boy illustration
Как запустить большую модель ИИ локально
boy illustration
Подведение итогов десяти самых популярных веб-фреймворков для Go
boy illustration
5 рекомендуемых проектов CMS с открытым исходным кодом на базе .Net Core
boy illustration
Java использует httpclient для отправки запросов HttpPost (отправка формы, загрузка файлов и передача данных Json)
boy illustration
Руководство по развертыванию Nginx в Linux (Centos)
boy illustration
Интервью с Alibaba по Java: можно ли использовать @Transactional и @Async вместе?
boy illustration
Облачный шлюз Spring реализует примеры балансировки нагрузки и проверки входа в систему.
boy illustration
Используйте Nginx для решения междоменных проблем
boy illustration
Произошла ошибка, когда сервер веб-сайта установил соединение с базой данных. WordPress предложил решение проблемы с установкой соединения с базой данных... [Легко понять]
boy illustration
Новый адрес java-библиотеки_16 топовых Java-проектов с открытым исходным кодом, достойных вашего внимания! Обязательно к просмотру новичкам
boy illustration
Лучшие практики Kubernetes для устранения несоответствий часовых поясов внутри контейнеров
boy illustration
Введение в проект удаления водяных знаков из коротких видео на GitHub Douyin_TikTok_Download_API
boy illustration
Весенние аннотации: подробное объяснение @Service!
boy illustration
Пожалуйста, не используйте foreach для пакетной вставки в MyBatis. Для 5000 фрагментов данных потребовалось 14 минут. .
boy illustration
Как создать проект Node.js с помощью npm?
boy illustration
Mybatis-plus использует typeHandler для преобразования объединенных строк String в списки списков.
boy illustration
Не удалось установить программное обеспечение Mitsubishi. Возможно, возникла проблема с реестром.
boy illustration
Разрешение ошибок проекта SpringBoot 3 mybatis-plus: org.apache.ibatis.binding.BindingException: неверный оператор привязки
boy illustration
Более краткая проверка параметров. Для проверки параметров используйте SpringBoot Validation.
boy illustration
Поиграйтесь с интеграцией Spring Boot (платформа запланированных задач Quartz)
boy illustration
Несколько популярных режимов интерфейса API: RESTful, GraphQL, gRPC, WebSocket, Webhook.
boy illustration
Redis: практика публикации (pub) и подписки (sub)
boy illustration
Подробное объяснение пакета Golang Context
boy illustration
Краткое руководство: создайте свое первое приложение .NET Aspire
boy illustration
Краткое обсуждение метода пакетной вставки MyBatis: обработка 100 000 фрагментов данных занимает всего 2 секунды.
boy illustration
[Инструмент] Используйте nvm для управления переключением версий nodejs, это так здорово!
boy illustration
HTML можно преобразовать в word_html для отображения текстовых документов.