Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Wiznet 5100 UDP проблемма с SEND
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Danis
Работаю с микросхемой WIZnet5100, возникла проблема с передачей UDP пакетов.
Бесконечно передаю UDP пакеты с WIZnet5100 в сервер запушенный на ПК с небольшими интервалами времени. До сервера доходят только первые два пакета, остальные, похоже, даже не отправляются. Прием UDP на WIZnet без проблем. С TCP работает все нормально, не могу разобраться в чем может быть причина в UDP? Может кто сталкивался, помогите пожалуйста…
swf
Тоже были проблемы с отправкой UDP на W5100.
Смотри во вложении, "W3100A errata sheet v1.0"
На 5100 та же фигня оказалась...

Помогло использование функции отправки датаграммы на известный MAC адрес.
А при ошибке отправки датаграммы - переоткрытие сокета.
Но на практике получилось, что если отправлять по MAC адресу датаграммы, то сокет часто переоткрывать не приходится.

То есть такой принцип:

Своя ARP таблица.
При первой успешной отправке датаграммы добавляем MAC получателя в ARP таблицу, и в следующий раз используется функция отправки на известный MAC адрес.
CODE
if( arp_GetMac( p_dest_ip, dest_mac ) )
{
// отправка по MAC адресу (без ARP запроса)
u16 send_res = sendto_mac( wzn_id, sock_id, p_msg_data + p_msg_header->bytes_sent, bytes_to_send, p_dest_ip, p_msg_header->dest_port, dest_mac );
if( send_res == 0 )
{
// ошибка отправки датаграммы!
// переоткрываем сокет
close( wzn_id, sock_id );
socket( wzn_id, sock_id, Sn_MR_UDP, g_socket[ii].src_port, 0 );
}
else
{
// отправка с определением MAC адреса, в случае успеха обновляем ARP таблицу
if( sendto( wzn_id, sock_id, p_msg_data + p_msg_header->bytes_sent, bytes_to_send, p_dest_ip, p_msg_header->dest_port ) == bytes_to_send )
{
get_dst_mac( wzn_id, sock_id, dest_mac );
arp_Update( p_dest_ip, dest_mac );
}
else
{
// ошибка отправки датаграммы!
// переоткрываем сокет
close( wzn_id, sock_id );
socket( wzn_id, sock_id, Sn_MR_UDP, g_socket[ii].src_port, 0 );
}
}


ну и функция определения MAC адреса получателя (при успешной отправке датаграммы)

CODE
void get_dst_mac( u8 WZN_CS, SOCKET s, u8* mac )
{
mac[0] = IINCHIP_READ(WZN_CS, (Sn_DHAR0(s) + 0));
mac[1] = IINCHIP_READ(WZN_CS, (Sn_DHAR0(s) + 1));
mac[2] = IINCHIP_READ(WZN_CS, (Sn_DHAR0(s) + 2));
mac[3] = IINCHIP_READ(WZN_CS, (Sn_DHAR0(s) + 3));
mac[4] = IINCHIP_READ(WZN_CS, (Sn_DHAR0(s) + 4));
mac[5] = IINCHIP_READ(WZN_CS, (Sn_DHAR0(s) + 5));
}


А вообще, если данные не часто отправляешь, я бы посоветовал перед каждой отправкой переоткрывать сокет. И всё будет гуд :-)
Danis
Спасибо, Я попробовал Ваши рекомендации, но к сожалению так и ничего не получилось.

В W3150A+/W5100 Errata Sheet Ver 2.0.0 (SEP 10, 2008) написано, что можно решить проблему контролируя вывод RXLED, так и сделал, но и это не помогло, по прежнему передаются только первые 2 UDP пакета и все.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.