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

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Открыл глаза
Сообщения: 47
Зарегистрирован: Вс июн 10, 2012 22:43:19
Откуда: РФ, г. Курск

Сообщение brutal »

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

P.S. На хосте установлена Windows XP
Tais sa gueule et écoute un silence
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

Не сильный спец по этим вопросам. Делал связь микроконтроллера (сервер AVR+WIZ810) с планшетом на андроиде, было подобное пакеты видны снифером а не доходят. Помогла смена номера порта сервера.
Вопрос - плату на LPC1768 сами делали или покупная? Надо мне перевести проект с AVR на более мощный микроконтроллер. Собираю информацию.
Реклама
Открыл глаза
Сообщения: 47
Зарегистрирован: Вс июн 10, 2012 22:43:19
Откуда: РФ, г. Курск

Сообщение 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();
Последний раз редактировалось brutal Пн окт 22, 2012 17:50:15, всего редактировалось 1 раз.
Tais sa gueule et écoute un silence
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

Спасибо. Еще б скромно посоветовал (мне очень помогло) написать на PC и клиент и проверить связь с хостом пока без микроконтроллера. Писал на джаве.
Реклама
Эиком - электронные компоненты и радиодетали
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

Проблема, конечно, видна - вы не обрабатываете коллбековские события и настраиваете, собственно, тоже неправильно. Я здесь целую оперу написал по этой теме.
http://kazus.ru/forums/showthread.php?t=39109&page=2
Контактная информация:
Реклама
Открыл глаза
Сообщения: 47
Зарегистрирован: Вс июн 10, 2012 22:43:19
Откуда: РФ, г. Курск

Сообщение brutal »

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

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

sa.sin_addr.s_addr = inet_addr( "192.168.0.112" );
заменить адрес на "127.0.0.1", то отправка и приём будут выполняться без нареканий.
Я прочитал вашу статью, но там описана работа с TCP-сокетами. У меня же реализован гораздо более простой UDP-протокол. Если вас не затруднит, то скажите что я неправильно настраиваю
Tais sa gueule et écoute un silence
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

Простите, предыдущий вариант неверный. Поправил под UDP
Вложения
kot_connect.zip
(83.65 КБ) 227 скачиваний
Контактная информация:
Открыл глаза
Сообщения: 47
Зарегистрирован: Вс июн 10, 2012 22:43:19
Откуда: РФ, г. Курск

Сообщение brutal »

не помогло. я уже даже сам накидал по мотивам ваших постов исходник работающий через wsaasyncselect и windows messages. закрадываются сомнения что вероятно проблема в приходящих udp-пакетах от микроконтроллера... но wireshark ошибок не находит и отображает все принятые от контролера udp-пакеты как корректные. фигня какая-то...
Tais sa gueule et écoute un silence
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

только что проверил на 2 соседних машинах - передача туда и обратно идет.
Посмотрите, может что с файерволом - добавить исключение на порт 34085, проверьте правильность установки своего айпишника и того, кому посылаете.
Код рабочий.
Контактная информация:
Открыл глаза
Сообщения: 47
Зарегистрирован: Вс июн 10, 2012 22:43:19
Откуда: РФ, г. Курск

Сообщение brutal »

Спасибо, urry, за помощь, вопросов к вашему коду нет - он работает и у меня на разных машинах.

Проблема была в UDP-пакете, который формируется микроконтроллером. Дело в том, что я не обнулял поле
контрольной суммы заголовка UDP. При этом, похоже, что windows пересчитывала КС и отбрасывала пакет =)
Сбил с толку меня тот факт, что wireshark никак не реагировал на неверную контрольную сумму, указанную в
заголовке UDP
Tais sa gueule et écoute un silence
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

wireshark никак не реагировал на неверную контрольную сумму
А он и не будет реагировать - он забирает пакеты из карточки до того момента, как они выпрыгнут - а карточки формируют контрольную сумму самостоятельно - поэтому кс может не быть правильной. В хелпе по акуле это оговаривается.
ПС почему ответил только сейчас - недавно сам накололся....
:)
Контактная информация:
Ответить

Вернуться в «ARM»