Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить

Re: W5500_client+Atmega8_для самых начинающих.

Ср авг 25, 2021 12:05:55

Роман здравствуйте!!!!
В Ваших сообщениях встретил вот это:
https://radiokot.ru/forum/download/file.php?id=368615
Вы не подскажете в чем и на каком языке была создана эта форма.
И еще задумался о сопряжении мк и компьютера через com_port(RS232-RS485).
У Вас есть какие нибудь предпочтения в языке для работы с COM и построении мнемосхем?
Цель в будущем создание примитивной scada (отправка команд и прием минимального кол-ва данных с мк).
Заранее благодарен.
И еще раз спасибо за прошлые уроки.

Re: W5500_client+Atmega8_для самых начинающих.

Ср авг 25, 2021 15:42:49

kondeg писал(а):задумался о сопряжении мк и компьютера через com_port(RS232-RS485).

В теме Радиоуправления
https://www.radiokot.ru/forum/viewtopic ... 8&t=148087
когда мы делали разные радиоуправляемые модели
https://www.youtube.com/watch?v=qWojRM-tjP0
https://www.youtube.com/watch?v=cQme_y4TORw
https://www.youtube.com/watch?v=VvzbTWOdV3g
https://www.radiokot.ru/forum/download/ ... ?id=313952
https://www.radiokot.ru/forum/download/ ... ?id=313959
https://www.radiokot.ru/forum/download/ ... ?id=349813
https://www.radiokot.ru/forum/download/ ... ?id=349812
https://www.radiokot.ru/forum/download/ ... ?id=314856
https://www.radiokot.ru/forum/download/ ... ?id=352619
... и т.д.
мы уже сопрягали мк и компьютер через UART-TTL переходник.
UART.jpg
(193.78 KiB) Скачиваний: 113

kondeg писал(а):есть какие нибудь предпочтения в языке для работы с COM и построении мнемосхем?

Больше с COM я не работаю. На смену COM пришёл Ethernet.))

И со SCADA тоже игрались)) И со всякими CODESYS для ПЛК тоже игрались))
Больше со SCADA я не работаю. На смену SCADA пришли виртуальные машины. Например Java.))
kondeg писал(а):в чем и на каком языке была создана эта форма.

Эта форма
Java.jpg
(105.89 KiB) Скачиваний: 130

была создана на языке программирования Java.
:tea:
еще задумался о сопряжении мк и компьютера через com_port(RS232-RS485).

Вообще сопряжение мк и компьютера мы уже обсуждали много раз. И в разных темах.)) Что проще и дешевле... ))
https://radiokot.ru/forum/download/file.php?id=368390
https://radiokot.ru/forum/download/file.php?id=368391
... и т.д.
:tea:

Почему Ethernet вместо com_port(RS232-RS485) ? Потому что Ethernet более универсальный))
https://www.radiokot.ru/forum/download/ ... ?id=354544
https://www.radiokot.ru/forum/download/ ... ?id=354546
https://www.radiokot.ru/forum/download/ ... ?id=354415
https://www.radiokot.ru/forum/download/ ... ?id=354238
https://www.radiokot.ru/forum/download/ ... ?id=354298
https://www.radiokot.ru/forum/download/ ... ?id=354486
https://www.radiokot.ru/forum/download/ ... ?id=354489
... и т.д.

Почему Java вместо CODESYS ? Потому что Java более универсальна))
.NET Framework... Java... Python... Это всё виртуальные машины.
https://www.radiokot.ru/forum/download/ ... ?id=354495
Всё работает одинаково))
https://www.radiokot.ru/forum/download/ ... ?id=356068
... и т.д.
Любые протоколы...
https://www.radiokot.ru/forum/download/ ... ?id=354510
https://www.radiokot.ru/forum/download/ ... ?id=354511

Java Сервер HTTP.
https://www.radiokot.ru/forum/download/ ... ?id=353593
https://www.radiokot.ru/forum/download/ ... ?id=353594
... и т.д.
Устарело.)) Больше не использую.

Сейчас юзаю Java Сервер UDP.
Загрузка... (можно с флешки)
https://www.radiokot.ru/forum/download/ ... ?id=352518
https://www.radiokot.ru/forum/download/ ... ?id=359890
Диагностика...
https://www.radiokot.ru/forum/download/ ... ?id=352515
https://www.radiokot.ru/forum/download/ ... ?id=352516
https://www.radiokot.ru/forum/download/ ... ?id=352517
Система Умный Дом... (вместо SCADA)
https://www.radiokot.ru/forum/download/ ... ?id=352676
Файлообменник... (вместо BitTorrent)
https://www.radiokot.ru/forum/download/ ... ?id=352520
Аудио... (вместо плеера)
https://www.radiokot.ru/forum/download/ ... ?id=353596
https://www.radiokot.ru/forum/download/ ... ?id=358031
https://www.radiokot.ru/forum/download/ ... ?id=352521
Фото... (вместо фотошопа)
https://www.radiokot.ru/forum/download/ ... ?id=356114
Скриншот...
https://www.radiokot.ru/forum/download/ ... ?id=358027
Видео... (вместо Skype)
https://www.radiokot.ru/forum/download/ ... ?id=358030
Robot... (вместо TeamViewer, Radmin)
... и т.д.
:tea:

Re: W5500_client+Atmega8_для самых начинающих.

Чт авг 26, 2021 10:24:51

Рома спасибо Вам огромное !!!!

Добавлено after 2 hours 33 minutes 48 seconds:
Java Сервер HTTP.
https://www.radiokot.ru/forum/download/ ... ?id=353593
https://www.radiokot.ru/forum/download/ ... ?id=353594
... и т.д.
Устарело.)) Больше не использую.

Рома а в чем различие между Java Сервер HTTP и Java Сервер UDP (это разные программы)?
Читал, что UDP используется когда не критична целостность отправленных на сервер данных (видеонаблюдение к примеру).
И как организована посылка данных по UDP через W5500 ?

Добавлено after 31 minute 14 seconds:
И еще читал, что для UDP нет необходимости в "рукопожатии" с сервером для передачи данных (что увеличивает скорость работы приложения). Похожа ли отправка данных через адресную строку браузера, как в моем случае " test/data.php?a=10&b=20 " на отправку по UDP (отправляем без установления соединения с сервером) ?

Re: W5500_client+Atmega8_для самых начинающих.

Чт авг 26, 2021 15:32:40

kondeg писал(а):в чем различие между Java Сервер HTTP и Java Сервер UDP (это разные программы)?

Разница только в библиотеках.
Все виртуальные машины (.NET Framework... Java... Python... и т.д.) работают через библиотеки.
Точно так же как Ардуино))
kondeg писал(а):Читал, что UDP используется когда не критична целостность отправленных на сервер данных (видеонаблюдение к примеру).

Не правда.
Оба протокола (TCP и UDP) надёжные. Просто они работают по разному))
1- протокол TCP сам контролирует передачу данных.
2- протокол UDP не контролирует передачу данных. Это делается программно.

Например Torrent работает по UDP.
А целостность данных Torrent контролирует программно.
Torrent.jpg
(144.85 KiB) Скачиваний: 113

Вы хотите сказать что у Torrent не критична целостность данных ?)) :)))
kondeg писал(а):как организована посылка данных по UDP через W5500 ?

Точно так же как по TCP. Только проще))
kondeg писал(а):для UDP нет необходимости в "рукопожатии" с сервером для передачи данных

В UDP нет такого понятия "рукопожатия"))
kondeg писал(а):для UDP нет необходимости в "рукопожатии" с сервером для передачи данных (что увеличивает скорость работы приложения).

Да. UDP работает быстрей. И Google об этом знает)) Поэтому ещё в далёком 2012 году Google разработал протокол QUIC.
https://ru.wikipedia.org/wiki/QUIC
И даже выпустила браузеры с поддержкой этого протокола.
Но проблема в том, что основная масса Серверов в Интернете не поддерживают этот протокол... :(
Подробнее - https://habr.com/ru/post/322690/
... и т.д.
:tea:
Похожа ли отправка данных через адресную строку браузера, как в моем случае " test/data.php?a=10&b=20 " на отправку по UDP (отправляем без установления соединения с сервером) ?

Нет. Обычные браузеры работают по TCP. Потому что Сервера в Интернете работают по TCP. Хотя самому браузеру без разницы по какому протоколу работать TCP или UDP. ))
:tea:

Протокол TCP работает просто.
1- браузер отправляет данные на сервер.
2- сервер отправляет пакет подтверждения получения данных - ACK.
(ACK - это сокращённо от "квитирование").
TCP.jpg
(115.13 KiB) Скачиваний: 105

Так обеспечивается целостность отправленных на сервер данных.

Причём сервер может после каждого принятого пакета от браузера отправлять пакет подтверждения получения данных - ACK.
А может после нескольких принятых пакетов от браузера отправлять один пакет подтверждения получения данных - ACK.
TCP ACK.jpg
(129.23 KiB) Скачиваний: 109

И наоборот.
1- если сервер отправляет данные браузеру.
2- то тогда браузер отправляет пакет подтверждения получения данных - ACK.

Если по какой-то причине ACK не получен, то отправка данных повторяется.

Вот например по какой-то причине сервер не получил от браузера пакет ACK.
Поэтому сервер отправил данные браузеру повторно.
повтор передачи.jpg
(110.1 KiB) Скачиваний: 111

Ещё...
Если ни сервер ни браузер не передают никаких данных, то сервер (или браузер) отправляет пакет удержания соединения (или проверки соединения на предмет актуальности соединения) по тайм-ауту.
удерживает соединение.jpg
(94.66 KiB) Скачиваний: 116

Если браузер (или сервер) не ответит, то соединение считается разорванным по тайм-ауту.
... и т.д.
Короче TCP работает просто))

В W5500 это всё делается автоматически (на аппаратном уровне).
:tea:

Протокол UDP работает ещё проще.
В UDP нет никаких "рукопожатий" и ACK.
Но никто не запрещает сделать ACK программно)).
Я так и сделал.
UDP с ACK.jpg
(121.11 KiB) Скачиваний: 124

Мой Java Сервер работает по протоколу UDP.
После отправки пакета данных мой Java Сервер ждёт подтверждения доставки пакета - ACK.
ACK.jpg
(140.02 KiB) Скачиваний: 109

Если ACK не получен, то срабатывает тайм-аут и мой Java Сервер выдаёт ошибку типа "нет ACK" и автоматом повторяет передачу.
ACK_cr.jpg
(15.11 KiB) Скачиваний: 108

И так несколько раз (задаётся программно).
Если и на третий раз ACK не получен, то срабатывает тайм-аут и мой Java Сервер выдаёт ошибку типа "нет связи с устройством".

Таким образом мы имеем гарантированную доставку пакетов.
И работает UDP даже лучше чем TCP. Потому что мой Java Сервер и все устройства не тратят время на "рукопожатия" и т.д.
Поэтому всё работает максимально быстро (насколько это возможно).
:tea:

А ещё UDP безопасней TCP.
Потому что мой Java Сервер не устанавливает никаких соединений типа "рукопожатия".
Поэтому мой Java Сервер не виден в сети. Никакие хакеры и интернет-боты не могут определить мой Java Сервер в сети или нет ))
И никакие Яндексы... Google... со своими интернет-ботами... больше не сканируют мой сервер на предмет вредоносных программ... как это было раньше... когда мой Java Сервер работал по TCP))

С помощью технологии Safe Browsing Яндекс, Google и т.д. ежедневно проверяет миллионы URL и обнаруживает тысячи небезопасных веб-ресурсов...
https://en.wikipedia.org/wiki/Google_Safe_Browsing
))
:tea:

Re: W5500_client+Atmega8_для самых начинающих.

Пт авг 27, 2021 02:12:37

Рома. Пожалуйста, подскажите как W5500 перевести в режим UDP и отправить данные на сервер.
Хотя бы схематично.
Я уже , наверное, утомил Вас своими просьбами....

Re: W5500_client+Atmega8_для самых начинающих.

Пт авг 27, 2021 20:05:47

Сетевые технологии - это интересные технологии)) они меня не утомляют))
Отправить данные на сервер по UDP можно только если сервер поддерживает UDP.
Перевести W5500 на UDP не проблема))
Я открываю два сокета чтобы W5500 мог работать одновременно и по TCP и по UDP.
Вот так.
Screenshot_1.jpg
(78.95 KiB) Скачиваний: 170

А дальше пишем...

Объявляем переменные и массивы для UDP.
////////////////////////////
// FIFO_Ethernet UDP // IP | порт | len | Data.
// IP - 0x00 0x00 0x00 0x00
// порт - 0x00 0x00
// len - 0x00 0x00(len=Data).
//////////////////////////// IP - клиент
unsigned char IP_RX[4]={192,168,0,101}; //начальное -192.168.0.101
//////////////////////////// порт - клиент
unsigned char port_RX[2]={0,0};
//////////////////////////// len - клиент
unsigned char len_RX[2]={0,0};
//////////////////////////// TX_int
unsigned char TX_int[32]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
//////////////////////////// RX_int
unsigned char RX_int[32]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};


Общая настройка W5500 для TCP и UDP.
///////////////////////////////////////////////////////////////// инициализация W5500:
/**/
// 00000000 - Address (автоматическая инкрементная адресация +1).
// 00000000 - Address (автоматическая инкрементная адресация +1).
///////////////////////////////////////////////
// Control Registers:
// 0000 0... - BSB [4:0] блок
// .... .0.. - R/W - 0 чтение/1 запись
// .... ..00 - OP Mode (VDM)- данные переменной длины (Длина данных контролируется SS).
/////////////////////////////////////////////// RESET W5500:
PORTB.6=0; //
delay_ms(100); //
PORTB.6=1; //
delay_ms(100); //
/////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////// W5500 PHY:
// перед настройкой PHY сделать программный Cброс PHY:
PORTB.2=0; // SS W5500
tx=0x00; SPI(); tx=0x2E; SPI(); tx=0x04; SPI(); // Address + Control Registers
tx=0x00; SPI(); // Data -0x00
tx=0x00; SPI(); // Data -0x00
PORTB.2=1; // SS W5500
// пишем режим PHY:
// 1... .... RST - 1.
// .1.. .... программная настройка режима - 1
// ..0. .... 10BT Full-duplex, Auto-negotiation disabled / Power Down mode
// ...0 .... 10BT Full-duplex, Auto-negotiation disabled / Power Down mode
// .... 1... 10BT Full-duplex, Auto-negotiation disabled / Power Down mode
// .... .1.. Duplex Status
// .... ..0. Speed Status
// .... ...1 Link Status
PORTB.2=0; // SS W5500
tx=0x00; SPI(); tx=0x2E; SPI(); tx=0x04; SPI(); // Address + Control Registers
tx=0xC8; SPI(); // Data -0xC8 (10 Мбит/с, Full-duplex)
tx=0x00; SPI(); // Data -0x00
PORTB.2=1; // SS W5500
/////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////// настройка W5500:
PORTB.2=0; // SS W5500
tx=0x00; SPI(); tx=0x01; SPI(); tx=0x04; SPI(); // Address + Control Registers
// -шлюз
tx=192; SPI(); // Gateway Address (GAR0) (0x0001 - Address)
tx=168; SPI(); // Gateway Address (GAR1) (0x0002 - Address)
tx=0; SPI(); // Gateway Address (GAR2) (0x0003 - Address)
tx=1; SPI(); // Gateway Address (GAR3) (0x0004 - Address)
// -маска
tx=255; SPI(); // Subnet Mask Address (SUBR0) (0x0005 - Address)
tx=255; SPI(); // Subnet Mask Address (SUBR1) (0x0006 - Address)
tx=255; SPI(); // Subnet Mask Address (SUBR2) (0x0007 - Address)
tx=0; SPI(); // Subnet Mask Address (SUBR3) (0x0008 - Address)
// -MAC (Wiznet_01:02:03)
tx=0x00; SPI(); // Source Hardware Address (SHAR0) (0x0009 - Address)
tx=0x08; SPI(); // Source Hardware Address (SHAR1) (0x000A - Address)
tx=0xDC; SPI(); // Source Hardware Address (SHAR2) (0x000B - Address)
tx=0x01; SPI(); // Source Hardware Address (SHAR3) (0x000C - Address)
tx=0x02; SPI(); // Source Hardware Address (SHAR4) (0x000D - Address)
tx=0x03; SPI(); // Source Hardware Address (SHAR5) (0x000E - Address)
// -IP
tx=192; SPI(); // Source IP Address (SIPR0) (0x000F - Address)
tx=168; SPI(); // Source IP Address (SIPR1) (0x0010 - Address)
tx=0; SPI(); // Source IP Address (SIPR2) (0x0011 - Address)
tx=3; SPI(); // Source IP Address (SIPR3) (0x0012 - Address)
PORTB.2=1; // SS W5500


Для UDP:
/////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////// Socket_1 - UDP:
// Протокол: пишем протокол UDP Socket_1:
PORTB.2=0; // SS W5500
tx=0x00; SPI(); tx=0x00; SPI(); tx=0x2C; SPI(); // Address Registers + Control Registers
tx=0x02; SPI(); // Data 0x02 -protocol UDP.
PORTB.2=1; // SS W5500
// Порт: пишем Port Source Socket_1:
PORTB.2=0; // SS W5500
tx=0x00; SPI(); tx=0x04; SPI(); tx=0x2C; SPI(); // Address Registers + Control Registers
tx=0x1F; SPI(); // Data -0x1F (порт 8000)
tx=0x40; SPI(); // Data -0x40 (порт 8000)
PORTB.2=1; // SS W5500
// пишем команду OPEN Socket_1:
PORTB.2=0; // SS W5500
tx=0x00; SPI(); tx=0x01; SPI(); tx=0x2C; SPI(); // Address Registers + Control Registers
tx=0x01; SPI(); // Data -0x01 (команда OPEN)
PORTB.2=1; // SS W5500


Тут добавим прерывание на вывод INT модуля W5500 по приёму пакета UDP. Для ускорения работы))
В исходном состоянии вывод INT в высоком состоянии (лог 1).
Когда W5500 примет пакет по UDP то вывод INT перейдёт в низкое состояние (лог 0).
/////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////// Socket_1 - INT:
// INT Mask Socket_1: пишем INT Mask Socket_1: (SIMR) 0x0018
PORTB.2=0; // SS W5500
tx=0x00; SPI(); tx=0x18; SPI(); tx=0x04; SPI(); // Address + Control Registers
tx=0x02; SPI(); // Data 0x02 -Enable INT Socket_1 .
PORTB.2=1; // SS W5500
// INT Mask Socket_1 RECV: пишем INT Mask завершение приёма Socket_1: (Sn_IMR) 0x002C
PORTB.2=0; // SS W5500
tx=0x00; SPI(); tx=0x2C; SPI(); tx=0x2C; SPI(); // Address Registers + Control Registers
tx=0x04; SPI(); // Data 0x04 -INT Mask завершение приёма.
PORTB.2=1; // SS W5500
/////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////



_1: // основной цикл программы
/////////////////////////////////////////////////////////////////////////////////////////////
... // лампочки
... // датчики
... // реле
... // и т.д.
// В основном цикле программы проверяем вывод INT.
// проверка INT:
if (PINB.7 == 1) {goto _1;}; // FIFO_Ethernet пуст > _1
/////////////////////////////////////////////////////////////////////////////////////////////



// вывод INT в низком состоянии (лог 0): пишем сброс флаг завершение приёма INT Socket_1: (Sn_IR) 0x0002
PORTB.2=0; // SS W5500
tx=0x00; SPI(); tx=0x02; SPI(); tx=0x2C; SPI(); // Address Registers + Control Registers
tx=0x04; SPI(); // Data 0x04 -сброс флаг завершение приёма.
PORTB.2=1; // SS W5500
// после сброса флага вывод INT переходит в высокое состояние (лог 1).


// читаем размер принятых данных Socket_1 Sn_RX_RSR:
PORTB.2=0; // SS W5500
tx=0x00; SPI(); tx=0x26; SPI(); tx=0x28; SPI(); // Address + Control Registers
tx=0x00; SPI(); x1 = rx; // Data -Sn_RX_RSR0 -размер принятых данных //сарший регистр
tx=0x00; SPI(); x2 = rx; // Data -Sn_RX_RSR1 -размер принятых данных //младший регистр
PORTB.2=1; // SS W5500

// На всякий случай проверяем что приёмный буфер не пустой.
len=x1; len=(len<<8)|x2; // размер принятых данных // 0x0000...0xFFFF
if (len == 0x00) {
//////////////////////////////////////////////
goto _1; //FIFO_Ethernet пуст > _1
};

/////////////////////////////////////////////////////////////////////////////////////////////
// Читаем начальный адрес принятых данных Socket_1 Sn_RX_RD
PORTB.2=0; // SS W5500
tx=0x00; SPI(); tx=0x28; SPI(); tx=0x28; SPI(); // Address
tx=0x00; SPI(); x1 = rx; // Data -Sn_RX_RD0 -начальный адрес принятых данных //сарший регистр
tx=0x00; SPI(); x2 = rx; // Data -Sn_RX_RD1 -начальный адрес принятых данных //младший регистр
PORTB.2=1; // SS W5500
add=x1; add=(add<<8)|x2; // начальный адрес принятых данных // 0x0000...0xFFFF
////////////////////////////////////////////////////////////////////////////////////////////
// Читаем данные с начального адреса буфера Socket_1 RX Buffer:
x1 = (add>>8);
x2 = add;
PORTB.2=0; // SS W5500
tx=x1; SPI(); tx=x2; SPI(); tx=0x38; SPI(); // Address + Control Registers

////////////////////////////
// FIFO_Ethernet UDP // IP | порт | len | Data.
// IP - 0x00 0x00 0x00 0x00
// порт - 0x00 0x00
// len - 0x00 0x00(len=Data).
//////////////////////////// IP - клиент
//unsigned char IP_RX[4]={192,168,0,101}; //начальное -192.168.0.101
//////////////////////////// порт - клиент
//unsigned char port_RX[2]={0,0};
//////////////////////////// len - клиент
//unsigned char len_RX[2]={0,0};
//////////////////////////// TX_int
//unsigned char TX_int[32]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
//////////////////////////// RX_int
//unsigned char RX_int[32]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

for (x=0; x<4; x++) {
tx=0; SPI(); IP_RX[x]=rx; // IP_RX - клиент 0x00 0x00 0x00 0x00
};

for (x=0; x<2; x++) {
tx=0x00; SPI(); port_RX[x]=rx; // порт_RX - клиент 0x00 0x00
};

for (x=0; x<2; x++) {
tx=0x00; SPI(); len_RX[x]=rx; // len_RX - клиент 0x00 0x00
};

for (x=0; x<32; x++) {
tx=0x00; SPI(); RX_int[x]=rx; // RX_int - 32
};

PORTB.2=1; // SS W5500
////////////////////////////////////////////////////////////////////////////////////////////
// Пишем регистр указателя Sn_RX_RD до увеличенного значения:
add = add + len; //add - начальный/конечный адрес принятых данных // 0x0000...0xFFFF
//len - размер полученных данных // 0x0000...0xFFFF
x1 = (add>>8);
x2 = add;
PORTB.2=0; // SS W5500
tx=0x00; SPI(); tx=0x28; SPI(); tx=0x2C; SPI(); // Address + Control Registers
tx=x1; SPI(); // Data -Sn_RX_RD0 -конечный адрес принятых данных //сарший регистр
tx=x2; SPI(); // Data -Sn_RX_RD1 -конечный адрес принятых данных //младший регистр
PORTB.2=1; // SS W5500
////////////////////////////////////////////////////////////////////////////////////////////
// Пишем команду завершения приема RECV:
PORTB.2=0; // SS W5500
tx=0x00; SPI(); tx=0x01; SPI(); tx=0x2C; SPI(); // Address + Control Registers
tx=0x40; SPI(); // Data -0x40 (команда RECV)
PORTB.2=1; // SS W5500
////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////
// приём UDP закончен.




// передача UDP:
////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////

// пишем MAC, IP, порт > Destination
////////////////////////////// Socket_1 + Register Block 1: (0000 1... BSB[4:0]блок)
PORTB.2=0; // SS W5500

// (для команды SEND без автоматического ARP-запроса)
//tx=0x00; SPI(); tx=0x06; SPI(); tx=0x2C; SPI(); // MAC, IP, порт
// (для команды SEND c автоматическим ARP-запросом): -8 ARP
tx=0x00; SPI(); tx=0x0C; SPI(); tx=0x2C; SPI(); //(MAC = ARP), IP, порт

// MAC адрес: > Destination
//tx=0xFF; SPI(); // Data // Destination Hardware Address (Sn_DHAR0)(0x0006 - Address)
//tx=0xFF; SPI(); // Data // Destination Hardware Address (Sn_DHAR1)(0x0007 - Address)
//tx=0xFF; SPI(); // Data // Destination Hardware Address (Sn_DHAR2)(0x0008 - Address)
//tx=0xFF; SPI(); // Data // Destination Hardware Address (Sn_DHAR3)(0x0009 - Address)
//tx=0xFF; SPI(); // Data // Destination Hardware Address (Sn_DHAR4)(0x000A - Address)
//tx=0xFF; SPI(); // Data // Destination Hardware Address (Sn_DHAR5)(0x000B - Address)

//IP адрес : > Destination
tx=192; SPI(); // Data // Destination IP Address (Sn_DIPR0)(0x000C - Address)
tx=168; SPI(); // Data // Destination IP Address (Sn_DIPR1)(0x000D - Address)
tx=0; SPI(); // Data // Destination IP Address (Sn_DIPR2)(0x000E - Address)
tx=1; SPI(); // Data // Destination IP Address (Sn_DIPR3)(0x000F - Address)

// порт: > Destination
tx=0x1F; SPI(); // Data // Destination Port (Sn_DPORT0) (0x0010 - Address) -порт 8000
tx=0x40; SPI(); // Data // Destination Port (Sn_DPORT1) (0x0011 - Address) -порт 8000

PORTB.2=1; // SS W5500
/////////////////////////////////////////////////////////////////////////////////////////////
// Читаем начальный адрес для записи данных Socket 1 Sn_TX_WR:
PORTB.2=0; // SS W5500
tx=0x00; SPI(); tx=0x24; SPI(); tx=0x28; SPI(); // Address + Control Registers
tx=0x00; SPI(); x1 = rx; // Data -Sn_TX_WR0 -начальный адрес для записи данных //сарший регистр
tx=0x00; SPI(); x2 = rx; // Data -Sn_TX_WR1 -начальный адрес для записи данных //младший регистр
PORTB.2=1; // SS W5500
add=x1; add = (add<<8)|x2; // начальный адрес для записи данных // 0x0000...0xFFFF
/////////////////////////////////////////////////////////////////////////////////////////////
//Пишем данные с начального адреса буфера Socket 1 TX Buffer:
x1 = (add>>8);
x2 = add;

PORTB.2=0; // SS W5500
tx=x1; SPI(); tx=x2; SPI(); tx=0x34; SPI(); // Address + Control Registers
///////////////////////////////////////////////
len = 0; // сброс len

/////////////////////////////////////////////// TX_int > W5500
for (x=0; x<32 ; x++) {
tx=TX_int[x]; SPI(); len++;
};

PORTB.2=1; // SS W5500
/////////////////////////////////////////////////////////////////////////////////////////////
// Пишем регистр указателя Socket 1 Sn_TX_WR до увеличенного значения:
add = add + len;
x1 = (add>>8);
x2 = add;
PORTB.2=0; // SS W5500
tx=0x00; SPI(); tx=0x24; SPI(); tx=0x2C; SPI(); // Address + Control Registers
tx=x1; SPI(); // Data -Sn_TX_WR0 -конечный адрес передачи данных //сарший регистр
tx=x2; SPI(); // Data -Sn_TX_WR1 -конечный адрес передачи данных //младший регистр
PORTB.2=1; // SS W5500
/////////////////////////////////////////////////////////////////////////////////////////////
//Пишем команду передачи SEND Socket 1 Command:
PORTB.2=0; // SS W5500
tx=0x00; SPI(); tx=0x01; SPI(); tx=0x2C; SPI(); // Address + Control Registers
tx=0x20; SPI(); // Data -0x20 (команда SEND c автоматическим ARP-запросом)
//tx=0x21; SPI();// Data -0x21 (команда SEND без автоматического ARP-запроса)
PORTB.2=1; // SS W5500
/////////////////////////////////////////////////////////////////////////////////////////////
//If (Sn_CR == 0x00) по окончанию передачи статус меняется на Sn_CR = 0x00

////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////
// передача UDP закончена.

goto _1; // > основной цикл программы

Всё))

Как видим в UDP нет никаких "рукопожатий" и всяких SYN и FIN и прочей фигни))
:)

P.S.
А если вывод INT модуля W5500 подключить к выводу INT мк, то будет работать ещё быстрей))
А если мк перевести в режим SLEEP то модуль W5500 будет будить мк по приёму пакета UDP.
И т.д. и т.п.
:tea:

А нулевой сокет настроем в режим MACRAW.
Это самый интересный режим))
Screenshot_1.jpg
(81.26 KiB) Скачиваний: 127

В режиме MACRAW модуль W5500 работает так же как модуль ENC28J60 для Ардуино. ))
Т.е. все протоколы Ethernet пишем сами))
:tea:

А дальше пишем...

Объявляем переменные и массивы для MACRAW.
////////////////////////////
// FIFO_Ethernet MACRAW // len | Data
// len - 0x00 0x00(len=len+Data).
//////////////////////////// TX_int
unsigned char TX_int[32]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
//////////////////////////// RX_int
unsigned char RX_int[32]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};


Общая настройка W5500 для TCP и UDP и MACRAW.
///////////////////////////////////////////////////////////////// инициализация W5500:
/**/
// 00000000 - Address (автоматическая инкрементная адресация +1).
// 00000000 - Address (автоматическая инкрементная адресация +1).
///////////////////////////////////////////////
// Control Registers:
// 0000 0... - BSB [4:0] блок
// .... .0.. - R/W - 0 чтение/1 запись
// .... ..00 - OP Mode (VDM)- данные переменной длины (Длина данных контролируется SS).
/////////////////////////////////////////////// RESET W5500:
PORTB.6=0; //
delay_ms(100); //
PORTB.6=1; //
delay_ms(100); //
/////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////// W5500 PHY:
// перед настройкой PHY сделать программный Cброс PHY:
PORTB.2=0; // SS W5500
tx=0x00; SPI(); tx=0x2E; SPI(); tx=0x04; SPI(); // Address + Control Registers
tx=0x00; SPI(); // Data -0x00
tx=0x00; SPI(); // Data -0x00
PORTB.2=1; // SS W5500
// пишем режим PHY:
// 1... .... RST - 1.
// .1.. .... программная настройка режима - 1
// ..0. .... 10BT Full-duplex, Auto-negotiation disabled / Power Down mode
// ...0 .... 10BT Full-duplex, Auto-negotiation disabled / Power Down mode
// .... 1... 10BT Full-duplex, Auto-negotiation disabled / Power Down mode
// .... .1.. Duplex Status
// .... ..0. Speed Status
// .... ...1 Link Status
PORTB.2=0; // SS W5500
tx=0x00; SPI(); tx=0x2E; SPI(); tx=0x04; SPI(); // Address + Control Registers
tx=0xC8; SPI(); // Data -0xC8 (10 Мбит/с, Full-duplex)
tx=0x00; SPI(); // Data -0x00
PORTB.2=1; // SS W5500



Для режима MACRAW шлюз, маска, MAC указывать не нужно.
Для режима TCP и UDP шлюз, маска, MAC указывать нужно.


Настройка W5500 для режима TCP и UDP:
/////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////// настройка W5500:
PORTB.2=0; // SS W5500
tx=0x00; SPI(); tx=0x01; SPI(); tx=0x04; SPI(); // Address + Control Registers
// -шлюз
tx=192; SPI(); // Gateway Address (GAR0) (0x0001 - Address)
tx=168; SPI(); // Gateway Address (GAR1) (0x0002 - Address)
tx=0; SPI(); // Gateway Address (GAR2) (0x0003 - Address)
tx=1; SPI(); // Gateway Address (GAR3) (0x0004 - Address)
// -маска
tx=255; SPI(); // Subnet Mask Address (SUBR0) (0x0005 - Address)
tx=255; SPI(); // Subnet Mask Address (SUBR1) (0x0006 - Address)
tx=255; SPI(); // Subnet Mask Address (SUBR2) (0x0007 - Address)
tx=0; SPI(); // Subnet Mask Address (SUBR3) (0x0008 - Address)
// -MAC (Wiznet_01:02:03)
tx=0x00; SPI(); // Source Hardware Address (SHAR0) (0x0009 - Address)
tx=0x08; SPI(); // Source Hardware Address (SHAR1) (0x000A - Address)
tx=0xDC; SPI(); // Source Hardware Address (SHAR2) (0x000B - Address)
tx=0x01; SPI(); // Source Hardware Address (SHAR3) (0x000C - Address)
tx=0x02; SPI(); // Source Hardware Address (SHAR4) (0x000D - Address)
tx=0x03; SPI(); // Source Hardware Address (SHAR5) (0x000E - Address)
// -IP
tx=192; SPI(); // Source IP Address (SIPR0) (0x000F - Address)
tx=168; SPI(); // Source IP Address (SIPR1) (0x0010 - Address)
tx=0; SPI(); // Source IP Address (SIPR2) (0x0011 - Address)
tx=3; SPI(); // Source IP Address (SIPR3) (0x0012 - Address)
PORTB.2=1; // SS W5500


Для MACRAW:
/////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////// Socket_0 - MACRAW:
// Протокол: пишем протокол MACRAW Socket_0:
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x00; SPI(); tx=0x0C; SPI(); // Address
tx=0x04; SPI(); // Data -0x04 // MACRAW // Socket_0
//tx=0xE4; SPI(); // Data -0xE4 // MACRAW // Socket_0
// 0xE4: - Блокирование широковещательной и многоадресной рассылки в режиме MACRAW:
// 1... .... - блокировка широковещательной и многоадресной рассылки в режиме MACRAW
// .1.. .... - блокировка broadcast в режиме MACRAW
// ..1. .... - блокировка multicast в режиме MACRAW
PORTB.6=1; // SS W5500
///////////////////////////////////////////////
// пишем команду OPEN Socket_0:
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x01; SPI(); tx=0x0C; SPI(); // Address
tx=0x01; SPI(); // Data -0x01 (команда OPEN)
PORTB.6=1; // SS W5500
///////////////////////////////////////////////



_1: // основной цикл программы
/////////////////////////////////////////////////////////////////////////////////////////////
... // лампочки
... // датчики
... // реле
... // и т.д.
// В основном цикле программы проверяем размер принятых данных MACRAW:
/////////////////////////////////////////////////////////////////////////////////////////////
// читаем размер принятых данных Socket_0 MACRAW:
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x26; SPI(); tx=0x08; SPI(); // Address
tx=0x00; SPI(); x1 = rx; // Data -Sn_RX_RSR0 -размер принятых данных //сарший регистр
tx=0x00; SPI(); x2 = rx; // Data -Sn_RX_RSR1 -размер принятых данных //младший регистр
PORTB.6=1; // SS W5500
len = x1; len = (len<<8)|x2; // len - размер принятых данных
x1 = (len>>8);
x2 = len;
/////////////////////////////////////////////////////////////////////////////////////////////
if (len == 0x00) {
goto _1; // FIFO RX пуст > goto _1;
};
/////////////////////////////////////////////////////////////////////////////////////////////



Приём MACRAW:
/////////////////////////////////////////////////////////////////////////////////////////////
// Читаем начальный адрес принятых данных Socket_0 Sn_RX_RD MACRAW
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x28; SPI(); tx=0x08; SPI(); // Address
tx=0x00; SPI(); x1 = rx; // Data -Sn_RX_RD0 -начальный адрес принятых данных //сарший регистр
tx=0x00; SPI(); x2 = rx; // Data -Sn_RX_RD1 -начальный адрес принятых данных //младший регистр
PORTB.6=1; // SS W5500
add=x1; add=(add<<8)|x2; // начальный адрес принятых данных // 0x0000...0xFFFF


////////////////////////////////////////////////////////////////////////////////////////////
// Читаем данные с начального адреса буфера Socket_0 RX Buffer MACRAW:
x1 = (add>>8);
x2 = add;
PORTB.6=0; // SS W5500
tx=x1; SPI(); tx=x2; SPI(); tx=0x18; SPI(); // Address = add
/////////////////////////////////////////
// FIFO_Ethernet MACRAW // len | Data
// len - 0x00 0x00(len=len+Data).
/////////////////////////////////////////
for (x=0; x<32; x++) {
tx=0; SPI(); RX_int[x] = rx; // W5500 > Data буфер
};
////////////////////////////////////////
PORTB.6=1; // SS W5500


////////////////////////////////////////////////////////////////////////////////////////////
// Пишем регистр указателя Sn_RX_RD MACRAW до увеличенного значения:
add = add + len; //add - начальный/конечный адрес принятых данных // 0x0000...0xFFFF
//len - размер полученных данных // 0x0000...0xFFFF
x1 = (add>>8);
x2 = add;
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x28; SPI(); tx=0x0C; SPI(); // Address
tx=x1; SPI(); // Data -Sn_RX_RD0 -конечный адрес принятых данных //сарший регистр
tx=x2; SPI(); // Data -Sn_RX_RD1 -конечный адрес принятых данных //младший регистр
PORTB.6=1; // SS W5500
////////////////////////////////////////////////////////////////////////////////////////////
// Пишем команду завершения приема RECV MACRAW:
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x01; SPI(); tx=0x0C; SPI(); // Address
tx=0x40; SPI(); // Data -0x40 (команда RECV)
PORTB.6=1; // SS W5500
/////////////////////////////////////////////////////////////////////////////////////////////
// приём MACRAW закончен.


// передача MACRAW:
/////////////////////////////////////////////////////////////////////////////////////////////
// Читаем начальный адрес для записи данных Socket_0 Sn_TX_WR MACRAW:
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x24; SPI(); tx=0x08; SPI(); // Address
tx=0x00; SPI(); x1 = rx; // Data -Sn_TX_WR0 -начальный адрес для записи данных //сарший регистр
tx=0x00; SPI(); x2 = rx; // Data -Sn_TX_WR1 -начальный адрес для записи данных //младший регистр
PORTB.6=1; // SS W5500
add=x1; add = (add<<8)|x2; // начальный адрес для записи данных // 0x0000...0xFFFF
/////////////////////////////////////////////////////////////////////////////////////////////
//Пишем данные с начального адреса буфера Socket 0 TX Buffer MACRAW:
x1 = (add>>8);
x2 = add;

PORTB.6=0; // SS W5500
tx=x1; SPI(); tx=x2; SPI(); tx=0x14; SPI(); // Address = add

len = 0; // сброс len

/////////////////////////////
for (x=0; x<32 ; x++) {
tx = TX_int[x]; SPI(); // MACRAW_TX > W5500
len++;
};
/////////////////////////////
PORTB.6=1; // SS W5500

/////////////////////////////////////////////////////////////////////////////////////////////
// Пишем регистр указателя Socket 0 Sn_TX_WR до увеличенного значения MACRAW:
add = add + len;
x1 = (add>>8);
x2 = add;
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x24; SPI(); tx=0x0C; SPI(); // Address
tx=x1; SPI(); // Data -Sn_TX_WR0 -конечный адрес передачи данных //сарший регистр
tx=x2; SPI(); // Data -Sn_TX_WR1 -конечный адрес передачи данных //младший регистр
PORTB.6=1; // SS W5500
/////////////////////////////////////////////////////////////////////////////////////////////
//Пишем команду передачи SEND Socket 0 Command MACRAW:
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x01; SPI(); tx=0x0C; SPI(); // Address
//tx=0x20; SPI(); // Data -0x20 (команда SEND c автоматическим ARP-запросом)
tx=0x21; SPI(); // Data -0x21 (команда SEND без автоматического ARP-запроса)
PORTB.6=1; // SS W5500
/////////////////////////////////////////////////////////////////////////////////////////////
//If (Sn_CR == 0x00) по окончанию передачи статус меняется на Sn_CR = 0x00

////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////
// передача MACRAW закончена.

Всё))

Как видим режим MACRAW работает ещё проще))
:tea:

Зачем нужен режим MACRAW ?
Как сказано в даташите "для протоколов которые не поддерживает W5500 на аппаратном уровне".
Например протоколы DHCP, ICMP, и т.д.
Если мы захотим например получить автоматически IP адрес от DHCP сервера, то для этого нам нужен режим MACRAW.
Хотя DHCP работает поверх UDP )) Но не важно))
Если мы захотим например получить IP адрес от DNS сервера, то для этого нам нужен режим MACRAW.
Хотя DNS работает поверх UDP )) Но не важно))

Если мы захотим например пропинговать како-то сервер (командой PING), то для этого нам нужен режим MACRAW.
Вот к примеру W5500 пингует Сервер Яндекса (IP - 87.250.250.242) в режиме MACRAW.
PING.jpg
(127.76 KiB) Скачиваний: 130

И т.д.
:tea:

P.S.
Если передающий буфер в режим MACRAW пуст, то W5500 будет передавать пустые пакеты Ethernet ))
MACRAW.jpg
(187 KiB) Скачиваний: 118

Т.е. все протоколы Ethernet надо писать самому.
Писать свои протоколы Ethernet - это очень увлекательное занятие))
:tea:

Re: W5500_client+Atmega8_для самых начинающих.

Пн авг 30, 2021 09:28:19

Рома Вы меня в очередной раз выручаете. Даже не знаю как Вас благодарить. Может быть и я полюблю сетевые технологии также как Вы.
Я думаю, что обязательно полюблю.
Все Ваши уроки проштудирую еще раз ( и не один раз), что бы было понимание. Дай Вам Бог здоровья и всех благ !!!!

Re: W5500_client+Atmega8_для самых начинающих.

Вт сен 14, 2021 07:32:02

Роман здравствуйте.
Что то я приуныл. После долгого поиска готового java_сервера (и вообще UDP_сервера) и не найдя его, почитал про язык Java. Но дойдя до классов, экземпляров класса и методов окончательно понял, что не имея академических знаний, предрасположенности и гибкости ума слишком много пройдет времени, прежде чем я что то начну понимать и тем более писать серверные программы. Как будто стена не преодолимая пере домной.
У меня к Вам несколько уточняющих вопросов:
- отправив данные на UDP_Server мы этими данными на стороне сервера как распоряжаемся? В php есть глобальный массив GET с помощью которого мы принимаем отправленные данные GET_запросом на стороне WEB_Server и затем эти данные по запросу отправляем клиенту (браузеру) формируя страницу с информацией.
В UDP мы так же это сможем сделать?
- Может ли UDP_JAVA_Servet формировать страницу наподобие HTML странице. Или нужно создавать окно пограмно (писать свою программу) для отображения данных пришедших с контроллера?
Как в вашем случае сделано отображение динамических данных в вашей программе изображение которой вы прилагали?
Заранее благодарен.

Re: W5500_client+Atmega8_для самых начинающих.

Вт сен 14, 2021 18:15:13

Так у меня тоже нет академических знаний)) я посмотрел пару видеоуроков и почитал пару форумов... и всё))

UDP_сервер - это я его так назвал))

Язык Java до конца ещё не изучил. А классы, экземпляры класса и методы... По простому-это тоже самое что функции в Ардуино))
kondeg писал(а):- отправив данные на UDP_Server мы этими данными на стороне сервера как распоряжаемся?

У меня это не просто данные... а данные + команды управление сервером (точнее удалённое управление самим компьютером на котором этот сервер запущен типа программы TeamViewer - https://www.youtube.com/watch?v=9isC4QMoloo ).
С Java можно делать всё что угодно... по желанию))
Я до конца пока не знаю всех функций Java... Их много))
:roll:
kondeg писал(а):В php есть глобальный массив GET с помощью которого мы принимаем отправленные данные GET_запросом на стороне WEB_Server и затем эти данные по запросу отправляем клиенту (браузеру) формируя страницу с информацией.
В UDP мы так же это сможем сделать?

С помощью UDP_Server нет. Потому что GET_запрос работает по TCP.
С помощью TCP_Server можем. Уже давно сделали))
kondeg писал(а):- Может ли UDP_JAVA_Servet формировать страницу наподобие HTML странице. Или нужно создавать окно пограмно (писать свою программу) для отображения данных пришедших с контроллера?

С помощью UDP_Server нет. Потому что HTML страница работает по TCP.
С помощью TCP_Server можем. Уже давно сделали))
kondeg писал(а):Как в вашем случае сделано отображение динамических данных в вашей программе изображение которой вы прилагали?

Да очень просто - с помощью готовых библиотек. Как в Ардуино)).

Добавлено after 48 minutes 2 seconds:
1- качаем виртуальную машину Java с официального сайта.
https://www.oracle.com/java/technologie ... ads/#java8
например JRE - для пользователей.
но нам надо JDK - для разработчиков.

2- выбираем где будем писать программы для Java. Например качаем популярный eclipse.

3- Пишем программы в eclipse. Сама программа - это по сути набор готовых библиотек как в Ардуино)).
В зависимости что мы хотим (нарисовать окно на экране монитора компа... работать с Интернетом... работать со звуком... работать с файлами на жёстком диске компа... работать с фото на жёстком диске компа... работать ёще с чем то...) импортируем нужные библиотеки. Они импортируются автоматом))
Screenshot_1.jpg
(146.42 KiB) Скачиваний: 114

Запускаем eclipse. Открылось окно с кучей лампочек... кнопочек... и ещё куча всего.. всё что мы добавили в окно))
Screenshot_2.jpg
(141.28 KiB) Скачиваний: 106

Дальше нажимаем на кнопочки... и Java машина выполняет все наши желания))
:)))

4- компилируем всё в один файл и запускаем на другом компе))
Видим тоже самое на другом компе.

Это кратко))
:tea:

Работа с пакетами в Java точно такая же как в модуле W5500.))

Для UDP всё просто:
Подключаем библиотеки:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
...
Далее...

Для UDP_RX
1- создаём приёмный буфер (сколько позволяет ОЗУ компа).
2- открываем сокет (указываем IP и потр).
3- ждём пока к нам прилетит пакет по сети...
4- читаем приёмный буфер (байты 0x01 0x02 0x03...).

Для UDP_TX
1- создаём передающий буфер (сколько позволяет ОЗУ компа).
2- открываем сокет (указываем IP и потр).
3- пишем любые данные в передающий буфер (байты 0x01 0x02 0x03...) или любые символы (Java их сама переведёт в байты 0x01 0x02 0x03...).
4- пишем IP и порт назначения.
5- пишем команду "отправить".
Java передала UDP пакет по сети.

Всё))
Всё тоже самое как в W5500.))
:tea:

Для TCP тоже самое только чтение/запись всех буферов идёт через потоки...

Подключаем библиотеки:
import java.net.ServerSocket; //для Сервера
import java.net.Socket; //для Клиента
...
import java.io.InputStream; //потоки ввода/вывода
import java.io.OutputStream; //потоки ввода/вывода
Далее...

Для TCP_Сервер (для Сервера есть специальный сокет - ServerSocket)
1- создаём приёмный буфер (сколько позволяет ОЗУ компа).
2- открываем сокет (указываем IP и потр).
3- ждём пока к нам подключатся... (ждём SYN)...
4- создаём поток ввода/вывода
5- читаем приёмный буфер (читаем поток InputStream) (байты 0x01 0x02 0x03...).
Например мы получили GET запрос от браузера - "GET...."
6- пишем в передающий буфер (пишем поток OutputStream) (байты 0x01 0x02 0x03...).
Пишем ответ браузеру - "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"; ...
7- закрываем сокет. (FIN)
Ещё так же как и в W5500 добавляем всякие тайм-ауты... Например если приёмный буфер пуст то закрываем сокет.
И т.д.

Для TCP_Клиент (для Клиента обычный сокет - Socket)
1- создаём передающий буфер (сколько позволяет ОЗУ компа).
2- открываем сокет (указываем IP и потр).
3- не ждём подключения, а сами подключаемся... (передаём SYN)...
4- создаём поток ввода/вывода
5- пишем любые данные в передающий буфер (пишем поток OutputStream) (байты 0x01 0x02 0x03...).
Например пишем GET запрос Серверу - "GET...." Чтобы Сервер подумал что мы браузер )) Хотя на самом деле мы никакой не браузер, а Java машина, которая прикинулась браузером))
6- читаем приёмный буфер (читаем поток InputStream) (байты 0x01 0x02 0x03...).
Читаем ответ Сервера. Например Сервер нам ответил - "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"; ...
7- закрываем сокет. (FIN)
Ещё так же как и в W5500 добавляем всякие тайм-ауты... Например если приёмный буфер пуст то закрываем сокет.
И т.д.

Короче... В Java всё тоже самое как в W5500.))
Только добавились ещё потоки и размер буфера Java намного больше чем у W5500.)) И вместо кодов ошибок (как W5500) в Java есть так называемые "исключения" (IOException). Те же ошибки (как W5500) только их по другому назвали))

Это кратко.
:tea:

Re: W5500_client+Atmega8_для самых начинающих.

Ср сен 22, 2021 03:26:04

Рома спасибо за ответ. Большое спасибо.
Позволил себе минуту уныния, впредь постараюсь так не поступать.
Нашел, по моим меркам, неплохую статью для новичков про создание (написание) сервера на java:
https://nuancesprog.ru/p/8583/
Во всяком случае уже сделал первый самостоятельный шаг :))

Re: W5500_client+Atmega8_для самых начинающих.

Ср сен 22, 2021 10:41:28

Установите для начала виртуальную машину Java с пакетом JRE для разработчиков... и просто создайте первый проект.
Тут мы делали это - https://www.radiokot.ru/forum/viewtopic ... &start=129
Ещё в инете есть куча видео инструкций как это сделать.))

Re: W5500_client+Atmega8_для самых начинающих.

Сб сен 25, 2021 08:34:16

Рама здравствуй.
Установил IDE Idea. Неплохой, на мой взгляд, редактор кода. Автодополнение кода и все такое...
Пришлось немного поломать голову над ошибками исполняемого в консоли jar файла. Разные версии java были установлены. В консоли на компе более старая версия была, чем в IDE.
Изучаю классы, конструкторы классов, методы. Хорошее видео на Youtube нашел по C#. Очень схожий синтаксис с java. Автор рассказывает доходчиво.
Написал код первого окошка (по примерам правда) и сделал файл исполняемым. Мелочь, а приятно.
Вообщем не даю себе унывать. :))

Re: W5500_client+Atmega8_для самых начинающих.

Сб сен 25, 2021 10:45:26

Ну главное создать первый проект и понять суть работы виртуальной машины))
Показывайте что получилось... код... скриншоты... и т.д.
:tea:

Re: W5500_client+Atmega8_для самых начинающих.

Вс сен 26, 2021 05:15:48

Пока только Hello World в консоли и запуск всего этого через bat_file.
Привыкаю к терминам ООП.
Рома а Вы в какой среде пишите java программы?
И окна с помощью чего (библиотеки, дополнительные программы) создаете?
Попробовал в IDE Idea с помощью javaFX создать окошко (на примере некоторых уроков(уж очень хвалили FX)), но что то ничего путнего не получается у меня.
Буду в eclipse тоже самое делать. Может IDEA не настроена как надо или я чего не до понимаю ....

Re: W5500_client+Atmega8_для самых начинающих.

Вс сен 26, 2021 23:19:45

Я всё пишу в eclipse.
Кто такой bat_file ? Это типа .BAT в DOS ?)) Зачем ? Java всё делает сама))

Добавлено after 57 minutes 6 seconds:
Cоздаем новый проект Java:
1- открываем eclipse.
нажимаем: "Файл" > "Новый проект Java" > "дальше"...
Screenshot_1.jpg
(105.07 KiB) Скачиваний: 95

2- пишем: "имя проекта", "куда сохранить", "подключаем библиотеки", жмём "финиш"...
Screenshot_2.jpg
(114.5 KiB) Скачиваний: 97

eclipse создал наш проект Java))

Теперь создаем пакет Java.
3- пишем: "имя пакета", "имя класса", создаём главный класс main (туда будем писать наш код), жмём финиш.
Screenshot_3.jpg
(118.56 KiB) Скачиваний: 100

eclipse создал пакет Java))
Screenshot_4.jpg
(86.76 KiB) Скачиваний: 97

:tea:

Добавлено after 4 minutes 35 seconds:
Дальше пишем код программы... и подключаем библиотеки.
Для окон есть разные библиотеки. Я использую lля окон библиотеку "swing".
4- пишем код... нажимаем кнопочку Run... eclipse запускает наш код... открывается наше окно))
Screenshot_5.jpg
(214.29 KiB) Скачиваний: 104

Всё работает))
Можно нажимать всякие кнопочки... мигают всякие лампочки... и т.д.))
:tea:

Добавлено after 10 minutes 17 seconds:
Дальше нам нужно сохранить наш проект в один большой исполняемый файл.
В этом одном большом исполняемом файле (.jar) хранится наш код + библиотеки для работы нашего кода.
5- нажимаем правой кнопкой мышки на наш пакет... выбираем "Экспорт"... указываем экспортировать наш пакет в исполняемый файл (.jar)...
Screenshot_6.jpg
(117.22 KiB) Скачиваний: 96

6- пишем: экспортировать наш пакет... куда сохранить экспортировать наш пакет...
Screenshot_7.jpg
(124.24 KiB) Скачиваний: 91

Получился вот такой исполняемый файл (.jar).
Закидываем наш исполняемый файл (.jar) на рабочий стол.
Screenshot_8.jpg
(26.6 KiB) Скачиваний: 97

Кликаем по нашему исполняемому файлу (.jar) два раза мышкой... На компе запускается виртуальная Java машина... Открывается наше окно.
Screenshot_9.jpg
(98.45 KiB) Скачиваний: 97

Всё работает))
Можно нажимать всякие кнопочки... мигают всякие лампочки... и т.д.))
:tea:

Как видим Java машина работает очень просто))
:tea:

Добавлено after 2 minutes 59 seconds:
P.S.
В названии папки (или директории) где хранится исполняемый файл (.jar) не должно быть русских букв.
Java машина не работает с папками (или директориями) где в названии есть русские буквы.
Это требование многих программ... И исполняемый файл (.jar) не исключение.))
Всё)) Вот и вся Java машина. ))
:tea:

Добавлено after 1 hour 34 seconds:
Для проверки пример кода Java для работы с окнами...

Вот текстовый файл с кодом Java_4:
Java_4.rar
(3.06 KiB) Скачиваний: 136

1- скопировали этот код в наш проект...
Screenshot_1.jpg
(160.62 KiB) Скачиваний: 95

2- нажали кнопочку сохранить...
Screenshot_2.jpg
(166.39 KiB) Скачиваний: 95

3- нажали кнопочку запустить...
Если всё сделали правильно по появится окно...
Ну и сразу же Java определила разрешением экрана монитора и IP адрес компа...
Screenshot_3.jpg
(109.82 KiB) Скачиваний: 93

А дальше пишем программу для Java Сервера ))
:tea:

Добавлено after 49 minutes 19 seconds:
Ну и давайте Экспортируем наш проект в исполняемый файл (.jar)...
Вот он))
Java_4.rar
(6.6 KiB) Скачиваний: 131

Качаем файл Java_4.jar на диск D или С...
Запускаем исполняемый файл (.jar) с диска D или С...
Screenshot_1.jpg
(73.56 KiB) Скачиваний: 89

Всё работает))
:tea:
Ещё прикол в том что можно запускать исполняемый файл (.jar)... с флешки ! ))
Копируем исполняемый файл (.jar) на флешку... открываем проводник... кликаем по исполняемый файл (.jar)...
Screenshot_1.jpg
(71.13 KiB) Скачиваний: 94

Всё работает))
:tea:
Короче... всё просто))

Добавлено after 5 hours 27 minutes 8 seconds:
Ну и напоследок проверим как работает наш Java Сервер по TCP ))
По быстрому накидали простенькую программку Java Сервер TCP...
Вот код.
Код_Java_Server_TCP.rar
(5.51 KiB) Скачиваний: 131

Код не оптимальный, но для тестов пойдёт))

Закидываем наш код в eclipse... Компилируем... Экспортируем в исполняемый файл "Java_Server_TCP.jar".
Вот сам файл.
Java_Server_TCP.rar
(10.62 KiB) Скачиваний: 128

Сохраняем файл "Java_Server_TCP.jar" на диске D.
Не могу запустить его с Рабочего стола... Тут есть одна проблемка... У меня название "Рабочий стол" - русскими буквами))
Так нифига работать не будет...
Значит создаём ярлык файла "Java_Server_TCP.jar" > "Java_Server_TCP.lnk".
Screenshot_3.jpg
(50.91 KiB) Скачиваний: 90

Закидываем ярлык на Рабочий стол и запускаем...
Открываются два окна:
вверху окно для входящих сообщений (окно Сервера),
внизу окно для исходящих сообщений (окно Клиента).
Screenshot_0.jpg
(65.62 KiB) Скачиваний: 89

Java_Server_TCP работает))

Берём любой браузер и подключаемся к нашему Java_Server_TCP...
Screenshot_1.jpg
(105.85 KiB) Скачиваний: 90

Браузер отправил GET запрос нашему Java_Server_TCP... Всё что отправил браузер мы видим на экране.
В ответ наш Java_Server_TCP отправил браузеру дату, время, IP браузера, порт браузера...
Всё работает))
Вместо даты, время, IP... наш Java_Server_TCP может отправлять браузеру всё что угодно.
Любые текстовые документы... фото, аудио, видео... и т.д.
По сути у нас получился настоящий сервер)) Пока только в тестовом режиме...

Добавлено after 4 minutes 22 seconds:
Теперь проверим как работает наш TCP_Клиент... нажимаем кнопочку "TCP_Клиент".
Screenshot_2.jpg
(103.89 KiB) Скачиваний: 91

Теперь наш Java_Server_TCP работает в роли Клиента...
наш Клиент отправил GET запрос нашему Java_Server_TCP...
Т.е. Java_Server_TCP отправил GET запрос самому себе))
И сам себе же ответил)) Java_Server_TCP... поговорил сам с собой)) :)))

Короче... всё работает.
:tea:

Re: W5500_client+Atmega8_для самых начинающих.

Вт май 31, 2022 16:26:51

Вот такая картинка на каждую посылку. 5500 не успевает получать подтверждения?

Добавлено after 30 minutes 1 second:
Вызов wizchip_gettimeout( &to ); дал вот такие результаты. Вроде, адекватные значения.
Вложения
Screenshot_399.jpg
(6.09 KiB) Скачиваний: 51
photo_2022-05-31_17-21-11.jpg
(60.74 KiB) Скачиваний: 51

Re: W5500_client+Atmega8_для самых начинающих.

Вт май 31, 2022 17:35:14

в 5500 достаточно мощный встроенный процессор... который прекрасно справляется с большими потоками данных... тестировал по всякому))
все тайминги в 5500 для TCP уже настроены на заводе изготовителе...
менять заводские настройки не рекомендуется.
я их никогда не менял.

и вообще... я больше не использую TCP... у меня всё прекрасно работает по UDP.
а тайминги надо смотреть в первой колонке анализатора...

вот к примеру я отправляю пакет UDP... через 88 mc получаю подтверждение ))
это так медленно работает ATmega8... а 5500 тут не причём)) 5500 работает намного быстрей любой ATmega8))
ATmega8_AES128.jpg
(146.06 KiB) Скачиваний: 51

:tea:

Re: W5500_client+Atmega8_для самых начинающих.

Вт май 31, 2022 18:25:57

Добавил картинки с таймингами.

Добавлено after 14 minutes 26 seconds:
Не понимаю, почему после отправки нормальной посылки 5500 пилит её и делает отправку ещё трёх. Или я что-то не так понимаю?
Вложения
Screenshot_403.jpg
(65.11 KiB) Скачиваний: 52
Screenshot_402.jpg
(80.57 KiB) Скачиваний: 43
Screenshot_401.jpg
(62.84 KiB) Скачиваний: 46

Re: W5500_client+Atmega8_для самых начинающих.

Вт май 31, 2022 20:00:42

нормальные тайминги...
5500 отправляет ACK автоматом...

а с чего ты взял что во всем виновата 5500 ? как определил ?

5500 режет пакеты только когда размер пакета больше TCP пакета...
в остальных случаях 5500 сама ничего не режет ))
:tea:

Re: W5500_client+Atmega8_для самых начинающих.

Вт май 31, 2022 20:05:01

roman.com писал(а):а с чего ты взял что во всем виновата 5500 ? как определил ?


Смотри:
192.168.27.100- это сервер;
192.168.27.133- это клиент.

Клиент шлёт нормальный запрос с длиной 10 байт, а потом, примерно, через 10мс ещё 3 посылки, которые являются распиленными частями исходной. Вот чё его заставляет такое исполнять?
Ответить