AVR Урок 52. LAN. ENC28J60. TCP WEB Server. Подключаем карту SD. Часть 2



В предыдущей части нашего занятия мы подключили карту SD к нашему контроллеру, создали проект и написали некоторый код для работы с файловой системой, позволяющий открыть нужный документ с карты SD, определить его размер, тип, а также написали код в функции передачи однопакетного документа для извлечения данных документа из файла.

 

Аналогичные действия проделаем в следующей функции — tcp_send_http_first

 

//Отправляем первую часть страницы

if ((tcpprop.http_doc==EXISTING_HTML)||(tcpprop.http_doc==EXISTING_JPG))

{

  result=pf_mount(&fs);

  result=pf_open(tcpprop.fname); //Попытка открыть файл

  result=pf_lseek(0); //Установим курсор чтения на 0 в файле

  if (tcpprop.http_doc==EXISTING_HTML)

  {

    strcpy_P((char*)tcp_pkt->data,http_header);

    result=pf_read((void*)tcp_pkt->data+strlen_P(http_header),tcp_mss-strlen_P(http_header),&s1);

  }

  else

  {

    strcpy_P((char*)tcp_pkt->data,jpg_header);

    result=pf_read((void*)tcp_pkt->data+strlen_P(jpg_header),tcp_mss-strlen_P(jpg_header),&s1);

  }

}

else

 

Следующая функция — tcp_send_http_middle

 

if ((tcpprop.http_doc==EXISTING_HTML)||(tcpprop.http_doc==EXISTING_JPG))

{

  if (tcpprop.http_doc==EXISTING_HTML)

  {

    result=pf_lseek(((uint32_t)tcp_mss*(tcpprop.cnt_data_part-tcpprop.cnt_rem_data_part))-strlen_P(http_header)); //Установим курсор чтения в файле

  }

  else

  {

    result=pf_lseek(((uint32_t)tcp_mss*(tcpprop.cnt_data_part-tcpprop.cnt_rem_data_part))-strlen_P(jpg_header)); //Установим курсор чтения в файле

  }

  result=pf_read((void*)tcp_pkt->data,tcp_mss,&s1);

}

else

 

 

Здесь практически то же самое, только указатель мы уже устанавливаем не на 0, а в соответствующее место в файле, а также мы перед этим не монтируем файловую систему и не открываем файл, так как это у нас уже сделано.

Ну и последняя функция — tcp_send_http_last

 

if ((tcpprop.http_doc==EXISTING_HTML)||(tcpprop.http_doc==EXISTING_JPG))

{

  if (tcpprop.http_doc==EXISTING_HTML)

  {

    result=pf_lseek((tcp_mss*(tcpprop.cnt_data_part-1))-strlen_P(http_header)); //Установим курсор чтения в файле

  }

  else

  {

    result=pf_lseek((tcp_mss*(tcpprop.cnt_data_part-1))-strlen_P(jpg_header)); //Установим курсор чтения в файле

  }

  sprintf(str1,"pf_lseek: %drn",result);

  USART_TX((uint8_t*)str1,strlen(str1));

  result=pf_read((void*)tcp_pkt->data,tcpprop.last_data_part_size,&s1);

}

else

 

Массив с главной страницей теперь можно удалить

 

const PROGMEM uint8_t index_htm[] = {

 

Соберём код, прошьём контроллер и попробуем запросить различные документы с сервера.

Запросим главную страницу (нажмите на картинку для увеличения изображения)

 

image00_0500

 

Запросим другой файл, например index1.htm

 

image01

 

 

Загрузим в папку IMG на карту SD несколько файлов в формате jpeg

 

image02

 

Также откроем файл index.htm и добавим туда картинку из файла куда-нибудь в текст страницы

 

</ul></p>
<p>
  <img src="/IMG/img02.jpg" />
</p>

<p>High Endurance Non-volatile Memory Segments</p>

 

Вставим карту обратно в наш самодельный картоприёмник, подключим питание и запросим опять главную страницу (нажмите на картинку для увеличения изображения)

 

image03_0500

 

Можно вставить картинку и поменьше и побольше но только одну, иначе браузер пытается открыть несколько соединений, а у нас такой поддержки нет. Я пытался добавить виртуальные сокеты, но видимо потому, что свободное количество памяти у нас уже стремится к нулю, номер сокета, а также некоторые переменные, хотя и с аттрибутом volatile начинают без моего ведома менять значение, поэтому я забросил это занятие. Здесь нужен уже контроллер помощнее. Но и так, я считаю неплохо. если же мы хотим всё равно добавить несколько рисунков, правда небольших, обойти этот нюанс можно с помощью внедрения данных картинок прямов код html, то есть в саму страницу. Для этого существует несколько онлайн-сервисов, с помощью которых можно сделать эти преобразования. Код выглядит приблизительно так

 

<img width=»51" height=»29" title=»» alt=»» src=»data:image/jpeg;base64,/9j/4QhkRXhpZg… и т.д.

 

Таким образом я добился вывода нескольких изображений на странице

 

image04

 

Таким образом, с помощью сегодняшнего урока мы смогли улучшить наш HTTP-сервер, расширив его память для хранения файлов с помощью подключения карты SD и файловой системы. Хотя конечно скорость оставляет желать лучшего, так как карта у нас подключена по интерфейсу SPI да ещё и программного, что не позволяет общаться с ней со скоростью превышающей 1 мегабит в секунду, тем не менее мы ещё раз проработали протокол HTTP, научившись также учитывать и размер окна, а также передавать другие документы кроме главной страницы, причём и других форматов.

Спасибо за внимание!

 

 

Предыдущая часть Программирование МК AVR Следующий урок

 

Исходный код

 

 

Приобрести плату Arduino Nano V3.0 оригинальный FT232RL можно здесь.

Программатор (продавец надёжный) USBASP USBISP 2.0

Ethernet LAN Сетевой Модуль можно купить здесь (модуль SD SPI в подарок) ENC28J60 Ethernet LAN Сетевой Модуль.

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

AVR LAN. ENC28J60. TCP WEB Server. Подключаем карту SD

3 комментария на “AVR Урок 52. LAN. ENC28J60. TCP WEB Server. Подключаем карту SD. Часть 2
  1. Анатолий:

    Прекрасно! Преподаватель от Бога! Огромное спасибо за лекции.
    Ваши лекции, как та книга, которую крайне необходима, чтобы получить хороший толчок к дальнейшим знаниям в этой области.
    Хотелось бы увидеть еще уроки:
    1. C Wifi модулями.
    2. С приемником и передатчиком 433 мГц и кнопочным брелком.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*