![]() |
|
|
Cетевые протоколы и технологии TCP/IP стек |
![]() |
|
Опции темы | Опции просмотра |
![]() |
#1 |
Senior Member
Регистрация: 24.02.2008
Сообщений: 133
Вес репутации: 126/50 ![]() ![]() |
![]()
Всех с Рождеством.
Поиски и анализ инфы по сети дал несколько сумбурный результат, посему решил "родить" эту тему. Преследую 2 цели: - собственно создать рабочий экземпляр (на основе демо-платы, простейшего проекта...) - разобраться по шагам как ЭТО работает от простого к сложному, от результата к пониманию... Буду крайне признателен любой помощи в данном направлении. Основная задача - максимально быстро получить результат, а потом "обрастать" знаниями и расширять диапазон. Имеется оборудование: Explorer 16/32, WINC1500 PICtail с платой расширения (PICtail Plus Expansion Board). Дебагер PicKit 4. С ним работается значительно быстрее чем с встроенным дебагером на демо-плате. Использую на данный момент MPLAB X IDE v5.35, компилятор XC32 (v2.30), Harmony 3. Предварительная "конечная" цель запустить сие чудо на минимальных затратах, передача файла (скажем текстового) с ПК на микроконтроллер и в обратном направлении, посредством WiFi, используя самый простой пример, любого из уровней стека на процессоре (т.е. используя WINC1500 в bypass режиме). Те примеры, что нашел в сети, имеют ряд недостатков для понимания, не объясняют некоторые, возникающе по мере работы, вопросы. Помогите разбить задачу на подзадачи практического толка. (задачу "изучите, как устроен TCP" стек, желательно поставить на последнее место, именно потому, что это проще учить и понимать на конкретном рабочем примере) Надеюсь тема станет интересным обучающим материалом. )) С чего начать проект? ))) самый простой вопрос для начала. Последний раз редактировалось yagger; 08.01.2021 в 01:58. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Регистрация: 09.11.2012
Адрес: SPB
Возраст: 52
Сообщений: 2,404
Вес репутации: 1047/64 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
ну... я начал с примера от микрочиповского стека... UDP пакеты который передаёт...
и там остался ![]() для моих целей этого хватило... добавил ещё приём и анализ принятых пакетов.. сам стек не "улучшал"... там всё повязано, поэтому ничего не удалял... просто в конфиге стека отключил не нужные фишки.. сложного ничего нет... открываем сокет и шлём в него данные.. всё остальное( формирование заголовка, чексуммы...) на себя стек берёт... короче- ничем не отличается от программирования под винды... даже функции так же называются ![]() если под рукой есть программер под винды и будете использовать стек, то он вам всё обьяснит (напишет) ![]() там от железа всё абстрагировано... ещё мне мне пригодился сетевой снифер, чтобы смотреть как пакеты мои гуляют в сети и собственная прога для отладки, которая шлёт-принимает пакеты на стороне компа... методом тыка, я обмен по UDP - за неделю сделал... при этом никогда с сетью не работал и из помощников только тырнет... и самое западло- в поле данных INT переворачивать надо.... т.е. если массив из int передать, а потом принять и прочитать, то старший байт с младшим местами поменятые будут... я по этим граблям погулял, когда данные с ацп передавал... вот тут снифер и помог- я эту хню увидел, а потом и в инете про это прочитал.. ![]() Последний раз редактировалось SergP01; 08.01.2021 в 11:38. |
![]() |
![]() |
![]() |
#3 |
Senior Member
|
![]()
Как сами написали : от простого к сложному.
1.Запускаем примеры микрочипа на демоборде . 2.Модернизация и доработка стека под свои задачи. Для первого пункта все легко находится. А второй дается только изучением и внедрением в технологию. На втором этапе появляются личные наработки, которыми не всегда готовы делиться. Да и время у специалистов к сожалению в дефиците. По конкретным вопросам могу ответить , но только если они мне известны и я уже находил решения. |
![]() |
![]() |
![]() |
#4 |
Senior Member
Регистрация: 26.02.2008
Адрес: IgorV
Сообщений: 2,613
Вес репутации: 4968/123 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Давно не изучал тему, стек от микрочипа когда нибудь обзаведется кэшем для arp? Как куда-то идти так сначала резолвит. Даже если только что резолвил. Можно подумать, мак все время меняется.
|
![]() |
![]() |
![]() |
#5 | ||||
Senior Member
Регистрация: 24.02.2008
Сообщений: 133
Вес репутации: 126/50 ![]() ![]() |
![]() Цитата:
![]() Цитата:
![]() Цитата:
Цитата:
Начну еще раз и при первых же вопросах выложу сюда. ![]() |
||||
![]() |
![]() |
![]() |
#6 |
Senior Member
Регистрация: 09.11.2012
Адрес: SPB
Возраст: 52
Сообщений: 2,404
Вес репутации: 1047/64 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
дык.... на чём споткнулся...?
самое простое пример который шлёт UPD пакеты.... надо его запустить и убедиться. что он работает... запустить снифер и посмотреть , что пакеты пошли... потом. втыкать в него свои данные... по таймеру их отсылать... дальше освоить приём(светодиодом поморгать по сети)... |
![]() |
![]() |
![]() |
#7 |
Senior Member
Регистрация: 08.03.2008
Адрес: Самара
Возраст: 48
Сообщений: 518
Вес репутации: 443/57 ![]() ![]() ![]() ![]() ![]() |
![]() |
![]() |
![]() |
![]() |
#8 |
Senior Member
Регистрация: 09.11.2012
Адрес: SPB
Возраст: 52
Сообщений: 2,404
Вес репутации: 1047/64 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
вот , нашёл где стек демонстрирует передачу UDP пакетов... и под себя переделал чутка...
Код:
char buf[20]={".....Privet Medved"}; DWORD mIP=192ul | 168ul<<8ul |0ul<<16ul | 255ul<<24ul; // некоторые Линухи не понимают широковещательного 255.255.255.255 void UDPPerformanceTask(void) { UDP_SOCKET MySocket; NODE_INFO Remote; if(!MACIsLinked())return; // если кабель не подключен memcpy((BYTE*)&Remote,(BYTE*)&mIP, sizeof(mIP)); // IP адрес получателя MySocket = UDPOpen(44444, &Remote, 55555);// создаем сокет ...шлём из порта 44444 в порт 55555 if(MySocket == INVALID_UDP_SOCKET)return; // если трабл с сокетом if(!UDPIsPutReady(MySocket)) { UDPClose(MySocket); // сокет не может принять данные return; } UDPPutArray((BYTE*)&buf,20);// кладём данные в пакет UDPFlush();// посылаем // Close the socket so it can be used by other modules UDPClose(MySocket);// закрываем сокет } #endif //#if defined(STACK_USE_UDP_PERFORMANCE_TEST) ![]() |
![]() |
![]() |
![]() |
#9 |
Senior Member
Регистрация: 09.11.2012
Адрес: SPB
Возраст: 52
Сообщений: 2,404
Вес репутации: 1047/64 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
как видно- никаких заморочек на уровне хардварной части...
остались только программерские заморочки ![]() даже чек сумму стек сам считает... |
![]() |
![]() |
![]() |
#10 |
Senior Member
|
![]()
освоить передачу по ТСР или передачу UDP пакетов обычно проблем не вызывает.
Берем из примера микрочипа ТСР-UART мост , там все предельно просто. потом добавляем свою обработку принятых пакетов , и получаем работающий вариант. Это достаточно хорошо работает как на pic1867(97)j60 так и на pic32. А вот когда начнете делать нормальный веб интерфейс для устройства, вот тут и пойдут проблемы - придется допиливать HTTP сервер и MPFS файловую систему. Так как у pic18, pic32 нет классической eeprom памяти для хранения настроечных данных, то придется использовать программную память. Предложенные микрочипом методы решают эту проблему , но и создают новые в виде тормозов и расхода памяти. Короче , если это простенькая задача - то готовые примеры помогают это освоить, а если уровень сложности выше среднего - то только значительная переработка и осмысленное решение задачи. Потом постороение самой либы тср стека вызывает некоторые проблемы. Проблема заключается в том, что все файлы общие , для всех проектов, и начав править под свои задачи один из файлов - делаем остальные свои проекты неработоспособными. Короче для начала нужно создать проект , где этой зависимости не будет. Сделав это - лишаемся автоматического конфигурирования при помощи утилит. Но переходим на новый уровень. файловая система и механизм работы MPFS как в памяти пика , так и во внешней памяти не позволяют раздельно работать ВЕБ программисту дизайнеру и PIC программисту. На простых проектах - все устраивает , а на сложных , когда начинаешь работать командой - проблемы. |
![]() |
![]() |
![]() |
#11 | |
Senior Member
|
![]() Цитата:
Пока на таком уровне используем стек - то как уже писал , проблем не возникает. А как только появится задача изменения настроек , конфигурирование под свои задачи - вот тогда и начнется настоящее программирование. |
|
![]() |
![]() |
![]() |
#12 | |
Senior Member
Регистрация: 09.11.2012
Адрес: SPB
Возраст: 52
Сообщений: 2,404
Вес репутации: 1047/64 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Цитата:
я сейчас с вебмордой бьюсь.... имхо, у микрочипа, она как то странно сделана... а бьюсь потому, что в веб я невзубногой пока... Последний раз редактировалось SergP01; 09.01.2021 в 12:31. |
|
![]() |
![]() |
![]() |
#13 | |
Senior Member
Регистрация: 09.11.2012
Адрес: SPB
Возраст: 52
Сообщений: 2,404
Вес репутации: 1047/64 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Цитата:
![]() имхо, есть набор данных, которые веб программер может как угодно по морде распихивать... задача PIC программера их принять или нужные отослать... это сколько нужно настроечных переменных, чтобы заморочки начинались ? тогда может проще- одноплатный комп прицепить ? |
|
![]() |
![]() |
![]() |
#14 |
Senior Member
|
![]()
Проекты разные от 100 до 300 с лишним настроечных параметров.
Если взять простой случай мост ТСР-UART. 1.IP контролллера 2.Маска контроллера 3.МАС контроллера 4.DHCP включен или нет 5.Шлюз 6.Адрес сервера 7.Порт сервера 8. Клиент серверное подключение 8.Скорость порта 10.Контроль четности 11. 7,8,9 бит код Вот реально дернул кусок кода из проекта. Проект по управлению ADAU1701(1452) с веб интерфейса и это только переменные, чтобы сделать веб управление ADAU. к этим переменным еще два таких списка системных настроек . Код:
struct { unsigned char __attribute__ ((aligned(4))) Fcentr[4][16][8]; unsigned char __attribute__ ((aligned(4))) Qfactor[4][16][8]; unsigned char __attribute__ ((aligned(4))) Boost[4][16][8]; unsigned char __attribute__ ((aligned(4))) Filter_Tipe[4][16]; unsigned char __attribute__ ((aligned(4))) Bypass[4][16]; unsigned char __attribute__ ((aligned(4))) fqaktiv[4][16]; // показывать или нет точку фильтра на графике unsigned char __attribute__ ((aligned(4))) Hi_Pass_Tipe[4]; unsigned char __attribute__ ((aligned(4))) Hi_PassBypass[4]; unsigned char __attribute__ ((aligned(4))) Hi_PassFq[4][8]; unsigned char __attribute__ ((aligned(4))) hiactiv[4]; // показывать или нет обрезной для выбранного выхода unsigned char __attribute__ ((aligned(4))) Low_Pass_Tipe[4]; unsigned char __attribute__ ((aligned(4))) Low_PassBypass[4]; unsigned char __attribute__ ((aligned(4))) Low_PassFq[4][8]; unsigned char __attribute__ ((aligned(4))) lowactiv[4]; // показывать или нет обрезной для выбранного выхода unsigned char __attribute__ ((aligned(4))) fqByPOne[4]; // включение байпас для выбранного выхода unsigned char __attribute__ ((aligned(4))) filtrmode[4]; // ~fqmode~ Режим показа фильтров 8+обрезные или 16 фильтров unsigned char __attribute__ ((aligned(4))) fqSort[4][40]; //[~fqSort~] отсортированный список номеров фильтров 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 unsigned char __attribute__ ((aligned(4))) fqByPAll; // включение байпас для всех фильтров unsigned char __attribute__ ((aligned(4))) fillfq[12]; // раздел INPUT MIXER unsigned char __attribute__ ((aligned(4))) inp_lev[8]; // положение входных регуляторов уровня unsigned char __attribute__ ((aligned(4))) inpmute[8]; // mute входного микшера unsigned char __attribute__ ((aligned(4))) inp_max[8]; // максимальное положение входных регуляторов уровня unsigned char __attribute__ ((aligned(4))) inp_blc[4]; // сцепка входных регуляторов уровня unsigned char __attribute__ ((aligned(4))) mixoutA; // ~mixoutA~ уровень аттеньюатора после микшера unsigned char __attribute__ ((aligned(4))) mixoutB; // ~mixoutB~ уровень аттеньюатора после микшера unsigned char __attribute__ ((aligned(4))) phaseA; // ~phaseA~ фаза сигнала после микшера unsigned char __attribute__ ((aligned(4))) phaseB; // ~phaseB~ фаза сигнала после микшера unsigned char __attribute__ ((aligned(4))) phantom; // ~phantom~ включение фантомного питания микрофона unsigned char __attribute__ ((aligned(4))) extpan; // ~extpan~ включение питания внешней панели unsigned char __attribute__ ((aligned(4))) fillinp[12]; // раздел MATRIX ROUTING unsigned char __attribute__ ((aligned(4))) InputA_sel[4]; // ~inpsA~ Управление селектором для канала А unsigned char __attribute__ ((aligned(4))) InputA_val[4]; // ~inpvA~ Значение уровня сигнала канала А на выход unsigned char __attribute__ ((aligned(4))) InputB_sel[4]; // ~inpsB~ Управление селектором для канала В unsigned char __attribute__ ((aligned(4))) InputB_val[4]; // ~inpvB~ Значение уровня сигнала канала В на выход unsigned char __attribute__ ((aligned(4))) fillrouting[16]; // раздел OUTPUT VOLUME CONTROL unsigned char __attribute__ ((aligned(4))) out_lev[4]; // ~~ положение выходных регуляторов уровня unsigned char __attribute__ ((aligned(4))) outmute[4]; // ~~ mute выходов усилителя unsigned char __attribute__ ((aligned(4))) out_max[4]; // ~~ максимальное положение выходных регуляторов уровня unsigned char __attribute__ ((aligned(4))) out_blc[4]; // ~~ сцепка выходных регуляторов уровня unsigned char __attribute__ ((aligned(4))) outphase[4]; // ~~ фаза сигнала на выходе unsigned char __attribute__ ((aligned(4))) out_spd[4]; // ~~ скорость изменения громкости unsigned char __attribute__ ((aligned(4))) out_br; // ~out_br~ режим выходных усилителей unsigned char __attribute__ ((aligned(4))) filloutput[4]; // раздел SETUP int __attribute__ ((aligned(4))) Fan_min_speed; // минимальная скорость вентилятора , при которой он работает int __attribute__ ((aligned(4))) Fan_max_speed; // максимальная скорость вентилятора unsigned char __attribute__ ((aligned(4))) Fan_Controlmode; // режим работы вентилятора постоянный или по датчику температуры int __attribute__ ((aligned(4))) Fan_const_speed; // Значение скорости вентилятора при постоянном включении int __attribute__ ((aligned(4))) Fan_min_temp_dt1; // минимальное значение Т датчика 1 int __attribute__ ((aligned(4))) Fan_max_temp_dt1; // максимальное значение Т датчика 1, в этом диапазоне Т изменяется скорость вентилятора int __attribute__ ((aligned(4))) Fan_min_temp_dt2; // минимальное значение Т датчика 2 int __attribute__ ((aligned(4))) Fan_max_temp_dt2; // максимальное значение Т датчика 2, в этом диапазоне Т изменяется скорость вентилятора int __attribute__ ((aligned(4))) Fan_min_temp_dt3; // минимальное значение Т датчика 3 int __attribute__ ((aligned(4))) Fan_max_temp_dt3; // максимальное значение Т датчика 3, в этом диапазоне Т изменяется скорость вентилятора unsigned char __attribute__ ((aligned(4))) Fan_step_speed; // количество шагов изменения скорости вентилятора 1-9 unsigned char __attribute__ ((aligned(4))) EnableDT1; // разрешение анализа датчика 1 unsigned char __attribute__ ((aligned(4))) EnableDT2; // разрешение анализа датчика 2 unsigned char __attribute__ ((aligned(4))) EnableDT3; // разрешение анализа датчика 3 unsigned char __attribute__ ((aligned(4))) EnableStandby; // разрешение анализа датчика 3 в режиме Standby unsigned char __attribute__ ((aligned(4))) EnableSceneALL; // Разрешение запуска сценария по датчикам температуры unsigned char __attribute__ ((aligned(4))) EnableSceneDT1; // Разрешение запуска сценария по датчику температуры 1 unsigned char __attribute__ ((aligned(4))) EnableSceneDT2; // Разрешение запуска сценария по датчику температуры 2 unsigned char __attribute__ ((aligned(4))) EnableSceneDT3; // Разрешение запуска сценария по датчику температуры 3 int __attribute__ ((aligned(4))) DT1_temp; // значение температуры при которой запустится сценарий для датчика 1 int __attribute__ ((aligned(4))) DT2_temp; // значение температуры при которой запустится сценарий для датчика 2 int __attribute__ ((aligned(4))) DT3_temp; // значение температуры при которой запустится сценарий для датчика 3 unsigned char __attribute__ ((aligned(4))) EnableLevelDT1; // снижать громкость при превышении температуры усилителя 1 unsigned char __attribute__ ((aligned(4))) EnableLevelDT2; // снижать громкость при превышении температуры усилителя 2 int __attribute__ ((aligned(4))) TempLevelDT1; // значение температуры усилителя 1 при которой снижать громкость int __attribute__ ((aligned(4))) TempLevelDT2; // значение температуры усилителя 2 при которой снижать громкость int __attribute__ ((aligned(4))) LevelDT1; // значение уровня громкости при превышении температуры усилителя 1 int __attribute__ ((aligned(4))) LevelDT2; // значение уровня громкости при превышении температуры усилителя int __attribute__ ((aligned(4))) StepLevelDT1[16]; // расчитанные интервалы температуры для датчика 1 int __attribute__ ((aligned(4))) StepLevelDT2[16]; // расчитанные интервалы температуры для датчика 2 int __attribute__ ((aligned(4))) StepLevelDT3[16]; // расчитанные интервалы температуры для датчика 3 int __attribute__ ((aligned(4))) FanStepLevel[16]; // расчитанные интервалы скорости вращения вентилятора unsigned char __attribute__ ((aligned(4))) autoOffA; // ~autoOffA~ автоматически выключать усилитель при отсутствии сигнала на входе А unsigned char __attribute__ ((aligned(4))) autoOffB; // ~autoOffB~ автоматически выключать усилитель при отсутствии сигнала на входе В unsigned char __attribute__ ((aligned(4))) levelMinOff; // ~LMinOff~ уровень сигнала, ниже которого выключать усилитель unsigned char __attribute__ ((aligned(4))) timeLevelOff; // ~TLOff~ Время после которого отключаем усилитель при отсутствии сигнала unsigned char __attribute__ ((aligned(4))) AMPShutdown; // включен или нет выходной усилитель unsigned char __attribute__ ((aligned(4))) autoOnA; // ~autoOnA~ автоматически включать усилитель при наличии сигнала на входе А unsigned char __attribute__ ((aligned(4))) autoOnB; // ~autoOnB~ автоматически включать усилитель при наличии сигнала на входе В unsigned char __attribute__ ((aligned(4))) levelInp; // ~levelInp~ уровень выше которого включать усилитель unsigned char __attribute__ ((aligned(4))) defOut[4]; // поведение при нажатии на кнопку ресет unsigned char __attribute__ ((aligned(4))) setupXX[12]; // выравнивание памяти // раздел PRIORITY SETUP unsigned char __attribute__ ((aligned(4))) priorOn; // включение отключение системы приоритета звука unsigned char __attribute__ ((aligned(4))) priorCh; // канал анализа уровня сигнала А или В (0,1) unsigned char __attribute__ ((aligned(4))) priorInp; // вход активации системы unsigned char __attribute__ ((aligned(4))) PriorLev; // уровень активации системы unsigned char __attribute__ ((aligned(4))) dspInpA; // уровень фейдера на входе ДСП unsigned char __attribute__ ((aligned(4))) dspInpB; // уровень фейдера на входе ДСП unsigned char __attribute__ ((aligned(4))) priorMixA[4]; // положение регуляторов матричного микшера канал А unsigned char __attribute__ ((aligned(4))) priorMixB[4]; // положение регуляторов матричного микшера канал В unsigned char __attribute__ ((aligned(4))) priorMuteA[4]; // Управление селектором для канала А unsigned char __attribute__ ((aligned(4))) priorMuteB[4]; // Управление селектором для канала В unsigned char __attribute__ ((aligned(4))) zoneVal[4]; // положение регуляторов уровня выходных фейдеров unsigned char __attribute__ ((aligned(4))) priorvol[8]; // положение регуляторов уровня входного микшера unsigned char __attribute__ ((aligned(4))) del_on; // задержка включения системы приоритетов unsigned char __attribute__ ((aligned(4))) del_off; // задержка выключения системы приоритетов unsigned char __attribute__ ((aligned(4))) fillprior[4]; // выравнивание памяти // раздел GLOBAL USER PRESETS unsigned char __attribute__ ((aligned(4))) GUPname[21][16]; unsigned char __attribute__ ((aligned(4))) Filter_Preset_Name[21][16]; unsigned char __attribute__ ((aligned(4))) outname[11][16]; unsigned char __attribute__ ((aligned(4))) inpname[11][16]; unsigned char __attribute__ ((aligned(4))) routname[11][16]; unsigned char __attribute__ ((aligned(4))) priorname[11][16]; unsigned char __attribute__ ((aligned(4))) Filter_Preset_atr[21][4]; // На какие выходы влияет кнопка ресет unsigned char __attribute__ ((aligned(4))) Rezerv[4096-0xFE4]; //Остаток заполняем для выравнивания по длине страницы 4096 }inRAM3 ; // ******************************************************************************************************************* |
![]() |
![]() |
![]() |
#15 | |
Senior Member
Регистрация: 09.11.2012
Адрес: SPB
Возраст: 52
Сообщений: 2,404
Вес репутации: 1047/64 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Цитата:
у вас что на каждый байт идёт сразу POST(GET) ? у вас что - динамическая система, что вы настройки одним массивом передать не можете? веб программеров пинайте, чтобы они вам массив передавали.... да и получали - тоже... пакет IP-шный может более 1000 байт слать.... если на сетку- пофиг, то можно динамический обмен массивами сделать с бешеной скоростью... ![]() |
|
![]() |
![]() |
![]() |
#16 | |
Senior Member
|
![]() Цитата:
1. Учитесь выводить на ВЕБ динамические переменные. Для этого есть в стеке вывод через HTTPPrin_(имя переменной). 2. Осваиваиваете сохранение переменных в памяти и отображение их на веб посредством П1. 3. Осваиваете ввод данных используя методы GET POST. После этого вы будете уметь выводить на ВЕБ и принимать данные с ВЕБ 4. Пишите логику работы вашего устройства. При создании любого устройства с ВЕБ управлением проходим через эти 4 простых шага. Но самый важный это 0 шаг , на котором составляется ТЗ, описывается какие настройки должен иметь девайс и логика его работы. А последующие шаги даются достаточно легко. Последний раз редактировалось smart_pic; 09.01.2021 в 15:47. Причина: заметил , что перед этим было 1111 сообщение |
|
![]() |
![]() |
![]() |
#17 | |
Senior Member
|
![]() Цитата:
Конечно динамическая система. Внутренняя логика также может двигать фейдеры. Все это отображается на веб в реальном времени. Выгрузка в (загрузка из ) файл(а) настроек конечно передается одним массивом POSTзапросом MD5. Поэтому и переменные в структуре, что бы все правильно после загрузки улеглось. Последний раз редактировалось smart_pic; 09.01.2021 в 18:40. Причина: добавил скан интерфейса |
|
![]() |
![]() |
![]() |
#18 |
Senior Member
Регистрация: 09.11.2012
Адрес: SPB
Возраст: 52
Сообщений: 2,404
Вес репутации: 1047/64 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() |
![]() |
![]() |
![]() |
#19 |
Senior Member
Регистрация: 09.11.2012
Адрес: SPB
Возраст: 52
Сообщений: 2,404
Вес репутации: 1047/64 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
когда научитесь передавать пакеты UDP, и будет затык с приёмом- вышлю рабочий тестовый кусок...
я так честного приёма через UDP сокет и не добился.... плюнул, и сделал приём через МАС... ![]() принимает все пакеты, потрошит, а потом по признаку- UDP и нужный порт- можно с полученными данными работать |
![]() |
![]() |
![]() |
#20 |
Senior Member
|
![]() |
![]() |
![]() |
![]() |
#21 |
Senior Member
Регистрация: 09.11.2012
Адрес: SPB
Возраст: 52
Сообщений: 2,404
Вес репутации: 1047/64 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
ну...и..?
для того чтобы не было заметно отклика- достаточно 20мс для эзернета- это вообще - ниочём.... шлите весь буфер раз в 20мс... и получайте... а веб дезайнеры пускай крысоту наводят... хуман интерфейс не подразумевает высоких скоростей... |
![]() |
![]() |
![]() |
#22 | |
Super Moderator
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 7,086
Вес репутации: 6158/182 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Цитата:
очень правильно написали про "0-й шаг", в смысле зачем это всё нужно. Если тупо заменить ком порт (выстрелил и забыл) - то да, UDP пакет наше всё... Если же планируется отдавать устройство на растерзание и в публичную сеть, да с настройками через веб морду и без индикатора - то сложно становится всё, вообще не в формате вопроса-ответа одной темы (этой) конференции... несомненным достоинством микрочиповского стека является интеграция файловой системы, но она же станет непреодолимой преградой при копании вглубь. был тут сильный совет от гуру - забить на микрочип и попробовать что-то полегче, тот же визнет. |
|
![]() |
![]() |
![]() |
#23 |
Senior Member
Регистрация: 09.11.2012
Адрес: SPB
Возраст: 52
Сообщений: 2,404
Вес репутации: 1047/64 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
иногда это нужно для общего понимания проблемы...
нормальному технарю- всё нужно в руках подержать... я, в своё время, пытался MFC изучить(понять)... не пошло... а вот QT- легко влетело... и тут так же- изучение с перспективой -применения.. или- нуегонах... ![]() |
![]() |
![]() |
![]() |
#24 | |
Senior Member
|
![]() Цитата:
для этого нужно подкорректировать несколько функций MPFS: MPFS_HANDLE MPFSOpen(BYTE* cFile) BOOL MPFSGetFilenameID(WORD hFatID, BYTE* cName) BOOL LoadFATRecord(WORD fatID) количество файлов на диске известно , оно находится по определенному адресу, который легко вычисляется. Если не нашли файл в основной файловой системе , которая находится в программной памяти пика, начинаем искать в нашей системе. А дальше все работает по номеру файла. если номер файла больше кроичества файлов , хранящихся в памяти пика - работаем с дополнительной файловой системой. Файловая система оперирует с номером файла, начальным адресом где хранятся данные для нашего файла, длиной файла , именем файла , флагами которые определяют с какими признаками отдавать файл по HTTP. По номеру файла можно извлечь всю остальную инфу. Фактически , при открытии файла , мы ищем номер этого файла , а потом по номеру файла делаем все остальное. Вот все . Нет сложностей в файловой системе. Можно интегрировать любую удобную файловую систему. Я выбрал свою , которая работает быстро и не затратная по ресурсам. |
|
![]() |
![]() |
![]() |
#25 | |
Senior Member
Регистрация: 09.11.2012
Адрес: SPB
Возраст: 52
Сообщений: 2,404
Вес репутации: 1047/64 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
это вы, господа, уже глубоко копать начали...
![]() я так понял, что топикастер пока вообще из стека ничего запустить не может... кстати Цитата:
Последний раз редактировалось SergP01; 10.01.2021 в 14:00. |
|
![]() |
![]() |
![]() |
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
Опции темы | |
Опции просмотра | |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
PIC32 Ethernet Starter Kit | Серый К | Продукция MICROCHIP | 6 | 26.07.2013 17:49 |
PIC32 Ethernet Starter Kit - как не убить? | slavik01 | Продукция MICROCHIP | 3 | 10.11.2010 21:31 |
PIC32 Ethernet Starter Kit | gazpr1bor | Продукция MICROCHIP | 1 | 01.09.2010 15:24 |