poniedziałek, 3 kwietnia 2017

[12] STM32F7 - ESP8266 cz. 3. Konfiguracja komend TCP/IP, zebrany kod

W tym poście chciałbym przedstawić komendy dotyczące TCP/IP dla układu ESP. Na końcu tego postu znajduje się pełna biblioteka z opisanym w trzech częściach kodem.

Komendy dotyczące TCP/IP:


AT+CIPSTATUS - (format: AT+CIPSTATUS) - sprawdza status połączenia. Nie podaje się do niej żadnego parametru. Należy tylko obsłużyć zwracane przez nie wartości. Są one w formacie:


STATUS:
+CIPSTATUS:<link ID>, <type>, <remote IP>, <remote_port>, <local_port>,<tetype>


  1. case Command_AT_CIPSTATUS:
  2.     UART_SENDSTRING(ESP8266_USART, "AT+CIPSTATUS", CR_LF);
  3. break;


  • Parametry zwracane mogą przyjąć następującą formę:
  • <stat>  - sprawdzenie statusu ESP
    • 2 - ESP podłączone do punktu dostępowego i ma przydzielone IP
    • 3 - stworzono połączenie w wersji TCP bądź UDP
    • 4 - połączenie TCP bądź UDP zostało przerwane
    • 5 - Nie udało się wykonać połączenia do AP
  • <link ID>  - ilość połączenie od 0 do 4
  • <type>  - typ połączenia TCP bądź UDP
  • <remote IP>  - adress IP
  • <remote port>  - numer portu hosta
  • <local port>  - lokalny numer portu
  • <tetype>  - tutaj można otrzymać dwa parametry 0 oznacza połączenie jako klient, 1 natomiast połączenie jako serwer

AT+CIPDOMAIN - (format: AT+CIPDOMAIN=<domain name>) - po podłączeniu do internetu może zostać wywołany DNS czyli system nazw domenowych. Oznacza to, że adres IP ESP będzie widoczny w sieci pod konkretną nazwą.

  1. void Set_Dns(char *domain_name)
  2. {
  3.     sprintf(data, "AT+CIPDOMAIN=\"%s\"", &domain_name[0]);
  4.     UART_SENDSTRING(ESP8266_USART, data, CR_LF);
  5. }


AT+CIPSTART - (format: Poniżej) - komenda pozwalająca na ustanowienie połączenie w wersji TCP, UDP bądź SSL. Dopuszczalne paramety to:



Format ramki danych jest różny w zależności od sposobu połączenia oraz od ilości użytkowników:


Dla TCP IP pojedyncze połączenie:
AT+CIPSTART=<type>, <remote IP>, <remote port>, [TCP keep alive]

Dla TCP IP połączenie multi:
AT+CIPSTART=<link ID>,<type>, <remote IP>, <remote port>, [TCP keep alive]

Parametry dla połączenie TCP:

  • <link ID>  - wykorzystywany tylko przy wielu połączeniach. Dla trybu jednopołączeniowego nie daje się tego parametru.
  • <type>  - string "TCP" bądź "UDP". Wybór w jaki sposób zostanie ustanowione połączenie.
  • <remote IP>  - adres IP podawany jako string
  • <remote port>  - numer portu
  • [<TCP keep alive>] - określa jaka jest długość życia TCP, jest to parametr opcjonalny. Domyślnie jest to wartość zero czyli nie jest niszczone. Można podać parametr 0 (dla wyłączenia opcji) bądź od 1 do 7200 sekund by określić czas.


  1. /*
  2.  * Establich TCP connection
  3.  */
  4. uint8_t Establish_TCP_Connection(uint8_t Connection_Type, uint8_t link_ID, uint8_t *remove_IP,
  5.                                                 uint16_t remove_port, uint16_t keep_alive_time)
  6. {
  7.     char data[50];
  8.     if(0 == Connection_Type)        //SingleConne
  9.     {
  10.         if(0 == keep_alive_time)
  11.         {
  12.             sprintf(data, "AT+CIPSTART=\"TCP\",\"%u.%u.%u.%u\",%u", remove_IP[0], remove_IP[1], remove_IP[2], remove_IP[3],
  13.                                                                     remove_port);
  14.             UART_SENDSTRING(ESP8266_USART, data, CR_LF);
  15.             return 1;
  16.         }
  17.         else if((keep_alive_time != 0) && (keep_alive_time < 7200))
  18.         {
  19.             sprintf(data, "AT+CIPSTART=\"TCP\",\"%u.%u.%u.%u\",%u,%u", remove_IP[0], remove_IP[1], remove_IP[2], remove_IP[3],
  20.                                                                     remove_port, keep_alive_time);
  21.             UART_SENDSTRING(ESP8266_USART, data, CR_LF);
  22.             return 1;
  23.         }
  24.     }
  25.     else if(1 == Connection_Type)   //MultiConne
  26.     {
  27.         if(0 == keep_alive_time)
  28.         {
  29.             sprintf(data, "AT+CIPSTART=%u,\"TCP\",\"%u.%u.%u.%u\",%u", link_ID, remove_IP[0], remove_IP[1], remove_IP[2], remove_IP[3],
  30.                                                                     remove_port);
  31.             UART_SENDSTRING(ESP8266_USART, data, CR_LF);
  32.             return 1;
  33.         }
  34.         else if(keep_alive_time != 0)
  35.         {
  36.             sprintf(data, "AT+CIPSTART=%u,\"TCP\",\"%u.%u.%u.%u\",%u,%u", link_ID,remove_IP[0], remove_IP[1], remove_IP[2], remove_IP[3],
  37.                                                                     remove_port, keep_alive_time);
  38.             UART_SENDSTRING(ESP8266_USART, data, CR_LF);
  39.             return 1;
  40.         }
  41.     }
  42.     return 0;
  43. }

Dla UDP pojedyncze połączenie: 

AT+CIPSTART=<type>,<remote IP>,<remote port>,[<UDP local port>], [<UDP mode>]

Dla UDP połączenie multi:

AT+CIPSTART=<link ID>,<type>,<remote IP>,<remote port>, [<UDP local port>], [<UDP mode>]

Parametry połączeń UDP:

  • <link ID>  - wykorzystywany tylko przy wielu połączeniach. Dla trybu jednopołączeniowego nie daje się tego parametru.
  • <type>  - "UDP". Wybór w jaki sposób zostanie ustanowione połączenie.
  • <remote IP>  - adres IP podawany jako string
  • <remote port>  - numer portu
  • [<UDP local port>] - port UDP układu ESP
  • [<UDP mode>] - tryb działania UDP. Do wybory parametry od 0 do 2. Dla transmisji transparentnej wprowadza się wartość 0, jest ona także domyślnie ustawiana. Wartość 1 oznacza, że miejsce docelowej transmisji może się zmienić jeden raz. Dla wartości 2 miejsce może się zmieniać nieograniczoną ilość razy.


  1. /*
  2.  * UDP Transmission
  3.  */
  4. uint8_t Establish_UDP_Connection(uint8_t Connection_Type, uint8_t link_ID, uint8_t *remove_IP, uint16_t remove_port,
  5.                                                             uint16_t Udp_local_port, uint8_t Udp_mode)
  6. {
  7.     char data[50];
  8.     if(0 == Connection_Type)        //SingleConne
  9.     {
  10.         if(0 == Udp_local_port)
  11.         {
  12.             sprintf(data, "AT+CIPSTART=\"UDP\",\"%u.%u.%u.%u\",%u", remove_IP[0], remove_IP[1], remove_IP[2], remove_IP[3],
  13.                                                                         remove_port);
  14.             UART_SENDSTRING(ESP8266_USART, data, CR_LF);
  15.             return 1;
  16.         }
  17.         else if(Udp_local_port != 0)
  18.         {
  19.             sprintf(data, "AT+CIPSTART=\"UDP\",\"%u.%u.%u.%u\",%u,%u,%u", remove_IP[0], remove_IP[1], remove_IP[2], remove_IP[3],
  20.                                                                         remove_port, Udp_local_port, Udp_mode);
  21.             UART_SENDSTRING(ESP8266_USART, data, CR_LF);
  22.             return 1;
  23.         }
  24.     }
  25.     else if(1 == Connection_Type)   //MultiConne
  26.     {
  27.         if(0 == Udp_local_port)
  28.         {
  29.             sprintf(data, "AT+CIPSTART=%u,\"UDP\",\"%u.%u.%u.%u\",%u", link_ID, remove_IP[0], remove_IP[1], remove_IP[2], remove_IP[3],
  30.                                                                         remove_port);
  31.             UART_SENDSTRING(ESP8266_USART, data, CR_LF);
  32.             return 1;
  33.         }
  34.         else if(Udp_local_port != 0)
  35.         {
  36.             sprintf(data, "AT+CIPSTART=%u,\"UDP\",\"%u.%u.%u.%u\",%u,%u,%u", link_ID, remove_IP[0], remove_IP[1], remove_IP[2], remove_IP[3],
  37.                                                                         remove_port, Udp_local_port, Udp_mode);
  38.             UART_SENDSTRING(ESP8266_USART, data, CR_LF);
  39.             return 1;
  40.         }
  41.     }
  42.     return 0;
  43. }

Parametr UDP local port musi zostać ustawione aby można było korzystać z UDP mode.

Ostatnim rodzajem połączenie jest połączenie SSL. jego parametry są takie same jak w przypadku TCP. Zmianie ulega jedynie parametr type, który zostaje zmieniony na SSL.


  1. /*
  2.  * SSL connection
  3.  */
  4. uint8_t Establish_SSL_Connection(uint8_t Connection_Type, uint8_t link_ID, uint8_t *remove_IP, uint16_t remove_port,
  5.                                                             uint16_t keep_alive_time)
  6. {
  7.     char data[50];
  8.     if(0 == Connection_Type)        //SingleConne
  9.     {
  10.         if(0 == keep_alive_time)
  11.         {
  12.             sprintf(data, "AT+CIPSTART=\"SSL\",\"%u.%u.%u.%u\",%u", remove_IP[0], remove_IP[1], remove_IP[2], remove_IP[3],
  13.                                                                     remove_port);
  14.             UART_SENDSTRING(ESP8266_USART, data, CR_LF);
  15.             return 1;
  16.         }
  17.         else if((keep_alive_time != 0) && (keep_alive_time < 7200))
  18.         {
  19.             sprintf(data, "AT+CIPSTART=\"SSL\",\"%u.%u.%u.%u\",%u,%u", remove_IP[0], remove_IP[1], remove_IP[2], remove_IP[3],
  20.                                                                     remove_port, keep_alive_time);
  21.             UART_SENDSTRING(ESP8266_USART, data, CR_LF);
  22.             return 1;
  23.         }
  24.     }
  25.     else if(1 == Connection_Type)   //MultiConne
  26.     {
  27.         if(0 == keep_alive_time)
  28.         {
  29.             sprintf(data, "AT+CIPSTART=%u,\"SSL\",\"%u.%u.%u.%u\",%u", link_ID, remove_IP[0], remove_IP[1], remove_IP[2], remove_IP[3],
  30.                                                                     remove_port);
  31.             UART_SENDSTRING(ESP8266_USART, data, CR_LF);
  32.             return 1;
  33.         }
  34.         else if(keep_alive_time != 0)
  35.         {
  36.             sprintf(data, "AT+CIPSTART=%u,\"SSL\",\"%u.%u.%u.%u\",%u,%u", link_ID,remove_IP[0], remove_IP[1], remove_IP[2], remove_IP[3],
  37.                                                                     remove_port, keep_alive_time);
  38.             UART_SENDSTRING(ESP8266_USART, data, CR_LF);
  39.             return 1;
  40.         }
  41.     }
  42.     return 0;
  43. }

Nawiązanie połączenia poprzez protokół SSL musi zostać poprzedzone komendą CIPSSLSIZE, która służy do ustalenia wielkości bufora. 

Wysłanie tej komendy zwraca wartość OK bądź ERROR lub jeśli połączenie jest już ustanowione to ALREADY CONNECT. 

AT+CIPSSLSIZE - (format: AT+CIPSSLSIZE=<size>) - ustawia wielkość bufora dla SSL. Zakres to 2048 lub 4096.


  1.         case Command_AT_CIPSSLSIZE:
  2.             if(0 == param)
  3.             {
  4.                 UART_SENDSTRING(ESP8266_USART, "AT+CIPSSLSIZE=2048", CR_LF);
  5.             }
  6.             else if(1 == param)
  7.             {
  8.                 UART_SENDSTRING(ESP8266_USART, "AT+CIPSSLSIZE=4096", CR_LF);
  9.             }
  10.             break;

AT+CIPSEND - (format: AT+CIPSEND=<nr_klienta>,<dlugosc_wiadomosci>,[remote_IP],[remote Port]) - przesyłanie danych do klienta podłączonego do serwera postawionego na ESP. Przeslana zostanie wiadomość wtedy gdy po nadaniu komendy zostanie przesłany ciąg znaków o długości zdefiniowanej w ramce. Jeśli zostanie wprowadzony ciąg znaków o mniejszej długości to system przed wysłaniem ramki będzie czekał na jej zapełnienie.

Funkcja odpowiedzialna za przesyłanie wiadomości testowej:

  1. //Send test data to client
  2. case Command_AT_CIPSEND:
  3.     UART_SENDSTRING(ESP8266_USART, "AT+CIPSEND=0,5", CR_LF);
  4.     HAL_Delay(500);
  5.     UART_SENDSTRING(ESP8266_USART, "HELLO", CR_LF);
  6.     break;

W niej wykorzystałem opóźnienie, lepiej to zrobić na zasadzie oczekiwania na odpowiedź od ESP, gdy jest gotowy do przesyłania danych. Nastąpi to po wyświetleniu wiadomości "OK" Natomiast ta przedstawiona wyżej może posłużyć do szybkiego testu komunikacji z ESP.

Po wysłaniu danych oraz przesłaniu komendy otrzymuje się następującą odpowiedź od układu:


Funkcja odpowiedzialna za przesyłanie wiadomości testowej poprawiona o oczekiwanie na gotowość ESP:


  1. uint8_t Send_Data_To_Ser_CIP_Send(uint8_t ID, uint16_t length,
  2.         uint8_t ip_1_UDP, uint8_t ip_2_UDP, uint8_t ip_3_UDP, uint8_t ip_4_UDP, uint8_t port_UDP)
  3. {
  4.     char data[100] = {0};
  5.     if(length <= 2048)
  6.     {
  7.         if((ip_1_UDP !=0 || ip_2_UDP !=0 || ip_3_UDP !=0 || ip_4_UDP!=0) && port_UDP != 0)
  8.         {
  9.             sprintf(data,"AT+CIPSEND=%d,%d,\"%d.%d.%d.%d\",%d", ID, length, ip_1_UDP, ip_2_UDP, ip_3_UDP, ip_4_UDP, port_UDP);
  10.             UART_SENDSTRING(ESP8266_USART, data, CR_LF);
  11.         }
  12.         else if(0 == ID) //Pojedyncze po³¹czenie
  13.         {
  14.             sprintf(data,"AT+CIPSEND=%d", length);
  15.             UART_SENDSTRING(ESP8266_USART, data, CR_LF);
  16.         }
  17.         else if(ID!=0)
  18.         {
  19.             sprintf(data,"AT+CIPSEND=%d,%d", ID,length);
  20.             UART_SENDSTRING(ESP8266_USART, data, CR_LF);
  21.         }
  22.     }
  23.     else
  24.     {
  25.         return Stat_Error;
  26.     }
  27.     return Stat_OK;
  28. }

Tutaj zasada działania jest następująca. Najpierw przesyłana jest komenda CIPSEND z danymi dotyczącymi wielkości wiadomości oraz ustawienie flagi przesłania danych. Po tej informacji w pętli głównej, gdzie odbieram wszystkie informacje od ESP to oczekuje na odpowiedź OK. Po czym przesyłam dane oraz czyszczę wcześniej ustawioną flagę. Blok else przesyła dane gdy została ustawiona flaga wysłania zwykłych danych. 

AT+CIPSENDEX - (format: AT+CIPSENDEX=[link ID],<length>,[<remote IP>],[<remote port>]) - wysłanie danych. Dane są wysyłane do czasu osiągnięcia znaku "/0" bądź zapełnienia bufora podaną wielkością.


  1. /*
  2.  * Send data
  3.  * AT+CIPSENDEX
  4.  * transmission_type 0 - TCP 1 - UDP
  5.  * link_id 0-4 for multi conn, 5 - sigle connection
  6.  */
  7. uint8_t Send_Dat_Ex(uint8_t transmission_type, uint8_t link_id, uint16_t length, char *remote_IP, uint16_t remote_port)
  8. {
  9.     char data[50] = {0};
  10.     if(0 == transmission_type)                  //TCP
  11.     {
  12.         if(5 == link_id)                        //single connection
  13.         {
  14.             sprintf(data, "AT+CIPSENDEX=%u", length);
  15.             UART_SENDSTRING(ESP8266_USART, data, CR_LF);
  16.             return 1;
  17.         }
  18.         else if(link_id >= 0 && link_id < 5)    //multi connection
  19.         {
  20.             sprintf(data, "AT+CIPSENDEX=%u,%u", link_id, length);
  21.             UART_SENDSTRING(ESP8266_USART, data, CR_LF);
  22.             return 1;
  23.         }
  24.     }
  25.     else if(1 == transmission_type)             //UDP
  26.     {
  27.         if(5 == link_id)                        //single connection
  28.         {
  29.             if(('x' == remote_IP[0]) && ('x' == remote_port[0]))
  30.             {
  31.                 sprintf(data, "AT+CIPSENDEX=%u", length);
  32.             }
  33.             else
  34.             {
  35.                 sprintf(data, "AT+CIPSENDEX=%u,\"%s\",%u", length, &remote_IP[0], remote_port);
  36.             }
  37.             UART_SENDSTRING(ESP8266_USART, data, CR_LF);
  38.             return 1;
  39.         }
  40.         else if(link_id >= 0 && link_id < 5)    //multi connection
  41.         {
  42.             if(('x' == remote_IP[0]) && ('x' == remote_port[0]))
  43.             {
  44.                 sprintf(data, "AT+CIPSENDEX=%u,%u", link_id, length);
  45.             }
  46.             else
  47.             {
  48.                 sprintf(data, "AT+CIPSENDEX=%u,%u,\"%s\",%u", link_id, length, &remote_IP[0], remote_port);
  49.             }
  50.             UART_SENDSTRING(ESP8266_USART, data, CR_LF);
  51.             return 1;
  52.         }
  53.     }
  54.     return 0;
  55. }


AT+CIPSENDBUF - (format: AT+CIPSENDBUF=<link_ID>,<length>) - wysłanie danych, można robić ciągle, bez potrzeby oczekiwania na odpowiedz.


  1. /*
  2.  * Check status of TCP-send-buffer
  3.  * AT+CIPSENDBUF
  4.  */
  5. uint8_t Dat_Into_TCP_Send_Buffer(uint8_t link_ID, uint16_t length)
  6. {
  7.     if(link_ID == 5)    //Single Connection
  8.     {
  9.         sprintf(data, "AT+CIPSENDBUF=%u", length);
  10.         UART_SENDSTRING(ESP8266_USART, data, CR_LF);
  11.         return 1;
  12.     }
  13.     else if(link_ID >= 0 && link_ID < 5)
  14.     {
  15.         sprintf(data, "AT+CIPSENDBUF=%u,%u", link_ID, length);
  16.         UART_SENDSTRING(ESP8266_USART, data, CR_LF);
  17.         return 1;
  18.     }
  19.     return 0;
  20. }


AT+CIPBUFSTATUS - (format: AT+CIPBUFSTATUS=<link ID>) - sprawdza status danych wysłanych przez TCP. Komendę można wysłać na dwa sposoby pierwszy z nich jest bezparametrowy i zwraca on następujące wartości:

  • <następny segment ID> - będzie pobrany z komendy CIPSENDBUF;
  • <wysłany segment ID> - jaki segment został ostatnio wysłany;
  • <wysłany segment poprawnie ID> - numer ostatniego segmentu, który został wysłany poprawnie;
  • <pozostały rozmiar bufora> - ile danych zostało jeszcze do wysłania;
  • <numer w kolejce> - ile danych zostało jeszcze do przesłania.

Drugi sposób jest stosowany dla wielu połączeń, wtedy jako parametr link ID podawany jest numer połączenia.

  1. /*
  2.  * Check status of TCP-send-buffer
  3.  * AT+CIPBUFSTATUS
  4.  */
  5. uint8_t Check_TCP_Send_Buffer(uint8_t Sing_Multi, uint8_t link_ID)
  6. {
  7.     if(0 == Sing_Multi)
  8.     {
  9.         UART_SENDSTRING(ESP8266_USART, "AT+CIPBUFSTATUS", CR_LF);
  10.         return 1;
  11.     }
  12.     else if(1 == Sing_Multi)
  13.     {
  14.         sprintf(data, "AT+CIPBUFSTATUS=%u", link_ID);
  15.         UART_SENDSTRING(ESP8266_USART, data, CR_LF);
  16.         return 1;
  17.     }
  18.     return 0;
  19. }

AT+CIPCHECKSEQ - (format: AT+CIPCHECKSEQ=<link ID>,<segment ID>) - komenda sprawdza czy dany segment został wysłany poprawnie. Jako parametry podawany jest numer połączenia oraz dane uzyskane przez CIPSENDBUF. W odpowiedzi otrzymuje się te parametry oraz status czy udało się przesłać je poprawnie.


  1. /*
  2.  * Check if a specific segment was sent successfully
  3.  * AT+CIPCHECKSEQ
  4.  */
  5. uint8_t Check_Sent_Seg(uint8_t Sing_Multi, uint8_t link_ID, uint32_t seg_ID)
  6. {
  7.     if(0 == Sing_Multi)
  8.     {
  9.         sprintf(data, "AT+CIPCHECKSEQ=%lu", seg_ID);
  10.         UART_SENDSTRING(ESP8266_USART, data, CR_LF);
  11.         return 1;
  12.     }
  13.     else if(1 == Sing_Multi)
  14.     {
  15.         sprintf(data, "AT+CIPCHECKSEQ=%u,%lu", link_ID, seg_ID);
  16.         UART_SENDSTRING(ESP8266_USART, data, CR_LF);
  17.         return 1;
  18.     }
  19.     return 0;
  20. }

AT+CIPBUFRESET - (format: AT+CIPBUFRESET | AT+CIPBUFRESET=<link ID>) - komenda resetująca segment ID ustawiony z poprzedniej komendy. Wartość ID dla trybu wielu połączeń mieści się w zakresie od 0 do 4. Dla pojedynczego połączenie parametr jest pomijany. Komenda może być stosowana tylko z komenda AT+CIPSENDBUF.


  1. uint8_t Reset_Seg_ID(uint8_t Sing_Multi, uint8_t link_ID)
  2. {
  3.     if(0 == Sing_Multi) //single connection
  4.     {
  5.         UART_SENDSTRING(ESP8266_USART, "AT+CIPBUFRESET", CR_LF);
  6.         return 1;
  7.     }
  8.     else if(1 == Sing_Multi) //multiconnection
  9.     {
  10.         if((link_ID >= 0) || (link_ID < 5))
  11.         {
  12.             sprintf(data, "AT+CIPBUFRESET=%u", link_ID);
  13.             UART_SENDSTRING(ESP8266_USART, data, CR_LF);
  14.             return 1;
  15.         }
  16.     }
  17.     return 0;
  18. }

AT+CIPCLOSE - (format: AT+CIPCLOSE=<link ID>) - zamknięcie połączeń TCP, UDP, SSL. Parametr przyjmuje wartości od 0 do 5. Wartość najwyższa zamyka wszystkie połączenia. W trybie serwera nie przynosi ona żadnego efektu. Zwracana wartość to OK lub ERROR.

  1.         case Command_AT_CIPCLOSE:
  2.             UART_SENDSTRING(ESP8266_USART, "AT+CIP", CR_LF);
  3.         break;

AT+CIFSR - (format: AT+CIFSR) - wyświetla adres IP. Jeśli został nadany to wyświetli IP urządzenia oraz IP jakie zostało przydzielone przez sieć. Dodatkowo wyświetlany jest MAC. Funkcja obsługująca: 


  1.         case Command_AT_CIPCLOSE:
  2.             sprintf(dane, "AT+CIPCLOSE=%u", param);
  3.             UART_SENDSTRING(ESP8266_USART, dane, CR_LF);
  4.         break;

AT+CIPMUX - (format: AT+CIPMUX=[0-1]) - ta komenda pozwala na włączenie bądź wyłączenie trybu wielu połączeń. Po wprowadzeniu wartości zero możliwe jest tylko jedno połączenie, po podaniu jedynki dopuszczalne są maksymalnie cztery połączenia. 

  1.         //Enable/Disable multiple connections AT+CIPMUX = mode
  2.         //0 - single connection | 1 - Multiple connections(MAX 4)
  3.         //Response: +CIPMUX: mode OK
  4.         case Command_AT_CIPMUX:
  5.             if(0 == param)      {   UART_SENDSTRING(ESP8266_USART, "AT+CIPMUX=0", CR_LF);   }
  6.             else if(1 == param) {   UART_SENDSTRING(ESP8266_USART, "AT+CIPMUX=1", CR_LF);   }
  7.         break;

AT+CIPSERVER - (format: AT+CIPSERVER=[1,0],[port]) - Stworzenie serwera. Parametr pierwszy włącza (1) lub wyłącza (0) serwer. Drugi parametr jest opcjonalny podawany w nim jest numer portu.

  1. void Command_Cipserver(uint8_t mode, uint16_t port)
  2. {
  3.     char data[50] = {0};
  4.     if(port != 0)
  5.     {
  6.         sprintf(data, "AT+CIPSERVER=%u,%u", mode, port);
  7.         UART_SENDSTRING(ESP8266_USART, data, CR_LF);
  8.     }
  9.     else
  10.     {
  11.         if(0 == mode)       {       UART_SENDSTRING(ESP8266_USART, "AT+CIPSERVER=0", CR_LF);    }
  12.         else if(1 == mode)  {       UART_SENDSTRING(ESP8266_USART, "AT+CIPSERVER=1", CR_LF);    }
  13.     }
  14. }

AT+CIPMODE - (format: AT+CIPMODE=[0...1]) - komenda ta ustawia tryb odbierania danych. Dla wartości 0 przychodzą one w formacie "+IPD, kanał, ilość bajtów". Jeśli zostanie wprowadzona wartość 1 to dane będą wysyłane bezpośrednio na port szeregowy. Drugi tryb pracy może zostać uruchomiony tylko dla trybu TCP jednopołączeniowego bądź dla UDP. 

  1.         //Set transfer mode 0 - Normal mode | 1 - unvarnish transmission mode
  2.         //Response: +CWMODE: mode OK
  3.         case Command_AT_CIPMODE:
  4.             if(0==param)        {   UART_SENDSTRING(ESP8266_USART, "AT+CIPMODE=0", CR_LF);  }
  5.             else if(1==param)   {   UART_SENDSTRING(ESP8266_USART, "AT+CIPMODE=1", CR_LF);  }
  6.         break;

Jeśli połączenie zostanie zerwane to układ wyśle wiadomość składającą się z linkID oraz słowa CLOSED. Ponowne połączenie nie nastąpi automatycznie. 

AT+SAVETRANSLINK - (format: AT+SAVETRANSLINK=<mode>,<IP>,<port>,[<type>],[tcp keep alive]) - zapisuje dane do linku w pamięci flash.


  1. /*
  2.  * Save transparent transmission link to flash
  3.  * AT+SAVETRANSLINK =<mode>, <remote IP or domain name>, <remote port>[, <type>][, <TCP keep alive>]
  4.  * AT+SAVETRANSLINK =<mode>, <remote IP>, <remote port>[, <type>][,<UDP local port>]
  5.  */
  6. uint8_t Save_Trans_Trans_Link(uint8_t mode, char *remote_IP, uint16_t port, char *type, uint16_t TCP_or_UDP_param)
  7. {
  8.     char data[50] = {0};
  9.     if(0 == mode)                   //0 - normal mode
  10.     {
  11.         if('x' == type[0])
  12.         {
  13.             sprintf(data, "AT+SAVETRANSLINK=0,\"%s\",%u", &remote_IP[0], port);
  14.             UART_SENDSTRING(ESP8266_USART, data, CR_LF);
  15.             return 1;
  16.         }
  17.         else
  18.         {
  19.             if(0 == TCP_or_UDP_param)
  20.             {
  21.                 sprintf(data, "AT+SAVETRANSLINK=0,\"%s\",%u,\"%s\",0", &remote_IP[0], port, &type[0]);
  22.                 UART_SENDSTRING(ESP8266_USART, data, CR_LF);
  23.                 return 1;
  24.             }
  25.             else if((TCP_or_UDP_param > 0) && (TCP_or_UDP_param < 7201))
  26.             {
  27.                 sprintf(data, "AT+SAVETRANSLINK=0,\"%s\",%u,\"%s\",%u", &remote_IP[0], port, &type[0], TCP_or_UDP_param);
  28.                 UART_SENDSTRING(ESP8266_USART, data, CR_LF);
  29.                 return 1;
  30.             }
  31.         }
  32.     }
  33.     else if(1 == mode)              //1 - UART_wifi passthrough mode
  34.     {
  35.         if('x' == type[0])
  36.         {
  37.             sprintf(data, "AT+SAVETRANSLINK=0,\"%s\",%u", &remote_IP[0], port);
  38.             UART_SENDSTRING(ESP8266_USART, data, CR_LF);
  39.             return 1;
  40.         }
  41.         else
  42.         {
  43.             if(0 == TCP_or_UDP_param)
  44.             {
  45.                 sprintf(data, "AT+SAVETRANSLINK=0,\"%s\",%u,\"%s\",0", &remote_IP[0], port, &type[0]);
  46.                 UART_SENDSTRING(ESP8266_USART, data, CR_LF);
  47.                 return 1;
  48.             }
  49.             else if((TCP_or_UDP_param > 0) && (TCP_or_UDP_param < 7201))
  50.             {
  51.                 sprintf(data, "AT+SAVETRANSLINK=0,\"%s\",%u,\"%s\",%u", &remote_IP[0], port, &type[0], TCP_or_UDP_param);
  52.                 UART_SENDSTRING(ESP8266_USART, data, CR_LF);
  53.                 return 1;
  54.             }
  55.         }
  56.     }
  57.     return 0;
  58. }

AT+CIPSTO - (format: AT+CIPSTO=<time>


  1.         case Command_AT_CIPSTO:
  2.             sprintf(dane, "AT+CIPSTO=%u", data);
  3.             UART_SENDSTRING(ESP8266_USART, dane, CR_LF);
  4.         break;
AT+PING - (format: AT+PING=<IP>) - sprawdzanie czasu odpowiedzi od układu. Jako parametr podaje się adres IP lub nazwę domeny.


  1. /*
  2.  * Function Ping
  3.  * AT+PING=<IP>
  4.  */
  5. uint8_t Ping(uint8_t type, char *IP, char *Name)
  6. {
  7.     char data[50] = {0};
  8.     if(0 == type)
  9.     {
  10.         if('x' != Name[0])
  11.         {
  12.             return 0;
  13.         }
  14.         sprintf(data, "AT+PING=\"%u.%u.%u.%u\"", IP[0], IP[1], IP[2],  IP[3]);
  15.         UART_SENDSTRING(ESP8266_USART, data, CR_LF);
  16.         return 1;
  17.     }
  18.     else if(1 == type)
  19.     {
  20.         sprintf(data, "AT+PING=\"%s\"", &Name[0]);
  21.         UART_SENDSTRING(ESP8266_USART, data, CR_LF);
  22.         return 1;
  23.     }
  24.     return 0;
  25. }

AT+CIUPDATE - (format: AT+CIUPDATE) - uaktualnienie oprogramowania AT w układzie przez sieć wifi. Jej wywołanie w przypadku poprawnej pracy będzie skutkowało wypisaniem na ekranie czterech komunikatów. Pierwszy informuje o znalezieniu serwera, drugi o poprawnym połączeniu do niego, czwarty o znalezieniu poprawnego oprogramowania. Ostatni natomiast oznacza, że aktualizacja się rozpoczęła. Po wykonaniu trzeba wywołać funkcję Restore.

  1.        case Command_AT_CIUPDATE:
  2.             UART_SENDSTRING(ESP8266_USART, "AT+CIUPDATE", CR_LF);
  3.             break;

AT+CIPDINFO - (format: AT+CIPINFO=<mode>) - wyświetla IP oraz port razem z odpowiedzią odebrania danych +IDP.


  1.         case Command_AT_CIPDINFO:
  2.             if(0 == param)      {   UART_SENDSTRING(ESP8266_USART, "AT+CIPDINFO=0", CR_LF); }
  3.             else if(1 == param) {   UART_SENDSTRING(ESP8266_USART, "AT+CIPDINFO=1", CR_LF); }
  4.             break;

Poniżej znajduje się funkcja wspólna dla komend sprawdzających stany poszczególnych elementów:

  1. //----------------------------------------------------------------------------------------------
  2. /*
  3.  * Functions to prepare most of commands
  4.  */
  5. void Send_Command(Command_To_Send command, uint8_t param, uint16_t data)
  6. {
  7.     char dane[100] = {0};
  8.     switch(command)
  9.     {
  10.         //----------------------------------------------------
  11.         //Check communication
  12.         //Response: OK
  13.         //TESTOWANE OK
  14.         case Command_AT:
  15.             UART_SENDSTRING(ESP8266_USART, "AT", CR_LF);
  16.         break;
  17.         //----------------------------------------------------
  18.         //Reset ESP
  19.         //Response: OK
  20.         //TESTOWANE OK
  21.         case Command_AT_RST:
  22.             UART_SENDSTRING(ESP8266_USART, "AT+RST", CR_LF);
  23.         break;
  24.         //----------------------------------------------------
  25.         //Enable/Disable multiple connections AT+CIPMUX = mode
  26.         //0 - single connection | 1 - Multiple connections(MAX 4)
  27.         //Response: +CIPMUX: mode OK
  28.         case Command_AT_CIPMUX:
  29.             if(0 == param)      {   UART_SENDSTRING(ESP8266_USART, "AT+CIPMUX=0", CR_LF);   }
  30.             else if(1 == param) {   UART_SENDSTRING(ESP8266_USART, "AT+CIPMUX=1", CR_LF);   }
  31.         break;
  32.         //----------------------------------------------------
  33.         case Command_AT_CIPCLOSE:
  34.             sprintf(dane, "AT+CIPCLOSE=%u", param);
  35.             UART_SENDSTRING(ESP8266_USART, dane, CR_LF);
  36.         break;
  37.         //----------------------------------------------------
  38.         //Send data to client
  39.         case Command_AT_CIPSEND:
  40.             //Podstawowe przeslanie danych
  41.             UART_SENDSTRING(ESP8266_USART, "AT+CIPSEND=0,5", CR_LF);
  42.         break;
  43.         //----------------------------------------------------
  44.         //Enter deep sleep mode, (AT+GSLP=time), time in ms
  45.         //Hardware has to support deep-sleep wake up (Reset pin has to be High)
  46.         //TESTOWANE OK, Uk³ad wchodzi w stan uœpienia
  47.         case Command_AT_GSLP:
  48.             if(data != 0)
  49.             {
  50.                 sprintf(dane, "AT+GSLP=%u", data);
  51.                 UART_SENDSTRING(ESP8266_USART, dane, CR_LF);
  52.             }
  53.         break;
  54.         //----------------------------------------------------
  55.         //Enable/Disable Echo, two commands ATE0 (Disable), ATE1 (Enable)
  56.         //Response:OK
  57.         case Command_AT_ATE:
  58.             if(0 == param)      {   UART_SENDSTRING(ESP8266_USART, "ATE0", CR_LF);  }
  59.             else if(1 == param) {   UART_SENDSTRING(ESP8266_USART, "ATE1", CR_LF);  }
  60.         break;
  61.         //----------------------------------------------------
  62.         //Wifi Mode, station, AP, station + AP
  63.         //Response: +CWMODE: mode OK
  64.         case Command_AT_CWMODE:
  65.             if(Wifi_Mode_Station == param || Wifi_Mode_Ap == param || Wifi_Mode_Ap_Station == param)
  66.             {
  67.                 sprintf(dane, "AT+CWMODE=%u", param);
  68.                 UART_SENDSTRING(ESP8266_USART, dane, CR_LF);
  69.             }
  70.         break;
  71.         case Command_AT_CWMODE_CUR:
  72.             if(Wifi_Mode_Station == param || Wifi_Mode_Ap == param || Wifi_Mode_Ap_Station == param)
  73.             {
  74.                 sprintf(dane, "AT+CWMODE_CUR=%u", param);
  75.                 UART_SENDSTRING(ESP8266_USART, dane, CR_LF);
  76.             }
  77.         break;
  78.         case Command_AT_CWMODE_DEF:
  79.             if(Wifi_Mode_Station == param || Wifi_Mode_Ap == param || Wifi_Mode_Ap_Station == param)
  80.             {
  81.                 sprintf(dane, "AT+CWMODE_DEF=%u", param);
  82.                 UART_SENDSTRING(ESP8266_USART, dane, CR_LF);
  83.             }
  84.         break;
  85.         //----------------------------------------------------
  86.         //Get local IP address
  87.         //Response: +CWMODE: mode OK
  88.         case Command_AT_CIFSR:
  89.                 UART_SENDSTRING(ESP8266_USART, "AT+CIFSR", CR_LF);
  90.         break;
  91.         //----------------------------------------------------
  92.         //Set transfer mode 0 - Normal mode | 1 - unvarnish transmission mode
  93.         //Response: +CWMODE: mode OK
  94.         case Command_AT_CIPMODE:
  95.             if(0==param)        {   UART_SENDSTRING(ESP8266_USART, "AT+CIPMODE=0", CR_LF);  }
  96.             else if(1==param)   {   UART_SENDSTRING(ESP8266_USART, "AT+CIPMODE=1", CR_LF);  }
  97.         break;
  98.         //----------------------------------------------------
  99.         //Set server timeout
  100.         //
  101.         case Command_AT_CIPSTO:
  102.             sprintf(dane, "AT+CIPSTO=%u", data);
  103.             UART_SENDSTRING(ESP8266_USART, dane, CR_LF);
  104.         break;
  105.         //----------------------------------------------------
  106.         //Factory reset, clear data in flash memmory
  107.         //Response: Module reset
  108.         case Command_AT_RESTORE:
  109.             UART_SENDSTRING(ESP8266_USART, "AT+RESTORE", CR_LF);
  110.         break;
  111.         //----------------------------------------------------
  112.         //Set EPS into sleep mode,
  113.         //Response: OK
  114.         case Command_AT_SLEEP:
  115.             if(Wifi_Mode_Disable == param || Wifi_Mode_Light == param || Wifi_Mode_Modem == param)
  116.             {
  117.                 sprintf(dane, "AT+SLEEP=%u", param);
  118.                 UART_SENDSTRING(ESP8266_USART, dane, CR_LF);
  119.             }
  120.             break;
  121.         //----------------------------------------------------
  122.         //Set value of RF TX power, not precise
  123.         //Param: 0 to 82
  124.         //Response: OK
  125.         case Command_AT_RFPower:
  126.             if((param >= 0) || (param <= 82))
  127.             {
  128.                 sprintf(dane, "AT+SLEEP=%u", param);
  129.                 UART_SENDSTRING(ESP8266_USART, dane, CR_LF);
  130.             }
  131.             break;
  132.         //----------------------------------------------------
  133.         case Command_AT_RFVDD:
  134.             if((data >= 1900) || (data <= 3300))
  135.             {
  136.                 sprintf(dane, "AT+RFVDD=%u", data);
  137.                 UART_SENDSTRING(ESP8266_USART, dane, CR_LF);
  138.             }
  139.             break;
  140.         //----------------------------------------------------
  141.         case Command_AT_CIOBAUD:
  142.             if(data != 0)
  143.             {
  144.                 sprintf(dane, "AT+CIOBAUD=%u", data);
  145.                 UART_SENDSTRING(ESP8266_USART, dane, CR_LF);
  146.             }
  147.             break;
  148.         //----------------------------------------------------
  149.         case Command_AT_CWLAPOPT:
  150.             if(data < 128 && ((0 == param) || (1 == param)))
  151.             {
  152.                 sprintf(dane, "AT+CWLAPOPT=%u,%u", param, data);
  153.                 UART_SENDSTRING(ESP8266_USART, dane, CR_LF);
  154.             }
  155.             break;
  156.         //----------------------------------------------------
  157.         //Disconnect from AP
  158.         //Response: OK
  159.         case Command_AT_CWQAP:
  160.             UART_SENDSTRING(ESP8266_USART, "AT+CWQAP", CR_LF);
  161.             break;
  162.         //----------------------------------------------------
  163.         //Auto connect to AP
  164.         //Response: OK
  165.         case Command_AT_CWAUTOCONN:
  166.             if(0 == param)
  167.             {
  168.                 UART_SENDSTRING(ESP8266_USART, "AT+CWAUTOCONN=0", CR_LF);
  169.             }
  170.             else if(1 == param)
  171.             {
  172.                 UART_SENDSTRING(ESP8266_USART, "AT+CWAUTOCONN=1", CR_LF);
  173.             }
  174.             break;
  175.         //----------------------------------------------------
  176.         case Command_AT_CWSTARTSMART:
  177.             if(1 == param)      {   UART_SENDSTRING(ESP8266_USART, "AT+CWSTARTSMART=1", CR_LF); }
  178.             else if(2 == param) {   UART_SENDSTRING(ESP8266_USART, "AT+CWSTARTSMART=2", CR_LF); }
  179.             else if(3 == param) {   UART_SENDSTRING(ESP8266_USART, "AT+CWSTARTSMART=3", CR_LF); }
  180.             break;
  181.         //----------------------------------------------------
  182.         case Command_AT_CWSTOPSMART:
  183.             UART_SENDSTRING(ESP8266_USART, "AT+CWSTOPSMART", CR_LF);
  184.             break;
  185.         //----------------------------------------------------
  186.         case Command_AT_CIPSTATUS:
  187.             UART_SENDSTRING(ESP8266_USART, "AT+CIPSTATUS", CR_LF);
  188.             break;
  189.         //----------------------------------------------------
  190.         case Command_AT_CIPSSLSIZE:
  191.             if(0 == param)
  192.             {
  193.                 UART_SENDSTRING(ESP8266_USART, "AT+CIPSSLSIZE=2048", CR_LF);
  194.             }
  195.             else if(1 == param)
  196.             {
  197.                 UART_SENDSTRING(ESP8266_USART, "AT+CIPSSLSIZE=4096", CR_LF);
  198.             }
  199.             break;
  200.         //----------------------------------------------------
  201.         case Command_AT_CWSTOPDISCOVER:
  202.             UART_SENDSTRING(ESP8266_USART, "AT+CWSTOPDISCOVER", CR_LF);
  203.             break;
  204.         //----------------------------------------------------
  205.         case Command_AT_WPS:
  206.             if(0 == param)      {   UART_SENDSTRING(ESP8266_USART, "AT+WPS=0", CR_LF);  }
  207.             else if(1 == param) {   UART_SENDSTRING(ESP8266_USART, "AT+WPS=1", CR_LF);  }
  208.             break;
  209.         //----------------------------------------------------
  210.         case Command_AT_CIPCLOSE:
  211.             if((param >= 0) && (param <= 5))
  212.             {
  213.                 sprintf(dane, "AT+CIPCLOSE=%u", param, data);
  214.                 UART_SENDSTRING(ESP8266_USART, dane, CR_LF);
  215.             }
  216.             break;
  217.         //----------------------------------------------------
  218.         case Command_AT_CIUPDATE:
  219.             UART_SENDSTRING(ESP8266_USART, "AT+CIUPDATE", CR_LF);
  220.             break;
  221.         //----------------------------------------------------
  222.         case Command_AT_CIPDINFO:
  223.             if(0 == param)      {   UART_SENDSTRING(ESP8266_USART, "AT+CIPDINFO=0", CR_LF); }
  224.             else if(1 == param) {   UART_SENDSTRING(ESP8266_USART, "AT+CIPDINFO=1", CR_LF); }
  225.             break;
  226.         default:
  227.         break;
  228.     }
  229. }
  230. //------------------------------------------------------------------------------------------------------------
  231. /*
  232.  * Function sending checking command to ESP8266
  233.  * Command format: AT+Command?
  234.  */
  235. void Send_Command_Check(Command_To_Check command)
  236. {
  237.     switch(command)
  238.     {
  239.         //----------------------------------------------------
  240.         case Check_CIOBAUD:
  241.             UART_SENDSTRING(ESP8266_USART, "AT+CIOBAUD?", CR_LF);
  242.         break;
  243.         //----------------------------------------------------
  244.         case Check_AT_CWMODE:
  245.             UART_SENDSTRING(ESP8266_USART, "AT+CWMODE?", CR_LF);
  246.         break;
  247.         //----------------------------------------------------
  248.         case Check_AT_CIPMODE:
  249.             UART_SENDSTRING(ESP8266_USART, "AT+CIPMODE?", CR_LF);
  250.         break;
  251.         //----------------------------------------------------
  252.         case Check_AT_CIPMUX:
  253.             UART_SENDSTRING(ESP8266_USART, "AT+CIPMUX?", CR_LF);
  254.         break;
  255.         //----------------------------------------------------
  256.         case Check_AT_GMR:
  257.             UART_SENDSTRING(ESP8266_USART, "AT+GMR", CR_LF);
  258.         break;
  259.         //----------------------------------------------------
  260.         case Check_AT_CWLAP:
  261.             UART_SENDSTRING(ESP8266_USART, "AT+CWLAP", CR_LF);
  262.         break;
  263.         //----------------------------------------------------
  264.         case Check_AT_CWJAP:
  265.             UART_SENDSTRING(ESP8266_USART, "AT+CWJAP?", CR_LF);
  266.         break;
  267.         //----------------------------------------------------
  268.         case Check_AT_CIPSTA:
  269.             UART_SENDSTRING(ESP8266_USART, "AT+CIPSTA?", CR_LF);
  270.         break;
  271.         //----------------------------------------------------
  272.         case Check_AT_CIPSTAMAC:
  273.             UART_SENDSTRING(ESP8266_USART, "AT+CIPSTAMAC?", CR_LF);
  274.         break;
  275.         //----------------------------------------------------
  276.         case Check_AT_CIFSR:
  277.             UART_SENDSTRING(ESP8266_USART, "AT+CIFSR", CR_LF);
  278.         break;
  279.         //----------------------------------------------------
  280.         case Check_AT_CWSAP:
  281.             UART_SENDSTRING(ESP8266_USART, "AT+CWSAP?", CR_LF);
  282.             break;
  283.         //----------------------------------------------------
  284.         case Check_AT_CWLIF:
  285.             UART_SENDSTRING(ESP8266_USART, "AT+CWLIF", CR_LF);
  286.             break;
  287.         //----------------------------------------------------
  288.         case Check_AT_CWDHCP:
  289.             UART_SENDSTRING(ESP8266_USART, "AT+CWDHCP?", CR_LF);
  290.             break;
  291.         //----------------------------------------------------
  292.         case Check_AT_CIPAP:
  293.             UART_SENDSTRING(ESP8266_USART, "AT+CIPAP?", CR_LF);
  294.             break;
  295.         //----------------------------------------------------
  296.         case Command_AT_CWLAP:
  297.             UART_SENDSTRING(ESP8266_USART, "AT+CWLAP", CR_LF);
  298.             break;
  299.         //----------------------------------------------------
  300.         default:
  301.         break;
  302.     }
  303. }

Obsługa pakietów odbieranych jest przeze mnie rozwiązana w pętli głównej, gdzie odbierane są dane od UART7 i wypisane poprzez USART1. Tam w momencie odebrania danych porównywane są one z przygotowanymi formatami odpowiedzi. W zależności od niej podejmowane są dalsze czynności: 

  1. if (USART_Get_Data(UART7, rx_buf, sizeof(rx_buf)))
  2. {
  3.     UART_SENDSTRING(USART1,rx_buf,CR_LF);
  4.     if(rx_buf[0] == 'O' && rx_buf[1] == 'K')
  5.     {
  6.         UART_SENDSTRING(USART1,"Odpowiedz OK",CR_LF);
  7.         if(1 == ESP_Flag.ESP_Send_Test_Message_Flag)
  8.         {
  9.             UART_SENDSTRING(ESP8266_USART,"Hello",CR_LF);
  10.             ESP_Flag.ESP_Send_Test_Message_Flag = 0;
  11.         }
  12.     }
  13.     else if(rx_buf[0] == 'E' && rx_buf[1] == 'R' && rx_buf[2] == 'R' && rx_buf[3] == 'O' && rx_buf[4] == 'R')
  14.     {
  15.     }
  16.     //...
  17.     //...
  18. }


  • AT+CWMODE=1 - ustawienie trybu pracy, musi być skonfigurowane jako klient 
  • AT+CIPMODE=0 - ustawienie trybu odbieranych danych na format +IPD
  • AT+CIPMUX=1 - tryb pracy na wielu połączeniach
  • AT+CWLAP - wyświetlenie dostępnych sieci wifi
  • AT+CWJAP="nazwa","hasło" - połączenie z wybraną siecią wifi 
  • AT+CIFSR - sprawdzenie adresy IP oraz MAC ESP
  • AT+CIPSERVER=1,1001 - postawienie serwera na porcie 1001, jeśli serwet dla stron HTTP to port 80. 
Ja cały projekt wykonałem dodatkowo z obsługą dotyku oraz wyświetlacza. Dzięki czemu wszystkie komendy można było wprowadzać bezpośrednio z płytki. Przyciski wykonałem za pomocą biblioteki STemWin. Dane odebrane były wyświetlane na wyświetlaczu oraz przekazywane na USART1. Pozwoliło to znacząco ułatwić proces obsługi poprzez wykorzystanie wyświetlacza z klawiaturą, dodatkowo na USARCIE można było porównać otrzymaną odpowiedź. 

Funkcje obsługujące ustawiane tryby można wykonać za pomocą wysłania komendy, po czym sprawdzana jest odpowiedź jeśli wszystko przeszło poprawnie to wysyłana jest kolejna wiadomość do ESP. Można to zrobić za pomocą ustawiania flagi poprawnego odebrania danych. Gdzie następnie sprawdzana jest jej wartość.