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 с адаптером можно здесь USBASP USBISP 3.3 с адаптером

Ethernet LAN Сетевой Модуль можно купить здесь 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 не будет опубликован. Обязательные поля помечены *

*