В предыдущей части нашего занятия мы подключили карту 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[] = {
Соберём код, прошьём контроллер и попробуем запросить различные документы с сервера.
Запросим главную страницу (нажмите на картинку для увеличения изображения)
Запросим другой файл, например index1.htm
Загрузим в папку IMG на карту SD несколько файлов в формате jpeg
Также откроем файл index.htm и добавим туда картинку из файла куда-нибудь в текст страницы
</ul></p>
<p>
<img src="/IMG/img02.jpg" />
</p>
<p>High Endurance Non-volatile Memory Segments</p>
Вставим карту обратно в наш самодельный картоприёмник, подключим питание и запросим опять главную страницу (нажмите на картинку для увеличения изображения)
Можно вставить картинку и поменьше и побольше но только одну, иначе браузер пытается открыть несколько соединений, а у нас такой поддержки нет. Я пытался добавить виртуальные сокеты, но видимо потому, что свободное количество памяти у нас уже стремится к нулю, номер сокета, а также некоторые переменные, хотя и с аттрибутом volatile начинают без моего ведома менять значение, поэтому я забросил это занятие. Здесь нужен уже контроллер помощнее. Но и так, я считаю неплохо. если же мы хотим всё равно добавить несколько рисунков, правда небольших, обойти этот нюанс можно с помощью внедрения данных картинок прямов код html, то есть в саму страницу. Для этого существует несколько онлайн-сервисов, с помощью которых можно сделать эти преобразования. Код выглядит приблизительно так
<img width=»51" height=»29" title=»» alt=»» src=»data:image/jpeg;base64,/9j/4QhkRXhpZg… и т.д.
Таким образом я добился вывода нескольких изображений на странице
Таким образом, с помощью сегодняшнего урока мы смогли улучшить наш HTTP-сервер, расширив его память для хранения файлов с помощью подключения карты SD и файловой системы. Хотя конечно скорость оставляет желать лучшего, так как карта у нас подключена по интерфейсу SPI да ещё и программного, что не позволяет общаться с ней со скоростью превышающей 1 мегабит в секунду, тем не менее мы ещё раз проработали протокол HTTP, научившись также учитывать и размер окна, а также передавать другие документы кроме главной страницы, причём и других форматов.
Спасибо за внимание!
Предыдущая часть Программирование МК AVR Следующий урок
Приобрести плату Arduino Nano V3.0 оригинальный FT232RL можно здесь.
Приобрести программатор USBASP USBISP с адаптером можно здесь USBASP USBISP 3.3 с адаптером
Ethernet LAN Сетевой Модуль можно купить здесь ENC28J60 Ethernet LAN Сетевой Модуль.
Смотреть ВИДЕОУРОК в RuTube(нажмите на картинку)
Смотреть ВИДЕОУРОК в YouTube(нажмите на картинку)
Прекрасно! Преподаватель от Бога! Огромное спасибо за лекции.
Ваши лекции, как та книга, которую крайне необходима, чтобы получить хороший толчок к дальнейшим знаниям в этой области.
Хотелось бы увидеть еще уроки:
1. C Wifi модулями.
2. С приемником и передатчиком 433 мГц и кнопочным брелком.
Спасибо за тёплый комментарий.
Возможно, такие уроки будут, но вряд ли с этим контроллером.
Но, я думаю, какой именно контроллер, большого значения для нас уже не имеет.
Вот именно! Благодаря Вам.