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

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

Ср июл 28, 2021 08:54:33

Socket_2_ESTABLISHED:
delay_ms(1);
/////////////////////////////////////////////////////////////////////////////////////////////
// Читаем размер принятых данных Socket_2:
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x26; SPI(); tx=0x48; SPI(); // Address + Control Registers
tx=0x00; SPI(); x1 = rx; // Data -Sn_RX_RSR0 -размер принятых данных
tx=0x00; SPI(); x2 = rx; // Data -Sn_RX_RSR1 -размер принятых данных
PORTB.6=1; // SS W5500
//////////////////////////////////////////////////////////// таймаут FIFO_RX Socket_2:
tm_SOCKET++;
if (tm_SOCKET > 1000) { // цикл - 1c ждём Data
goto Socket_2_DISCON; // FIFO_RX пуст > Socket_2_DISCON
//goto TX_Socket_2; // > TX, FIN
};
/////////////////////////////////////////////////////////////////////////////////////////////
// проверка FIFO_RX:
len = x1; len = (len<<8)|x2; // размер принятых данных // 0x0000
if (len == 0x00) goto Socket_2_ESTABLISHED; // FIFO_RX пуст > ждём Data


// len = размер принятых данных // 0x0000

Без GOTO ? Это же не удобно...
:roll:

Добавлено after 13 minutes 55 seconds:
размер принятых данных = 0x1E9

0x1E9 = 489 байт.
Сравните с анализатором трафика. https://www.radiokot.ru/forum/viewtopic ... &start=452
Screenshot_1.jpg
(120.28 KiB) Скачиваний: 202

:tea:

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

Ср июл 28, 2021 08:56:40

Рома у меня такой вопрос:

//////////////////////////////////////// RX_int[x] > HEX > DEC > 000
bi = RX_int[x];


RX_int[x] - этот массив мы где создали?

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

Ср июл 28, 2021 09:03:07

RX_int[x] > HEX > DEC > 000 - это отправка числового значения браузеру. Это пока не нужно.

Пока достаточно просто что-нибудь ответить браузеру. Например "Привет браузер !"))

////////////////////////////////////////// Data TX W5500 HTTP (например отправим текстовую страницу для браузера):
//GET / HTTP/1.1
//unsigned char bufer_TX_W5500_HTTP[]={
//"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n>Привет браузер !|"
//};
//bufer_TX_W5500_HTTP
for (x=0; bufer_TX_W5500_HTTP[x] != '|' ; x++) {
tx=bufer_TX_W5500_HTTP[x]; SPI(); len++;
};

:tea:

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

Ср июл 28, 2021 09:17:32

Т.е. ответ браузеру до этого места?

tx=bufer_TX_W5500_HTTP[x]; SPI(); len++;
};
////////////////////////////////////////// GET /1 HTTP/1.1

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

Ср июл 28, 2021 09:21:07

Да.


//TX_Socket_2:
/////////////////////////////////////////////////////////////////////////////////////////////
// Читаем начальный адрес для записи данных Socket_2:
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x24; SPI(); tx=0x48; SPI(); // Address + Control Registers
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
/////////////////////////////////////////////////////////////////////////////////////////////
// начальный адрес для записи данных:
x1 = (add>>8);
x2 = add;
// Пишем данные Socket_2 с начального адреса:
PORTB.6=0; // SS W5500
tx=x1; SPI(); tx=x2; SPI(); tx=0x54; SPI(); // Address + Control Registers

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


////////////////////////////////////////// Data TX W5500 HTTP (например отправим текстовую страницу для браузера):
//GET / HTTP/1.1
//unsigned char bufer_TX_W5500_HTTP[]={
//"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n>Привет браузер !|"
//};
//bufer_TX_W5500_HTTP
for (x=0; bufer_TX_W5500_HTTP[x] != '|' ; x++) {
tx=bufer_TX_W5500_HTTP[x]; SPI(); len++;
};
/////////////////////////////////////////// Data END



PORTB.6=1; // SS W5500
/////////////////////////////////////////////////////////////////////////////////////////////
// Пишем указатель TX Socket_2 до увеличенного значения:
add = add + len; // add - конечный адрес переданных данных // 0x0000
// len - размер переданных данных // 0x0000
x1 = (add>>8);
x2 = add;
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x24; SPI(); tx=0x4C; SPI(); // Address + Control Registers
tx=x1; SPI(); // Data -Sn_TX_WR0 -конечный адрес передачи данных
tx=x2; SPI(); // Data -Sn_TX_WR1 -конечный адрес передачи данных
PORTB.6=1; // SS W5500
/////////////////////////////////////////////////////////////////////////////////////////////
// Пишем команду передачи Socket_2:
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x01; SPI(); tx=0x4C; SPI(); // Address + Control Registers
tx=0x20; SPI(); // Data -0x20 (SEND)
PORTB.6=1; // SS W5500
/////////////////////////////////////////////////////////////////////////////////////////////
//if (Sn_CR == 0x00); // По окончанию передачи регистр -Sn_CR будет = 0x00.


//Передача закончена.

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

Чт июл 29, 2021 04:12:59

Вчера попробовал отправить тестовую страницу клиенту, но ничего не вышло(клиент не видит отправленной страницы).
Сегодня буду более подробно разбирать мой код. Систематизировать, читать статусы (через UART).
Тяжеловато с GOTO.
Границы функции определен фигурными скобками, а где конец у метки goto не пойму.

Добавлено after 1 hour 5 minutes 17 seconds:
И так....
Порядок производимых мной действий:
Если чего то не хватает или наоборот лишнее, пожалуйста поправьте меня.

- Сброс модуля через reset
- Программный сброс
- Прописываем режим PHY(физический уровень)
- По желанию чтение статуса PHY
- Настройка логического уровня (шлюз, маска, IP, MAC) после этого отвечает на ping
- Создаем socket (записываем в него протокол и порт)
- Открываем socket (команда OPEN)
- Переключаем socket в режим прослушивания (server)
- Читаем статус socket на предмет подключения клиента к серверу
- Если статус socket = 0x17 (ESTABLISHED) то читаем размер принятых данных, которые > 0
- Читаем начальный адрес принятых данных
- Читаем данные с начального адреса socket
- Пишем указатель RxSocket да увеличенного значения
- Пишем команду завершения приема
- - - Передача пакета браузеру
- Читаем начальный адрес для записи данных
- Пишем данные socket с начального адреса
- Отправка текстовой страницы в браузер
- Пишем указатель TxSocket до увеличенного значения
- Пишем команду передачи socket
- Закрываем соединение с браузером (передаем FIN пакет)
- Закрываем socket

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

Чт июл 29, 2021 10:56:01

Первым делом скачайте и запустите на своём компе анализатор трафика. Например Wireshark.
Вы должны видеть всё что принимает и передаёт W5500. Каждый пакет !
Работать в слепую методом "тыка" - пустая трата времени))
анализатор.jpg
(168.71 KiB) Скачиваний: 197

:tea:

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

Чт июл 29, 2021 12:09:44

Запустил Wireshark.
Видит передачу от W5500 (129.168.0.200) до компьютера (192.168.0.105).
Как вставить в сообщение изображение этих данных?

Добавлено after 16 minutes 15 seconds:
Изображение

Вроде бы вставил изображение анализатора.

Добавлено after 28 minutes 43 seconds:
Роман. Может быть я что то упустил в Вашем коде, напишите код отправки текстового сообщения в браузер еще раз или по шагам что я должен написать, что бы отправить ее.
По статусу W5500 вижу, что он определяет подключение к нему, отправляет страницу (так как я это понял из Вашего кода), после отправки закрывает socket.
Заранее благодарен.

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

Чт июл 29, 2021 14:24:31

Ну вот. Другое дело.
:tea:
На анализаторе видим что мой W5500 передаёт браузеру пакет 87 байт.
Screenshot_2.jpg
(83.08 KiB) Скачиваний: 181

На вашем анализаторе мы видим что ваш W5500 передаёт браузеру пакет 1514 байт.
Screenshot_1.jpg
(38.1 KiB) Скачиваний: 167

Вывод: ошибка передающего буфера вашего W5500.

Разберём подробно как работает передающий буфер W5500.
:tea:
Всего в W5500 8 штук сокетов. В каждом сокете один передающий буфер TX и один приёмный буфер RX.
Соответственно всего в W5500 8 буферов.
Нас интересует сокет номер 2 и соответственно передающий буфер TX номер 2.
Screenshot_1.jpg
(81.81 KiB) Скачиваний: 177

Буфер RX и буфер TX - это КОЛЬЦЕВОЙ буфер. https://ru.wikipedia.org/wiki/Кольцевой_буфер

Работа с кольцевым буфером имеет свои особенности чтения/записи.

Грубо говоря (по простому) у кольцевого буфера есть начало и конец.
Screenshot_2.jpg
(33.75 KiB) Скачиваний: 152

Порядок работы с кольцевым передающим буфером TX такой:

1- Читаем начальный адрес add (0x0000...0xFFFF) для записи данных в кольцевой передающий буфер TX Socket_2:

//TX_Socket_2:
/////////////////////////////////////////////////////////////////////////////////////////////
// Читаем начальный адрес для записи данных Socket_2:
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x24; SPI(); tx=0x48; SPI(); // Address + Control Registers
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; // add (0x0000...0xFFFF)


//add - начальный адрес для записи данных (0x0000...0xFFFF)
Screenshot_3.jpg
(36.97 KiB) Скачиваний: 161

/////////////////////////////////////////////////////////////////////////////////////////////
// начальный адрес для записи данных:
x1 = (add>>8);
x2 = add;


2- Пишем данные в кольцевой передающий буфер TX Socket_2 с начального адреса add (0x0000...0xFFFF):
Screenshot_4.jpg
(40.96 KiB) Скачиваний: 151

// Пишем данные Socket_2 с начального адреса add (0x0000...0xFFFF):
PORTB.6=0; // SS W5500
tx=x1; SPI(); tx=x2; SPI(); tx=0x54; SPI(); // Address + Control Registers

// сброс len (0x0000...0xFFFF) - длина передаваемых данных
len = 0; // len (0x0000...0xFFFF)


////////////////////////////////////////// Data TX W5500 HTTP (например отправим текстовую страницу для браузера):
//GET / HTTP/1.1
//unsigned char bufer_TX_W5500_HTTP[]={
//"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n>Привет браузер !|"
//};
//bufer_TX_W5500_HTTP
for (x=0; bufer_TX_W5500_HTTP[x] != '|' ; x++) {
tx=bufer_TX_W5500_HTTP[x]; SPI(); len++; // len (0x0000...0xFFFF) - длина передаваемых данных
};
/////////////////////////////////////////// Data END


3- Пишем конечный адрес (указатель) в кольцевой передающий буфер TX Socket_2:
//начальный адрес (add) + длина данных (len) = конечный адрес (add)
Screenshot_5.jpg
(51.71 KiB) Скачиваний: 159

PORTB.6=1; // SS W5500
/////////////////////////////////////////////////////////////////////////////////////////////
// Пишем указатель TX Socket_2 до увеличенного значения:
add = add + len;
// add - конечный адрес передаваемых данных // (0x0000...0xFFFF)
// len - размер передаваемых данных // (0x0000...0xFFFF)
x1 = (add>>8);
x2 = add;
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x24; SPI(); tx=0x4C; SPI(); // Address + Control Registers
tx=x1; SPI(); // Data -Sn_TX_WR0 -конечный адрес передачи данных
tx=x2; SPI(); // Data -Sn_TX_WR1 -конечный адрес передачи данных
PORTB.6=1; // SS W5500


4- Пишем команду передачи (SEND) для кольцевого передающего буфера TX Socket_2:


/////////////////////////////////////////////////////////////////////////////////////////////
// Пишем команду передачи Socket_2:
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x01; SPI(); tx=0x4C; SPI(); // Address + Control Registers
tx=0x20; SPI(); // Data -0x20 (SEND)
PORTB.6=1; // SS W5500
/////////////////////////////////////////////////////////////////////////////////////////////
//if (Sn_CR == 0x00); // По окончанию передачи регистр -Sn_CR будет = 0x00.


//Передача закончена.

Вывод:
Пакет из кольцевого передающего буфера TX Socket_2 с начальным адресов add (0x0000...0xFFFF) и конечным адресом add (0x0000...0xFFFF) + len (0x0000...0xFFFF) будет передан браузеру.
Всё))
:tea:

*Поправка.
-Если мы например запишем конечный адрес add (0x0000...0xFFFF) (указатель) меньше len (0x0000...0xFFFF) - размер передаваемых данных, то пакет будет передан не весь, а только до конечного адреса add (0x0000...0xFFFF) (указателя)...))
-Если мы запишем конечный адрес add (0x0000...0xFFFF) (указатель) больше len (0x0000...0xFFFF) - размер передаваемых данных, то пакет будет передан вместе с мусором от прошлого пакета...))

Поэтому надо точно указывать начальный и конечный адрес (указатель).
:tea:

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

Пт июл 30, 2021 06:26:22

Роман здравствуйте.
Просто не знаю как Вас благодарить.
Все получилось. W5500 отправляет в браузер тестовую страницу без проблем.

Не так страшно все оказалось.
Тем более Вами расписано все очень подробно. Думаю многим начинающим Ваша помощь
сократит большое количество головных болей :))
Еще ошибка была в моем коде, из за чего и выдавал буфер мусор.
Дело в том, что у меня первоначально тип переменной add был uint8_t (char), поэтому и не "влазили"
в нее все данные. Еще раз спасибо Вам за разъяснения!
Рома у меня вопрос. Для проверки значений регистров W5500 как например
Код:
if (Sn_CR == 0x00); // По окончанию передачи регистр -Sn_CR будет = 0x00.

Нам необходимо эти (этот) регистр прочитать?
Т.е. каждый раз при проверке мы их читаем а потом проверяем?
Ну и напоследок, не теряя бодрости духа, вернемся к моему первоначальному замыслу...
К Atmega+W5500_client.
Какой порядок действия в этом случае?
К примеру: переменная a=7 как это значение отправить на server по адресу 192.168.0.200
Как это делается в строке браузера я примерно знаю:
Код:
192.168.0.200/data.php?a=7

А как это сделать через W5500_client не понимаю.
Вложения
передача.png
(21.47 KiB) Скачиваний: 167

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

Пт июл 30, 2021 12:20:03

Покажите ещё раз анализатор чтоб убедиться что всё правильно работает.
Должно быть так
Screenshot_2.jpg
(83.08 KiB) Скачиваний: 164

>SYN
>SYN ACK
>ACK
>GET
>TCP
>FIN ACK
>ACK
>FIN ACK
>ACK
kondeg писал(а):if (Sn_CR == 0x00); // По окончанию передачи регистр -Sn_CR будет = 0x00.
Нам необходимо эти (этот) регистр прочитать?

Нет. Это регистр команд. В него пишем команду передачи - 0x20 (SEND). Когда все данные из передающего буфера будут переданы статус регистра команд сбросится в ноль - 0x00. Таким образом W5500 нам сообщает что все данные переданы т.е. команда 0x20 (SEND) выполнена.
Но дело в том, что передача передающего буфера происходит очень быстро. Поэтому пока мы пишем другие регистры, регистр команд за это время уже сбросится в ноль - 0x00.
Поэтому его читать не нужно.
Тяжеловато с GOTO.

Безусловный переход. Наоборот проще. Не нужно ждать завершения циклов и т.д.))

И так....
Порядок производимых действий:

Для W5500_server:
- Сброс W5500 через reset
- Программный сброс PHY(физический уровень)
- Прописываем режим PHY(физический уровень)
- Настройка логического уровня (шлюз, маска, IP, MAC) после этого отвечает на ping
- Создаем socket (записываем в него протокол и порт)

- Открываем socket (команда OPEN)
- Переключаем socket в режим прослушивания (LISTEN)
- Читаем статус socket (или читаем вывод INT W5500) на предмет подключения клиента к серверу .

- Если статус socket != 0x14 (Если статус не LISTEN, а какой-то другой) то читаем размер принятых данных, которые > 0 (да/нет ?)
(Так проще. Дело в том, что у сокета много режимов/статусов. Чтобы не проверять каждый статус по отдельности мы просто спрашиваем - статус LISTEN ? или не LISTEN ? Если статус не LISTEN, значит статус ESTABLISHED или какой другой. Какой именно статус - нам не интересно. Мы сразу переходим в режим ESTABLISHED. Остальные статусы сокета нас не интересуют.)

//режим ESTABLISHED:
- Читаем начальный адрес буфера RX
- Читаем данные с начального адреса буфера RX
- Пишем указатель буфера RX до увеличенного значения
- Пишем команду завершения приема буфера RX

- - - Передача пакета браузеру
- Читаем начальный адрес буфера TX
- Пишем данные с начального адреса буфера TX
- Пишем указатель буфера TX до увеличенного значения
- Пишем команду передачи буфера TX (команда SEND)
- Закрываем соединение с браузером (передаем FIN пакет)

- или Закрываем socket и переходим к пункту - Открываем socket (команда OPEN).
- или не закрываем сокет и переходим к пункту - Переключаем socket в режим прослушивания (LISTEN).
Вроде так))
:tea:
К примеру: переменная a=7 как это значение отправить на server по адресу 192.168.0.200
Как это делается в строке браузера я примерно знаю:
Код:
192.168.0.200/data.php?a=7

А как это сделать через W5500_client не понимаю.

не помню)) Это было давно)) :roll: Сейчас вспомним))

W5500_client должен прикинуться браузером))

Контролировать работу W5500 в режиме W5500_client надо тоже по анализатору.

И так....
Порядок производимых действий:
W5500_client:
- Сброс W5500 через reset
- Программный сброс PHY(физический уровень)
- Прописываем режим PHY(физический уровень)
- Настройка логического уровня (шлюз, маска, IP, MAC) после этого отвечает на ping
- Создаем socket (записываем в него протокол и порт)

- Открываем socket (команда OPEN)

- - - Передача пакета серверу

- пишем IP (Destination), порт (Destination) сервера
(для сервера HTTP порт 80, для сервера HTTPS порт 443, и т.д.)

PORTB.6=0; // SS W5500
// (для команды SEND c автоматическим ARP-запросом):
tx=0x00; SPI(); tx=0x0C; SPI(); tx=0x4C; SPI(); //(MAC = ARP), IP, порт
//IP_server: 192.168.0.200
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=200; SPI(); // Data // Destination IP Address (Sn_DIPR3)(0x000F - Address)
// порт_server: 80
tx=0x00; SPI(); // Data // Destination Port (Sn_DPORT0)(0x0010 - Address) -порт 80
tx=0x50; SPI(); // Data // Destination Port (Sn_DPORT1)(0x0011 - Address) -порт 80
PORTB.6=1; // SS W5500

- Пишем команду подключения к серверу (команда CONNECT)
// пишем команду CONNECT Socket_2:
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x01; SPI(); tx=0x4C; SPI(); // Address + Control Registers
tx=0x04; SPI(); // Data -0x04 (CONNECT)
PORTB.6=1; // SS W5500

//W5500_client подключается к серверу...
//>SYN
//>SYN ACK
//>ACK
//W5500_client подключился к серверу.

> После подключения к серверу сокет 2 перейдёт в режим ESTABLISHED.
- Ждём пока сокет 2 перейдёт в режим ESTABLISHED...

//режим ESTABLISHED:
- Читаем начальный адрес буфера TX
- Пишем данные с начального адреса буфера TX

> Наш W5500_client должен прикинуться браузером.
http://we.easyelectronics.ru/electro-an ... i-cgi.html
Для этого W5500_client должен передать серверу примерно такой пакет:
передача пакета серверу.jpg
(31.72 KiB) Скачиваний: 163

/////////////////////////////////////////////////////
//unsigned char bufer_TX_W5500_HTTP[]={
//"GET /data.php?a=7 HTTP/1.1\r\nHost: 192.168.0.200\r\nUser-Agent: ................. \r\n\r\n|" //
//};
//bufer_TX_W5500_HTTP
for (x=0; bufer_TX_W5500_HTTP[x] != '|' ; x++) {
tx=bufer_TX_W5500_HTTP[x]; SPI(); len++; // len (0x0000...0xFFFF) - длина передаваемых данных
};
/////////////////////////////////////////////////////
Сервер подумает что наш W5500_client - это браузер)) Мы обманули сервер))

- Пишем указатель буфера TX до увеличенного значения

- Пишем команду передачи буфера TX (команда SEND)

> Сервер прочитает наш пакет и ответит нашему W5500_client таким пакетом:
ответ сервера.jpg
(6.7 KiB) Скачиваний: 158

Мы можем прочитать ответ сервера.
А можем не читать ответ сервера, а просто подождать пока сервер закроет соединение (отправит нам пакет FIN).
Это по желанию.

- Ждём когда сервер закроет соединение (принимаем пакет FIN от сервера).

- или Закрываем socket и переходим к пункту - Открываем socket (команда OPEN).
- или не закрываем сокет и переходим к пункту - - - Передача пакета серверу.
Вроде как-то так))
:roll:

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

Сб июл 31, 2021 01:07:36

Покажите ещё раз анализатор чтоб убедиться что всё правильно работает.

Это данные анализатора во время работы W5500_server + client

Изображение

Изображение правда не четкое. Не могу разобраться, как делать вложения как у Вас в сообщениях.....

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

Сб июл 31, 2021 02:07:40

kondeg писал(а):Не могу разобраться, как делать вложения как у Вас в сообщениях.....

Screenshot_2.jpg
(85.33 KiB) Скачиваний: 142

Screenshot_3.jpg
(89.54 KiB) Скачиваний: 135

Вот нормальная работа W5500
Screenshot_1.jpg
(118.77 KiB) Скачиваний: 157

У Вас на анализаторе:
-ПК 192.168.0.105 отправляет запрос соединения (пакет SYN)
-W5500 192.168.0.200 отправляет сброс (пакет RST, ACK). Сокет W5500 закрыт или занят.
Браузер не может подключиться к W5500.

Хотель бы посмотреть весь процесс общения ПК и W5500 с самого начала))
:tea:

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

Сб июл 31, 2021 10:18:54

Рома прошу прощения за задержку с ответом. Разбирался с фильтрами в Wireshark.....
Вот что получилось.....
Подключился, получил сообщение от server. Это данные анализатора:
W5500_server_and_client.jpg
(227.79 KiB) Скачиваний: 140


Добавлено after 46 minutes 23 seconds:
Вот данные после немного подправленного кода:
W5500_server_client_imgjpg.jpg
(221.03 KiB) Скачиваний: 134


Добавлено after 6 minutes 38 seconds:
Не могу разобраться, как делать вложения как у Вас в сообщениях.....

Понял почему изображение не всегда вставлялось. Размер был больше положенного.

Добавлено after 4 hours 58 minutes 12 seconds:
Просидел Рома я сегодня весь день над сервером (программой), а что бы как у тебя анализатор (чисто)не показал.
Вот что пишет после отправки браузеру.
W5500_server.jpg
(235.66 KiB) Скачиваний: 138

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

Сб июл 31, 2021 11:54:02

Теперь нормально.

С этим браузером Анализатор чисто не покажет. Потому что Браузер отправляет сразу два пакета SYN на порт 61183 и порт 50633.
А у W5500 открыт только один сокет номер 2. Поэтому W5500 пакет SYN на порт 50633 сбрасывает.
W5500_server_and_client.jpg
(234.7 KiB) Скачиваний: 130

Современные браузеры открывают сразу несколько соединений с сервером.
Чтобы W5500 могла работать с современным браузером надо открывать несколько сокетов))
Но нам это не нужно))

А чтобы было красиво как у меня, нужен другой браузер. Например старая Опера и т.д.
Вот например браузер Опера отправляет один пакет SYN на порт 4637
браузер Опера.jpg
(92.47 KiB) Скачиваний: 133

Короче всё нормально. Можно делать W5500_client.
:tea:

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

Сб июл 31, 2021 12:46:00

Заканчивается рабочий день. Буду потихоньку домой собираться.
Попробовал сейчас ,на исходе рабочего времени, W5500 в режиме clien (до того места где статус меняется на (0x17).
Меняется. :))
Анализатор , как ты и говорил, показывает:
//>SYN
//>SYN ACK
//>ACK

Спасибо Рома тебе бОльшое.
Завтра, не теряя бодрости духа, продолжу.

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

Пн авг 02, 2021 12:14:09

Здравствуй Рома.
Привет всем.
Вчера, в воскресенье, отправил данные на сервер.
Событие для меня. Дай Бог Роману здоровья и благополучия. Разложил для меня и таких как я этот модуль по полочкам.
Правда под конец воскресного дня, немного позволил себе вольность и , опираясь на свои знания, некоторую часть функции отправки данных на сервер переписал немного по другому. Но суть от этого не поменялось.
Итак...
Код:
Код:
/////////////////////////////////////////////////////
//unsigned char bufer_TX_W5500_HTTP[]={
//"GET /data.php?a=7 HTTP/1.1\r\nHost: 192.168.0.200\r\nUser-Agent: ................. \r\n\r\n|" //
//};
//bufer_TX_W5500_HTTP
for (x=0; bufer_TX_W5500_HTTP[x] != '|' ; x++) {
tx=bufer_TX_W5500_HTTP[x]; SPI(); len++; // len (0x0000...0xFFFF) - длина передаваемых данных
};
/////////////////////////////////////////////////////

Я написал через указатель:
Код:
//передача строкового значения
      void buffer_TX_string_W5500_HTTP(char *str)
      {
         while(*str !='\0')
         {
            SPI(*str++);
            len++;
         }
      }

И вызываем эту функцию в нужном нам месте:
Код:
buffer_TX_string_W5500_HTTP("GET /data.php?a=");
   buffer_TX_string_W5500_HTTP(" HTTP/1.1\r\nHost: 192.168.0.105\r\n\r\n");

Для чего я так сделал.
Что бы передавать не только строковое но и числовое значение(в виде строкового), нам нужно строку отправки на сервер разделить, что бы вставить числовое значение.
Вот для этого я использовал функцию передачи числа, через строку:
Код:
//передача числового значения
void buffer_TX_data_W5500_HTTP(int data)
 {
  char tmp[10];
itoa(data, tmp, 10);  // для использования функции itoa() подключаем #include <stdlib.h>
 buffer_TX_string_W5500_HTTP(tmp);
 }

И тогда передаваемая строка с числовым значение будет иметь вид:
Код:
////////////////////////////////////////
uint8_t temperatura(void)
{
// некоторое действие
// например результат работы датчика
//температуры ds18b20
   return ds18b20_temperatura();
}
///////////////////////////////////////
buffer_TX_string_W5500_HTTP("GET /data.php?a=");
buffer_TX_data_W5500_HTTP(temperatura());
buffer_TX_string_W5500_HTTP(" HTTP/1.1\r\nHost: 192.168.0.105\r\n\r\n");

Вот как то так.....

Но остался не решенным вопрос присвоения не числового значения ip_адреса сервера, а буквенного,
к примеру: mysite.ru
Как с эти быть пока не ясно.
Ну вот вкратце как то так.
Спасибо Роману БОЛЬШОЕ еще раз.

p.s. чуть попозже выложу весь мой код отправки данных на сервер с комментариями, что бы начинающим было удобнее изучать, хотя и так уже многое понятно.

Добавлено after 2 hours 43 minutes 23 seconds:
Но остался не решенным вопрос присвоения не числового значения ip_адреса сервера, а буквенного,
к примеру: mysite.ru Как с эти быть пока не ясно.


Может быть есть какая нибудь программа или функция, которая преобразует доменное имя в ip адрес, что бы его можно было записать в регистр W5500 как в этом случае
Код:
SS_0;
   SPI(0x00); SPI(0x0C); SPI(0x4C);
   //ip
     SPI(192); SPI(168); SPI(0); SPI(105);
   //port
   SPI(0x00); SPI(0x50);
   SS_1;

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

Пн авг 02, 2021 21:14:35

Показывайте анализатор как W5500 работает с реальным сервером.
kondeg писал(а):часть функции отправки данных на сервер переписал немного по другому.

А я пишу строки по частям

1. Начало строки
//unsigned char bufer_TX_W5500_HTTP_1[]={
//"GET /data.php?a=|" //
//};
//bufer_TX_W5500_HTTP_1
for (x=0; bufer_TX_W5500_HTTP_1[x] != '|' ; x++) {
tx=bufer_TX_W5500_HTTP_1[x]; SPI(); len++; // len (0x0000...0xFFFF) - длина передаваемых данных
};

2. данные
tx=ds18b20_temperatura(); SPI(); len++; // len (0x0000...0xFFFF) - длина передаваемых данных

3. Конец строки
//unsigned char bufer_TX_W5500_HTTP_3[]={
//" HTTP/1.1\r\nHost: 192.168.0.200\r\nUser-Agent: ................. \r\n\r\n|" //
//};
//bufer_TX_W5500_HTTP_3
for (x=0; bufer_TX_W5500_HTTP_3[x] != '|' ; x++) {
tx=bufer_TX_W5500_HTTP_3[x]; SPI(); len++; // len (0x0000...0xFFFF) - длина передаваемых данных
};

На выходе W5500 имеем полную строку.
GET /data.php?a=7 HTTP/1.1\r\nHost: 192.168.0.200\r\nUser-Agent: .................

Добавлено after 7 minutes 12 seconds:
Может быть есть какая нибудь программа или функция, которая преобразует доменное имя в ip адрес, что бы его можно было записать в регистр W5500 как в этом случае
Код:
SS_0;
   SPI(0x00); SPI(0x0C); SPI(0x4C);
   //ip
     SPI(192); SPI(168); SPI(0); SPI(105);
   //port
   SPI(0x00); SPI(0x50);
   SS_1;

Функции такой нет.
Есть протокол DNS, который преобразует доменное имя в ip адрес.
В W5500 нет встроенного протокола DNS. Надо писать самому.
DNS работает по протоколу UDP. В W5500 есть встроенный протокол UDP.
Screenshot_1.jpg
(31.09 KiB) Скачиваний: 122

Написать DNS в принципе не проблема.
:tea:

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

Вт авг 03, 2021 11:38:34

Здравствуй Роман.
Привет всем.
Опять радость у меня на лице :))
Наконец то удалось отправить данные на мой реальный сайт (не локальный).
Опять же помогла посоветованная Ромой программа_анализатор Wireshark.
Через фильтр по URL и по GET запросу увидел ip моего сайта.
Изображение Изображение
Хотя прекрасно помню, что через ping в командной строке показывал тот же ip адрес.
По всей видимости к концу вахты стал невнимательным.
И еще. Вчера пытался подключится к сайте без ожидания подключения.
Сегодня поставил задержку в 10 секунд и соединение прошло отлично (потом переписал код через (for (if_else)) ожидать соединение не более 10 сек).
Это место в коде, где менял адреса для сайта:
Код:
//buffer_TX_string_W5500_HTTP(" HTTP/1.1\r\nHost: 192.168.0.105\r\n\r\n");
   buffer_TX_string_W5500_HTTP(" HTTP/1.1\r\nHost: pogoda19.ru\r\n\r\n");

Код:
/ip и port назначения (server)+
void Destination_Ip_Port_Server(void)
{
   SS_0;
   SPI(0x00); SPI(0x0C); SPI(0x4C);
   //ip
   //SPI(192); SPI(168); SPI(0); SPI(105);
     SPI(31); SPI(31); SPI(196); SPI(28);
   //port
   SPI(0x00); SPI(0x50);
   SS_1;
}

Ну а все остальное Рома доходчиво объяснил выше.
Не устану его благодарить....
Рома спасибо тебе большое за твою помощь, за твои знания, терпение!!!!
Ну и пожелание таким как я:
Рома в своем тексте указывал не пайку проводом между выводами м.к. и W5500.
Не пренебрегайте эти советом.
Я пол дня потерял только из-за того, что был плохой контакт по питанию W5500. Модуль выдавал ошибку подключения. Код три раза пересматривал. А оказался плохой зажим контакта в монтажном проводе.
Изображение
Понимаю, что все не эстетично выглядит, зато дешево, надежно и практично :))
А это мой модуль на arduino с импровизированным теплоотводом. Работает уже несколько месяцев без перерыва и проблем. Запитан от 5V (знаю, что должен работать от 3.3V)
Изображение
Теплоотвод примотан нитками (что было на тот момент под рукой).
Еще раз спасибо БОЛЬШОЕ Роману!!!!
Весь код выложу чуть позже (обязательно выложу).
Сегодня заканчивается рабочая неделя и ухожу на неделю на отдых.
Младший сын несколько дней назад защитил диплом электромеханика Морского госуниверситета.
Жизнь идет своим чередом, хотя время неумолимо....
Вот как то так.
С уважением ко всем ,прочитавшим это, Константин.

Добавлено after 4 hours 17 minutes 9 seconds:
Но вот под конец дня заметил очень интересный нюанс:
ближе к 17-00 часам мой модуль перестал подключаться к моему сайту по ip, хотя днем исправно слал все данные с периодичностью в несколько секунд.
Решил попробовать на arduino по ip переслать данные....
Ничего не вышло....
А когда указал в arduino доменное имя, то стало все работать.
Вот думаю, может быть в нашем сервере на предприятии стоят какие нибудь расписания?
Попробую завтра днем еще раз по ip подключится.

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

Вт авг 03, 2021 14:49:26

kondeg писал(а):Наконец то удалось отправить данные на мой реальный сайт (не локальный).

Показывайте Wireshark без фильтров. Чтоб видеть как всё работает))
ip сайта можно глянуть в командной строке через PING или через Wireshark или через браузер))

Зачем питать W5500 от 5V ? Он сгореть может))
Для W5500 теплоотвод не нужен. W5500 - это улучшенная версия Изернет модуля с низким потреблением.
По умолчанию PHY работает 100 МБит/c. При этом ток 3,3 V - 135 mA.
При переключении физики PHY на 10 МБит/c. Потребление меньше 3,3 V - 80 mA.
При этом W5500 совсем не греется (чуть тепленький).
Поэтому W5500 радиатор не нужен.

Это старым модулям нужен был радиатор... Всяким там W5100 и Enc28J60 и т.д. У них ток 3,3 V ~150...180 mA.
:tea:

Добавлено after 5 minutes 15 seconds:
к 17-00 часам мой модуль перестал подключаться к моему сайту по ip, хотя днем исправно слал все данные с периодичностью в несколько секунд.
Решил попробовать на arduino по ip переслать данные....
Ничего не вышло....
А когда указал в arduino доменное имя, то стало все работать.
Вот думаю, может быть в нашем сервере на предприятии стоят какие нибудь расписания?

Это что-то новенькое))
А в чём разница подключения по доменному имени и по IP ?
Разница в том, что по доменному имени работает протокол DNS, а по IP нет.
По доменному имени ардуино сначала отправляет DNS запрос на DNS сервер. А потом подключается к серверу.
А что там в вашем сервере на предприятии... знает только сисадмин вашего предприятия))
Хотя всё можно вычислить)) У нас же есть Wireshark ! ))
:tea:
Ответить