Страница 1 из 1

LPC1768. Проблема с ethernet

Добавлено: Пн окт 22, 2012 15:17:12
brutal
Суть в следующем. Есть микроконтроллер LPC1768, который, используя DP83848C, посылает UDP-пакеты в ответ на пришедший от хоста UDP-пакет. Wireshark всё показывает как надо: есть ARP от хоста, есть ответ от микроконтроллера, затем есть UDP-пакет от хоста и есть ответный UDP-пакет от микроконтроллера. Однако, при попытке поймать этот ответный пакет в моей программе ничего не выходит. Функция recvfrom не возвращает пакет данных и завершается по таймауту... Кто с таким сталкивался? Подскажите, что за хрень... Почему сниффер видит пакет, а winsock нет?

P.S. На хосте установлена Windows XP

Re: LPC1768. Проблема с ethernet

Добавлено: Пн окт 22, 2012 17:07:15
oleg110592
Не сильный спец по этим вопросам. Делал связь микроконтроллера (сервер AVR+WIZ810) с планшетом на андроиде, было подобное пакеты видны снифером а не доходят. Помогла смена номера порта сервера.
Вопрос - плату на LPC1768 сами делали или покупная? Надо мне перевести проект с AVR на более мощный микроконтроллер. Собираю информацию.

Re: LPC1768. Проблема с ethernet

Добавлено: Пн окт 22, 2012 17:21:58
brutal
Сначала делал на отладочной плате EM-LPC1700, сейчас пересел на другую, сделанную на заводе.
К сожалению не помогла смена номера порта. Даже если ставить разные для контроллера и компа... Нет приёма через recvfrom. Выложу исходник программы, которая косячит. Может кто увидит проблему...

Код: Выделить всё

     WSADATA wsa;
     int eth_ok = 0;

     if ( WSAStartup(MAKEWORD(2, 0), &wsa) == 0 )
     {
          s = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP );

          unsigned long n = 2000;
          setsockopt( s, SOL_SOCKET, SO_RCVTIMEO, (const char*)&n, 4 );

          if ( s != INVALID_SOCKET )
          {
               SOCKADDR_IN sa;
               sa.sin_family      = AF_INET;
               sa.sin_port        = 0;
               sa.sin_addr.s_addr = ADDR_ANY;

               if ( bind(s, (SOCKADDR*)&sa, sizeof(SOCKADDR)) != 0 )
                    return;
          }
          else
               return;
     }
     else
          return;

     sa.sin_family      = AF_INET;
     sa.sin_port        = htons( 34085 );
     sa.sin_addr.s_addr = inet_addr( "192.168.0.112" );

     unsigned char  *buf;
     unsigned short *res;
     int  n, m, k, z;
     struct UOSHDR  *ptr;

     n   = sizeof( struct UOSHDR );
     buf = new unsigned char[ n ];
     ptr = (struct UOSHDR*) buf;
     m   = 6;
     res = new unsigned short[ m ];

     ptr->id   = id++;
     ptr->cmd  = 1;
     ptr->addr = 0;
     ptr->len  = 4;

     k = sendto( s, buf, n, 0, (SOCKADDR*)&sa, sizeof(SOCKADDR) );

     z = sizeof( SOCKADDR );
     ZeroMemory( &sa, z );

     k = recvfrom( s, (char*)res, m << 1, 0, (SOCKADDR*)&sa, &z );
     z=WSAGetLastError();

     delete[] buf;
     delete[] res;

     closesocket( s );
     WSACleanup();

Re: LPC1768. Проблема с ethernet

Добавлено: Пн окт 22, 2012 17:37:43
oleg110592
Спасибо. Еще б скромно посоветовал (мне очень помогло) написать на PC и клиент и проверить связь с хостом пока без микроконтроллера. Писал на джаве.

Re: LPC1768. Проблема с ethernet

Добавлено: Пн окт 22, 2012 17:44:01
urry
Проблема, конечно, видна - вы не обрабатываете коллбековские события и настраиваете, собственно, тоже неправильно. Я здесь целую оперу написал по этой теме.
http://kazus.ru/forums/showthread.php?t=39109&page=2

Re: LPC1768. Проблема с ethernet

Добавлено: Пн окт 22, 2012 20:44:00
brutal
urry писал(а):Проблема, конечно, видна - вы не обрабатываете коллбековские события и настраиваете, собственно, тоже неправильно
Если в строке

Код: Выделить всё

sa.sin_addr.s_addr = inet_addr( "192.168.0.112" );
заменить адрес на "127.0.0.1", то отправка и приём будут выполняться без нареканий.
Я прочитал вашу статью, но там описана работа с TCP-сокетами. У меня же реализован гораздо более простой UDP-протокол. Если вас не затруднит, то скажите что я неправильно настраиваю

Re: LPC1768. Проблема с ethernet

Добавлено: Пн окт 22, 2012 22:45:53
urry
Простите, предыдущий вариант неверный. Поправил под UDP

Re: LPC1768. Проблема с ethernet

Добавлено: Ср окт 24, 2012 22:38:42
brutal
не помогло. я уже даже сам накидал по мотивам ваших постов исходник работающий через wsaasyncselect и windows messages. закрадываются сомнения что вероятно проблема в приходящих udp-пакетах от микроконтроллера... но wireshark ошибок не находит и отображает все принятые от контролера udp-пакеты как корректные. фигня какая-то...

Re: LPC1768. Проблема с ethernet

Добавлено: Ср окт 24, 2012 23:13:31
urry
только что проверил на 2 соседних машинах - передача туда и обратно идет.
Посмотрите, может что с файерволом - добавить исключение на порт 34085, проверьте правильность установки своего айпишника и того, кому посылаете.
Код рабочий.

Re: LPC1768. Проблема с ethernet

Добавлено: Чт окт 25, 2012 08:56:55
brutal
Спасибо, urry, за помощь, вопросов к вашему коду нет - он работает и у меня на разных машинах.

Проблема была в UDP-пакете, который формируется микроконтроллером. Дело в том, что я не обнулял поле
контрольной суммы заголовка UDP. При этом, похоже, что windows пересчитывала КС и отбрасывала пакет =)
Сбил с толку меня тот факт, что wireshark никак не реагировал на неверную контрольную сумму, указанную в
заголовке UDP

Re: LPC1768. Проблема с ethernet

Добавлено: Пт май 24, 2013 17:22:20
urry
wireshark никак не реагировал на неверную контрольную сумму
А он и не будет реагировать - он забирает пакеты из карточки до того момента, как они выпрыгнут - а карточки формируют контрольную сумму самостоятельно - поэтому кс может не быть правильной. В хелпе по акуле это оговаривается.
ПС почему ответил только сейчас - недавно сам накололся....
:)