Например TDA7294

РадиоКот > Схемы > Цифровые устройства > Примочки к ПК

STM32F4-DISCOVERY Пример подключения к Ethernet

Автор: Борис Горшков, 4bg@mail.ru
Опубликовано 11.03.2015.
Создано при помощи КотоРед.

STM32F4-DISCOVERY Пример подключения к Ethernet

 

        Итак, коллеги, продолжим начатую ранее тему освоения платы STM32F4-DISCOVERY, и в этой части речь пойдет о подключении к сети Ethernet.

        На основе демонстрационного примера мы рассмотрим создание веб-сервера (STM32F4),  мониторинга и управления удаленным виртуальным объектом, а также способы передачи, сбора и отображения информации. Большое внимание уделим клиентской части примера — браузеру на персональном компьютере,  который запрашивает специализированные веб-страницы, находящиеся на сервере. Рассмотрим варианты создания интерфейса задания и отображения информации с помощью html-страницы и специализированной программы. Во втором случае для извлечения информации  и автоматического заполнения форм понадобится парсинг html.

         В отличие от предыдущей публикации (Пример USB HID устройства на STM32F4-DISCOVERY) данный пример максимально упрощен, что значительно облегчит восприятие и позволит избежать некоторых нудных моментов.

        Сразу замечу, если вы не планируете самостоятельного создания веб-сервера на основе микроконтроллера (STM32, среда программирования  CooCox  IDE) то данная статья, скорее всего, будет для вас неактуальной, так как рассматриваемое устройство не предназначено для автономного использования.

 

Архитектура сети

        Для примера создания веб–сервера, который выполняет управление удаленными объектами по локальной сети, используется следующая конфигурация с настройками рис.1.

                                          Рис.1 Архитектура и настройки сети.

 

        Важным звеном при реализации Ethernet-интерфейса является трансивер физического уровня (PHY). Устройство физического уровня обеспечивает кодирование данных, поступающих от MAC-подуровня для передачи их по транспортной среде, синхронизацию передаваемых данных, а также прием и декодирование данных. В качестве приемопередатчика используется DP83848 Ethernet Board[1]. Настройки сети для ноутбука показаны на рис.2.

                                                                       Рис.2. Настройка  ноутбука.

Совсем немного теории


         CGI (Common Gateway Interface — общий интерфейс шлюза) — стандарт интерфейса, используемый для связи внешней программы с веб-сервером. Такую программу принято называть скриптом (сценарием) или CGI-программой.

        Необходимо отметить, что интерфейс CGI осуществляет связь между различными программами  web-сервера и браузером пользователя для отображения HTML- страниц с динамически обновляемой информацией.  Обычно запрос осуществляется путем заполнения каких-либо форм, например,  в чек-боксе отмечаются включенные светодиоды на плате сервера рис.3. После заполнения и отправки данные передаются программе CGI, которая обрабатывает эту информацию по соответствующему алгоритму и затем возвращает браузеру результат, будь то простое подтверждение или,  например, состояние светодиодов и датчиков рис.7.

                                        Рис.3 Станица html c заполненными полями LED2, LED4 и фрагмент кода для этого состояния.

        В примере используется способ посылки параметров сценарию с данными  в командной строке URL, называемый методом GET (существует еще один  способ - передачи параметров  –POST,  который в данной конфигурации не используется). Для второго и четвертого LED формируется запрос вида: GET /leds.cgi?led=2&led=4. Разделяют параметры с помощью символа &, а leds.cgi это и есть программа обработки, которая должным образом должна среагировать на эти параметры. 

        Для отправки информации браузеру используется технология SSI (Server Side Includes — включения на стороне сервера)  осуществляющая  сборку веб-страниц на сервере из отдельных составных частей и выдачу клиенту полученного HTML-документа.  По этой технологии сервер работает следующим образом. Если в html документе существует строка (tag)  <!--#t-->, то вместо нее будет подставлена строка, которая записана в буфере *pcInsert. Выбор символа для tag (тегов может быть несколько) и их количество задается в  httpd_cgi_ssi.c:

 

/* we will use character "t" as tag for CGI */

char const* TAGCHAR="t";

char const** TAGS=&TAGCHAR;

Максимальный размер этого буфера  задается в файле httpd.h:

/* The maximum length of string that can be returned to replace any given tag */

#ifndef LWIP_HTTPD_MAX_TAG_INSERT_LEN

#define LWIP_HTTPD_MAX_TAG_INSERT_LEN 256

При использовании инструкций SSI файл должен оканчиваться расширением .shtml или .shtm поскольку для повышения быстродействия при отправке обычных страниц они не проверяются сервером на наличие инструкций включения.

 

Веб-страницы сервера

      Для начала создадим html страницы сервера (текст страниц упрощен, а для написания их по всем правилам надо что-то почитать, например [3],[4]) и поместим их в папку fs проекта. Для этого нам потребуется текстовый редактор, например Notepad2, и любой браузер рис.4.

                              Рис.4  Внешний вид главной страницы сервера index.html.

                              Рис. 5  Текст  index.html.

 

        Главная страница  содержит логотип сервера – рисунок 1.jpg (рис.5- строка 6), ссылки на станицы сервера (строки 12-14) , текст и кнопку Радио КОТ.

        Следующая страница - STM32F4x7Tx.html (ссылка “Передача данных”)  рис.3  содержит поля ввода (формы) для включения/отключения 8-и дискретных выходов, и два поля задания параметров Var1 и Var2. Это могут быть значения поддерживаемой температуры, время включения каких-либо устройств и т. п.

        Откроем следующую страницу -  STM32F4x7Rx.shtml (“Прием данных”). Она имеет достаточно простой внешний вид – рис.6

                               Рис.6 Страница   STM32F4x7Rx.shtml.

И такой же код:

<!DOCTYPE html>

<html>

<head>

<title>Demo STM32F4x7 Ethernet</title> 

</head>

<meta http-equiv="refresh" content="1">

<body text="#000000" bgcolor="#ffffff"><center>

<body text="#3333FF" bgcolor="#000000" link="#3333FF" alink="#3333FF" vlink="#3333FF">

<font size="+3"color="#3333FF"><b><i>STM32F4x7 Webserver Demo</i></b></font><br>

<font size="+2"color="#3333FF"><b><i>Прием данных</i></b></font><br>

<hr noshade width="100%" align="left">

<a href = "index.html" title = "Ссылка"><em>Главная</em></a>&nbsp;&nbsp;&nbsp;

<a href = "STM32F4x7Tx.html" title = "Ссылка"><em>Передача данных</em></a>&nbsp;&nbsp;&nbsp;

<a href = "STM32F4x7Rx.shtml" title = "Ссылка"><em>Текущая страница</em></a><BR>

<hr noshade width="100%" align="left">

</center>

<h5>Данные</h5><P>

<pre>

<!--#t-->

</pre>

<hr noshade width="100%" align="left">

</BODY>

</HTML>  

 

        Если внимательно посмотреть на открытую страницу в браузере, то можно заметить, что она периодически обновляется. За это отвечает мета тег Refresh, который определяет задержку времени в секундах. У нас установлено минимальное значение -1с, которое может быть увеличено в зависимости от задач мониторинга сигналов.  И самое главное, о чем мы уже говорили – это тег <!--#t-->, вместо которого сервер подставляет запрашиваемые данные, подготовленные пользовательской программой и помещенные в буфер *pcInsert размером в 256 символов.

        Не удивляйтесь, если в архиве (папка HTML_Off программы VisualEth) найдете страницу   STM32F4x7Rx.shtml с уже заполненными данными и отсутствующим тегом #t рис.7 – она написана для имитации заполненной страницы  сервером (точная копия одного из вариантов запроса) и использовалась для отладки программы визуализации в автономном режиме.

                                                                  Рис. 7 Страница   STM32F4x7Rx.shtml с данными.

 

        О содержимом страницы будет рассказано позже, а пока поговорим о подключении html файлов в проект.  На самом деле, как вы уже догадались, они  там есть, и мы будем исходить из того, что на этапе их рассмотрения были внесены изменения и теперь проводим обновление. Для этого поместим наши файлы в папку fs проекта как показано на рис 8.1 и запустим на выполнение утилиту makefsdata.exe. В результате ее выполнения в корневом каталоге появится файл fsdata.c, который необходимо перенести (выполнить замену) в папку   ub_libhttp_serverstm_lolevel. После перекомпиляции проекта html страницы будут размещены в памяти микроконтроллера.

        Прежде, чем мы двинемся дальше, хочу предупредить, что в проекте имеется две папки fs с рисунком и без на странице index.html. На рис.8.2 размер файла fsdata.c  32КБ указан для варианта без логотипа.  Размеры выходных файлов отличается в разы, но в проекте без особых проблем можно использовать  любой вариант по желанию.

                                                          Рис.8 Файлы проекта и содержимое папки fs  для варианта с рисунком.

 

 Описание примера. Микроконтроллер

        Рассматриваемая программа предназначена для примера подключения устройства на микроконтроллере STM32F4-DISCOVERY к сети Ethernet и демонстрации обмена данными с ПК. Реализована в среде CooCox CoIDE Version: 1.7. (использованы материалы [9],[10],[11]).

Тестирование программы проводилось только в ОС Windows XP.

В проекте нас, прежде всего, интересуют следующие файлы:

- main.h – содержит настройки сети: mac – адрес, ip – адрес, шлюз, маску сети.

- main.с – содержит  функции инициализации и главный цикл.

- httpd_cgi_ssi.c – исходный файл,  реализующий SSI и CGI обработчики.

-  httpd.c –  исходный код web – сервера.

- fsdata.c – файл содержит сформированные с помощью утилиты makefsdata.exe страницы html.

Ниже приведены функции-обработчики SSI и CGI.

 

SSI

        Эта функция заполняет буфер *pcInsert  для, подстановки  сервером вместо строки   <!--#t-->  в shtml документ рис 7. В нашем примере  обработчик Data_Handler заносит в буфер  текст фиксированного формата, состоящий из 23 строк,  каждая из которых   содержит два  четырехзначных  числа, разделенных пробелом и символ перевода строки 'n' — всего 9 символов. Эта договоренность упрощает обработку информации программой визуализации данных клиента. Следующее упрощение касается самих данных – мы их берем из предварительно заполненных массивов значениями:

 - две синусоиды А и В  (uint16_t SerA [20],  uint16_t SerB[20] — по 20 точек);

 - переменные Var1 и Var2 – заданы клиентом;

 - сигналы состояния LED1…LED8.

Заметьте, что перед заполнением данные подвергаются конвертации Int To Char.

Теперь  будет понятна структура сообщения в окне 2  рис.8:

- строки 0…19  значения периода синусоид А и В;

- строка 20   значения   Var1, Var2;

- строка 21   значения  резерв;

- строка 22   значения  LED1…LED8.

 

//Data_Handler : SSI handler for Rx page HTML

u16_t Data_Handler(int iIndex, char *pcInsert, int iInsertLen)

{

  if (iIndex ==0)

  {

    char DigitA1=0, DigitA2=0, DigitA3=0, DigitA4=0;

    char DigitB1=0, DigitB2=0, DigitB3=0, DigitB4=0;

    uint32_t Da, Db;

    uint32_t Mi=0;

    int i=0;

 

  while (i<23)

    {

    if (i<20)  { Da= SerA[i];   Db= SerB[i]; }

    if (i==20) { Da=  Dref[0];  Db= Dref[1];}

    if (i==21) { Da=  Dref[2];  Db=  Dref[3];}

    if (i==22) { Da= DdigitalH; Db= DdigitalL;}

 

    //--  prepare data to be inserted in html

     DigitA1= Da/1000;

     DigitA2= (Da-( DigitA1*1000))/100 ;

     DigitA3= (Da-(( DigitA1*1000)+(DigitA2*100)))/10;

     DigitA4=  Da -(( DigitA1*1000)+(DigitA2*100)+ (DigitA3*10));

 

     DigitB1= Db/1000;

     DigitB2= (Db-(DigitB1*1000))/100 ;

     DigitB3= (Db-((DigitB1*1000)+(DigitB2*100)))/10;

     DigitB4=  Db -((DigitB1*1000)+(DigitB2*100)+ (DigitB3*10));

 

     //--  get digits to display

     *(pcInsert + Mi)   =   (char)(DigitA1+0x30);

     *(pcInsert +(Mi+ 1)) = (char)(DigitA2+0x30);

     *(pcInsert +(Mi+ 2)) = (char)(DigitA3+0x30);

     *(pcInsert +(Mi+ 3)) = (char)(DigitA4+0x30);

     *(pcInsert +(Mi+ 4)) = ' ';

     *(pcInsert +(Mi+ 5)) = (char)(DigitB1+0x30);

     *(pcInsert +(Mi+ 6)) = (char)(DigitB2+0x30);

     *(pcInsert +(Mi+ 7)) = (char)(DigitB3+0x30);

     *(pcInsert +(Mi+ 8)) = (char)(DigitB4+0x30);

     *(pcInsert +(Mi+ 9)) = 'n';

      Mi+=10;  i++;

    }

    /*  need to be inserted in html*/

    return strlen(pcInsert);

  }

  return 0;

}

 

CGI

        Эта функция обрабатывает запросы страницы  STM32F4x7Tx.html рис.3. Алгоритм обработки данных построен на  анализе параметров тега  <input>  name="led">, value="1…8"  и  name="Var1.. Var2" для  type="checkbox/text">. Полученные таким образом данные воздействуют на соответствующие  светодиоды и переменные с одновременным занесением их в буферы для последующей отправки клиенту для индикации состояния.

 

// CGI handler for LEDs control

const char * LEDS_CGI_Handler(int iIndex, int iNumParams, char *pcParam[], char *pcValue[])

{

 /* We have only one SSI handler iIndex = 0 */

  if (iIndex==0)

  {

    uint32_t i=0;

     /* All leds off */

    LEDOff(LED3);

    LEDOff(LED4);

    LEDOff(LED5);

    LEDOff(LED6);

    //----------------

    DdigitalL=0;   DdigitalH=0;

 

    /* Check cgi parameter : example GET /leds.cgi?led=2&led=4 */

    for (i=0; i<iNumParams; i++)

    {

      /* check parameter "led" */

      if (strcmp(pcParam[i] , "led")==0)  

      {

        /* switch led1 ON if 1 */

        if(strcmp(pcValue[i], "1") ==0) {

          GPIOD->BSRRL = GPIO_Pin_12;

          DdigitalL|=1;

        }

        /* switch led2 ON if 2 */

        else if(strcmp(pcValue[i], "2") ==0) {

          GPIOD->BSRRL = GPIO_Pin_13;

          DdigitalL|=2;

        }

        /* switch led3 ON if 3 */

        else if(strcmp(pcValue[i], "3") ==0) {

          GPIOD->BSRRL = GPIO_Pin_14;

          DdigitalL|=4;

        }

        /* switch led4 ON if 4 */

        else if(strcmp(pcValue[i], "4") ==0) {

          GPIOD->BSRRL = GPIO_Pin_15;

         DdigitalL|=8;

        }

        else if(strcmp(pcValue[i], "5") ==0) {

                DdigitalL|=16;

        }

        else if(strcmp(pcValue[i], "6") ==0) {

                        DdigitalL|=32;

        }

        else if(strcmp(pcValue[i], "7") ==0) {

                        DdigitalL|=64;

        }

        else if(strcmp(pcValue[i], "8") ==0) {

                        DdigitalL|=128;

        }

      }

        if (strcmp(pcParam[i] , "Var1")==0)

        {Dref[0] = atoi(pcValue[i]); }

 

        if (strcmp(pcParam[i] , "Var2")==0)  {

            {Dref[1] = atoi(pcValue[i]); }

        }

    }

  }

  /* uri to send after cgi call*/

  return "/STM32F4x7Tx.html";

}

 

Работа

        Распакуйте скачанный архив. Полагаю, что этап настройки среды программирования уже давно пройден, и здесь  рассматриваться не будет. А потому компилируем проект и загружаем в плату STM32F4. Менять настройки  файла main.h пока не надо. Соберите схему рис.1 и настройте сеть рис.2.  По адресу 192.168.1.110 в браузере должна загрузиться уже знакомая нам страница на рис.9. Можно использовать любой браузер, в том числе и программы визуализации данных сервера проекта – VDS_Demo.  Впрочем, забегая наперед, отмечу, что программа VDS_Demo писалась под ХР и работа на поздних версиях ОС не проверялась. В худшем случае ее придется перекомпилировать.

        Думаю, что документ загрузился и можно пройтись по страницам нашего сервера. На странице “Передача данных “ рис.3  Попытайтесь  изменить состояние светодиодов и переменных, причем реакцию первых четырех LED1-LED4 можно наблюдать на плате веб-сервера.

        После нажатия кнопки “SEND” страница перезагружается с очищенными полями (за это отвечает строка return "/STM32F4x7Tx.html"; процедурыLEDS_CGI_Handler), о выполнении запроса можно судить по состоянию светодиодов или изменившимся данным страницы   STM32F4x7Rx.shtml (см. 3 последних строки). Попробуем представить эти данные в более удобном для нас виде.

 

Описание примера. Компьютер

        Для индикации  нам понадобится написать небольшую программку визуализации данных сервера в среде Delphi5. Скриншоты закладок программы  приведены на рисунках  9-11.

                              Рис. 9  Главное окно программы.

 

       Для работы с html документами в Delphi имеется компонент WebBrowser [6],[7], входящий в состав Microsoft Internet Explorer. Для  его использования  в своей программе необходимо поместить на форму соответствующий компонент, размещенный на закладке Internet. После этого, чтобы отобразить в нем страницу HTML, необходимо кнопкой ”Загрузить” вызвать  метод Navigate с указанием адреса загрузки. В зависимости от состояния чек-бокса это может быть адрес сервера (ComboBox1.Text) или папки в каталоге программы - Webbrowser1.Path+'HTML_Offindex.html'. Последний вариант может использоваться при отладке создания страниц html и программы. А далее нас интересует событие окончания загрузки документа DocumentComplete, где и производится обработка. Прежде чем рассматривать алгоритм следует упомянуть и запомнить, что событие DocumentComplete имеет свои особенности для документов, содержащих фреймы, анимацию и графику.

      Теперь к нашей процедуре. В начале, если открыта закладка  ActivePageIndex =2 (“Прием”), копируем принятый html документ в Memo1 и проверяем, что это интересующая нас страница - STM32F4x7Rx.shtml. И только после этого извлекаем и обрабатываем данные. Иначе произошел сбой, в результате которого был принят документ 404.html. В этом случае производится перезагрузка сервера процедурой WebBrowser1.GoBack.

 

//**** Процедура вызывается после окончания загрузки страницы HTML *****

procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;

  const pDisp: IDispatch; var URL: OleVariant);

var

  HTML: IHTMLDocument2;

  i:  integer;

  col: integer;                               // column

  s1,s2,s3:          word;

  D:array  [0..40]of word;

  nbv: string;                                 //number value

  STd: string[10];  STv: string[10];

 

begin

if PageControl1.ActivePageIndex=2

  then begin

HTML := WebBrowser1.Document as IHTMLDocument2;

 Memo1.Text:= HTML.body.innerText;    //!!!!!скопировали HTNL стр в Memo

//Label2.Caption:= inttostr( Length(Memo1.Text)) ; // 357 символов для этого примера

if   Length(Memo1.Text)=357 then begin // что бы не обрабатывать стр 404.html

 N:=N+1;

//**Индикация -кол-во принятых пакетов

 Form1.StatusBar1.Panels[0].Text:='  RxPackets ='+ IntToStr(N);

 

//-----Обработка пакета

//** Прочитали строку с дискретными сигналами

  STd:= Memo1.Lines.Strings[Memo1.Lines.Count-1];

  StBinary2:= Copy(STd,1,4);  StBinary1:= Copy(STd,6,4);

 

// --Прочитали  и обр 2-е строки с переменными

 STd:= Memo1.Lines.Strings[Memo1.Lines.Count-2];

 StVar3:= Copy(STd,1,4);  StVar4:= Copy(STd,6,4);

 //Label1.Caption:= StBinary1;

 STd:= Memo1.Lines.Strings[Memo1.Lines.Count-3];

 StVar1:= Copy(STd,1,4);  StVar2:= Copy(STd,6,4);

 

//** Убрали лишнее в заголовке

 for i:=0 to Memo1.Lines.Count-21-3 do    //

  begin

  Memo1.Lines.Delete(0);

  end;

 

//** Скопировали в буфер если в нем еще есть место

    if (CounterWord < 9000-20) then

    begin

//--

      nbv:=' ';  col:=1;

      for i := 1 to Length(Memo1.Text)-27 do   //3*(4+1+4+1) 3строки по 9 символов

        begin

         if (Memo1.text[i]<>' ')and(Memo1.text[i]<>#13)and(Memo1.text[i]<>#10)

            then  begin

             nbv:=nbv+Memo1.text[i];

                  end

         else begin

              if (Memo1.text[i]<>#10)then begin

 

//--Копируем значение колонок в буфер

    if col=1 then begin Buf_Series1[CounterWord]:=StrToint(nbv); end;

    if col=2 then begin Buf_Series2[CounterWord]:=StrToint(nbv); end;

    nbv:=' ';  col:=col+1;

    if (col=3) then begin col:=1; CounterWord:=CounterWord+1;    end;

                                          end;   //   if (Memo1.text[i]

              end;   //  else

         end;        //  do

       Nser:=Nser+1;

    end;  //  if (CounterWord

  RunRxData;                                                                     // Обработка данных- LED1-8, Var1,2

  if (Nser=4) then begin Nser:=0;  RunRxPacket;  end;    // графики,

                                  end       //  if   Length(Memo1.Text)=359

              else  begin

  ErrorRx:= ErrorRx+1;

  Form1.StatusBar1.Panels[2].Text:='  ErrorRx ='+ IntToStr(ErrorRx);

  WebBrowser1.Stop;

  WebBrowser1.GoBack;

                       end;                     //  else

                     end else FlagStart:= false; // if (WebBrowser1.LocationName

end;

                                            Рис. 10 Закладка браузера 2- “Прием”.

 

Результат обработки данных страницы STM32F4x7Rx.shtml наблюдаем на рис. 10:

1- окно вывода графических данных строки     0…19 Мемо1;

2- окно Мемо1 с принятыми данными строки. 0…22;

3- поле для вывода числовых данных строки    20…21 Мемо1;

4- поле для вывода дискретных данных строка  22       Мемо1;

5- поле ввода переменных Var1, Var2 страницы STM32F4x7Тx.html (рис.11)

6- кнопка имитации SEND.

 

       Кроме  перечисленных элементов страница содержит шесть чекбоксов для задания состояния LED1…LED8 .

       По нажатию кнопки 6 запускается процедура  CendClick – автоматического заполнения страницы STM32F4x7Тx.html закладки “Передача” рис.11 данными  полей 4 и 5 рис10. с последующей отправкой на сервер [8].

 

//----- SEND

procedure TForm1.CendClick(Sender: TObject);

var

doc: IHTMLDocument2;

fEl : Variant;   //  Form _elements

begin

doc := WebBrowser2.Document as IHTMLDocument2;

if Assigned(doc)  then

  begin

  fEL := WebBrowser2.OleObject.Document.forms.item(0).elements;

//  Label1.Caption:= IntToStr(doc.Forms.length);

//  Label2.Caption:= IntToStr(fEl.length) ;

  if fEl.length=11 then

     begin

 

    // Знаем что на странице 1-а форма, 11 элементов

    // Заполняем  элементы формы 0..10)

 

    if L1.Checked then fEl.item(0).checked:='checked';   //LED1

    if L2.Checked then fEl.item(1).checked:='checked';

    if L3.Checked then fEl.item(2).checked:='checked';

    if L4.Checked then fEl.item(3).checked:='checked';

 

    if L5.Checked then fEl.item(4).checked:='checked';

    if L6.Checked then fEl.item(5).checked:='checked';

    if L7.Checked then fEl.item(6).checked:='checked';

    if L8.Checked then fEl.item(7).checked:='checked';   //LED8

 

    fEl.item(8).value:=  IntToStr(SpinEdit1.Value);         //var1

    fEl.item(9).value:=  IntToStr(SpinEdit2.Value);          //var2

 

    fEl.item(10).Click;                                                //SEND

   end;

  end;

end;

 

        Результат наблюдаем в 1-4 рис. 10. Обратите внимание, что закладка “Прием” рис. 10 является функциональным аналогом страниц html  на рисунках  7 и  11 с дополнительной функцией отображения данных в графическом и текстовом виде.

 

                              Рис. 11

Заключение

        Скачать исходные тексты программ для сервера и клиента можно по ссылке ниже.

        Заметьте, что в статье не отражены некоторые правки программ, которые вносились в процессе подготовки публикации.  Надеюсь, что данный материал поможет в создании своего веб-сервера.

       На этом можно было бы поставить точку, если бы не  одно “но”. Не проверили кнопку Радио КОТ  на рис.9.

Работает!  Всеем удачи.


P.S. В процессе оформления материала вспомнился бородатый советский анекдот, когда рабочий тракторного завода жалуется, мол какие запчасти ни тащишь с родного завода, а начинаешь дома собирать — получается  автомат Калашникова. Так и у меня – неожиданно  получилось продолжение…

Во второй части рассмотрим передачу файлов с сервера (графический, тестовый  и видео).  

 

Литература:

1. Сетевая модель OSI  [электронный ресурс]  Режим доступа: https://ru.wiki2.org/wiki/Сетевая_модель_OSI

2. lwIP,  Adam Dunkels OSI [электронный ресурс]  Режим доступа: https://ru.wikipedia.org/wiki/LwIP, http://dunkels.com/adam/

 3. DP83848C [электронный ресурс]  Режим доступа: http://www.gaw.ru/html.cgi/txt/ic/National_Semi/Interfaces/Ethernet/Physical/DP83848C.htm

4. Учебник по HTML [электронный ресурс]  Режим доступа: http://gabdrahimov.ru/html-uchebnik

5. Учебник по HTML [электронный ресурс]  Режим доступа: http://www.postroika.ru/news2.html

6 Как сделать WebBrowser средствами Delphi 5 HTML [электронный ресурс]  Режим доступа:

http://www.delphisources.ru/pages/faq/base/create_webbrowser.html

7. Компонент WebBrowser - пишем свой браузер в Delphi [электронный ресурс]  Режим доступа:

http://delphiport.ucoz.com/publ/komponent_webbrowser_pishem_svoj_brauzer_v_delphi/1-1-0-15

8. TWebBrowser, OleObject и его свойства — Парсинг от А до Я [электронный ресурс]  Режим доступа: http://parsing-and-i.blogspot.co.il/

9. Практика для студентов. Мясищев А.А. Web – сервер на STM32F4Discovery + STM32F4DIS-BB [электронный ресурс]  Режим доступа: http://webstm32.sytes.net/stm32_web/stm32_3.html

10. 40-HTTP_Server-Library (STM32F4) [электронный ресурс]  Режим доступа: http://mikrocontroller.bplaced.net/wordpress/?page_id=1529

11. Ethernet on STM32F4DISCOVERY using external PHY [электронный ресурс].  Режим доступа: http://blog.tkjelectronics.dk/2012/08/ethernet-on-stm32f4discovery-using-external-phy/comment-page-1

 


Файлы:
Сервер
Клиент


Все вопросы в Форум.


ID: 2083