poniedziałek, 15 maja 2017

C# - Program do obsługi ESP8266 V1.0

Ten post chciałbym poświęcić na przygotowanie prostego programu pozwalającego na wysyłanie komend do układu ESP8266. Do testów wykorzystałem układ ESPWROOM - 02. 

Komunikacja z układem zostanie wykonana za pomocą komend AT.

Dokumentację można znaleźć pod tymi linkami: ESP AT Instruction set, Command Examples.

Spis komend obsługiwanych przez pierwszą wersję programu:


Poniżej znajduje się pełna lista komend jaka jest obsługiwana przez program. Została ona podzielona na kilka grup: komendy podstawowe, obsługa wifi oraz urządzenie standalone.

Zestaw obsługiwanych komend:

Komendy podstawowe:


  • AT
  • AT+RST
  • AT+GMR
  • AT+GSLP
  • ATE
  • AT+RESTORE
  • AT+UART
  • AT+UART_CUR
  • AT+UART_DEF
  • AT+SLEEP
  • AT+WAKEUPGPIO
  • AT+RFPOWER
  • AT+RFVDD


Komedy Wifi:


  • AT+CWMODE
  • AT+CWMODE_CUR
  • AT+CWMODE_DEF
  • AT+CWJAP
  • AT+CWJAP_CUR
  • AT+CWJAP_DEF
  • AT+CWLAPOPT
  • AT+CWLAP
  • AT+CWQAP
  • AT+CWSAP
  • AT+CWSAP_CUR
  • AT+CWSAP_DEF
  • AT+CWLIF
  • AT+CWDHCP
  • AT+CWDHCP_DEF
  • AT_CWDHCP_CUR
  • AT+CWDHCPS_CUR
  • AT+CWDHCPS_DEF
  • AT+CWAUTOCONN
  • AT+CIPSTAMAC
  • AT+CIPSTAMAC_CUR
  • AT+CIPSTAMAC_DEF
  • AT+CIPAPMAC
  • AT+CIPAPMAC_CUR
  • AT+CIPAPMAC_DEF
  • AT+CIPSTA
  • AT+CIPSTA_CUR
  • AT+CIPSTA_DEF
  • AT+CIPAP
  • AT+CIPAP_CUR
  • AT+CIPAP_DEF
  • AT+CWSTARTSMART
  • AT+CWSTOPSMART
  • AT+CWSTARTDISCOVER
  • AT+CWSTOPDISCOVER
  • AT+WPS
  • AT+MDNS


Komendy TCP:


  • AT+CIPSTATUS
  • AT+CIPDOMAIN
  • AT+CIPSTART
  • AT+CIPSSLIZE
  • AT+CIPSEND
  • AT+CIPSENDEX
  • AT+CIPSENDBUF
  • AT+CIPBUFSTATUS
  • AT+CIPCHECKSEQ
  • AT+CIPBUFRESET
  • AT+CIPCLOSE
  • AT+CIFSR
  • AT+CIPMUX
  • AT+CIPSERVER
  • AT+CIPMODE
  • AT+SAVETRANSLINK
  • AT+CIPSTO
  • AT+PING
  • AT+CIUPDATE
  • AT+CIPDINFO
  • AT+CIPSNTPCFG
  • AT+CIPSNTPTIME
  • AT+CIPDNS_CUR
  • AT+CIPDNS_DEF


Okna programu:

Główne okno programu w górnej części zawiera deklarację parametrów połączenia wraz z przyciskami pozwalającymi na jego nawiązanie.


Kliknięcie na czerwony prostokąt pozwala nawiązać połączenie. Jeśli jest ono aktywne to kolor ulega zmianie na zielony.

Odebrane dane będą wyświetlane po lewej stronie w polu. Wąskie pole poniżej przycisków służących do nawiązania połączenia służy do wprowadzenia komendy zdefiniowanej przez użytkownika.

Przyciski w zależności od rodzaju komendy wysyłają informacje same, bądź po kliknięciu przeniosą do drugiego formularza, który pozwoli na zdefiniowanie dokładnych parametrów dla danej komendy.

Poniżej dwa przykładowe okna włączane po kliknięciu na przycisk:




Opis działania:


Program zbudowany jest z przycisków które pozwalają na komunikację z modułem ESP. Przyciski mniej skomplikowane wysyłają domyślną komendę po kliknięciu. W przypadku komend bardziej rozbudowanych następuje przeniesienie do nowego okna, które zawiera informacje odnośnie wysyłanej komendy oraz dopuszczalne do wprowadzenia elementy. W przypadku kontrolek w które można wprowadzać dane bardziej rozbudowane, np. adres mac czy ip, to sugestia odnośnie wprowadzanych informacji znajduje się po najechaniu na kontrolkę. W większości przypadków poprawność danych jest weryfikowana, jednak nie dla wszystkich opcji. Możliwe jest jej rozwinięcie wraz z kolejnymi wersjami. 

Przykładowy kod programu jest podobny dla wszystkich form:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10. using System.IO.Ports;
  11. namespace SerialComP7D
  12. {
  13.     public partial class cipCheckseqForm : Form
  14.     {
  15.         SerialPort cipCheckseqPort;
  16.         //--------------------------------------------------
  17.         public cipCheckseqForm()
  18.         {
  19.             InitializeComponent();
  20.         }
  21.         //--------------------------------------------------
  22.         public void setSerialPort(SerialPort port)
  23.         {
  24.             cipCheckseqPort = port;
  25.         }
  26.         //--------------------------------------------------
  27.         private void cipCheckSeqCancelBtn_Click(object sender, EventArgs e)
  28.         {
  29.             this.Hide();
  30.         }
  31.         //--------------------------------------------------
  32.         private void cipCheckseqForm_FormClosed(object sender, FormClosedEventArgs e)
  33.         {
  34.             this.Hide();
  35.         }
  36.         //--------------------------------------------------
  37.         private void cipCheckSeqExSendBtn_Click(object sender, EventArgs e)
  38.         {
  39.             if (cipCipCheckseqSegmentTextBox.Text == "")
  40.             {
  41.                 MessageBox.Show("Choose proper data");
  42.             }
  43.             else if ((cipCipCheckseqSegmentTextBox.Text != "") && (cipCheckSeqLinkIdComboBox.SelectedIndex == -1))
  44.             {
  45.                 try
  46.                 {
  47.                     string dataToTransmit = "AT+CIPCHECKSEQ=" +
  48.                                              cipCipCheckseqSegmentTextBox.Text +
  49.                                              Environment.NewLine;
  50. #if DEBUG
  51.                     MessageBox.Show(dataToTransmit);
  52. #endif
  53. #if TRACE
  54.                     cipCheckseqPort.Write(dataToTransmit);
  55. #endif
  56.                 }
  57.                 catch (Exception exc) { MessageBox.Show("Connection Error\n" + exc.Message); }
  58.             }
  59.             else if ((cipCipCheckseqSegmentTextBox.Text != "") && (cipCheckSeqLinkIdComboBox.SelectedIndex != -1))
  60.             {
  61.                 try
  62.                 {
  63.                     string dataToTransmit = "AT+CIPCHECKSEQ=" + cipCheckSeqLinkIdComboBox.SelectedItem.ToString() + ',' +
  64.                                                                 cipCipCheckseqSegmentTextBox.Text + Environment.NewLine;
  65. #if DEBUG
  66.                     MessageBox.Show(dataToTransmit);
  67. #endif
  68. #if TRACE
  69.                     cipCheckseqPort.Write(dataToTransmit);
  70. #endif
  71.                 }
  72.                 catch (Exception exc) { MessageBox.Show("Connection Error\n" + exc.Message); }
  73.             }
  74.             this.Hide();
  75.         }
  76.     }
  77. }

Wywołanie formy wygląda następująco:

  1.         //--------------------------------------------------------------------------------------------------------------------
  2.         /*
  3.             *     Checks If a Specific Segment Was Successfully Sent
  4.             *     Single connection: AT+CIPCHECKSEQ=<segment ID>
  5.             *     multiple connections: AT+CIPCHECKSEQ=<link ID>,<segment ID>
  6.             *     This command can only be used when AT+CIPSENDBUFis used
  7.         */
  8.         private void checkSeqBtn_Click(object sender, EventArgs e)
  9.         {
  10.             cipCheckseqForm cipCheckseqWindow = new cipCheckseqForm();
  11.             cipCheckseqWindow.StartPosition = FormStartPosition.CenterScreen;
  12.             cipCheckseqWindow.setSerialPort(ComPort);
  13.             cipCheckseqWindow.Show(this);
  14.         }


Odbieranie danych od Usartu wyświetlane jest w jednym oknie w formacie ASCII. Zrezygnowałem z wyświetlania danych w formacie szesnastkowym, ponieważ ta opcja dla ESP jest nieprzydatna.

Program wykorzystuje dwie definicje globalne DEFINE oraz TRACE. Pierwsza z nich zawiera w definicja każdej z komend wywołanie MesssageBoxa odpowiedzialnego za udzielenie informacji o tym w jakim formacie zostanie przesłana komenda. Druga definicja zawiera część wykonywalną dla układu ESP8266.

W programie jako komentarze wykorzystałem informacje znajdujące się w dokumentacji od producenta. Można ją pobrać klikając na link z dokumentacją na górze strony.

Program jest narazie pierwszą wersją, którą pewnie w przyszłości będę trochę rozwijał i dodawał dodatkowe funkcjonalności.

Program można pobrać pod tym linkiem.