В предыдущей части нашего занятия мы подключили карту 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 Сетевой Модуль.
Смотреть ВИДЕОУРОК (нажмите на картинку)
Прекрасно! Преподаватель от Бога! Огромное спасибо за лекции.
Ваши лекции, как та книга, которую крайне необходима, чтобы получить хороший толчок к дальнейшим знаниям в этой области.
Хотелось бы увидеть еще уроки:
1. C Wifi модулями.
2. С приемником и передатчиком 433 мГц и кнопочным брелком.
Спасибо за тёплый комментарий.
Возможно, такие уроки будут, но вряд ли с этим контроллером.
Но, я думаю, какой именно контроллер, большого значения для нас уже не имеет.
Вот именно! Благодаря Вам.