Перейти к содержанию

realqwerty

Участник
  • Публикаций

    17
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о realqwerty

  • Звание
    Участник

Посетители профиля

368 просмотров профиля
  1. lwIp tcp клиент для STM32

    сделал с использованием сокетов, получилось неожиданно легко, где будут грабли?
  2. lwIp tcp клиент для STM32

    а на халяву не прокатит: "тут" поставить очистку буфера, а "тут" отключение соединения?
  3. lwIp tcp клиент для STM32

    имеется сервер TCP, который на запрос клиента "M\r" отправляет два сообщения: 1. "ОК\r" 2. "какое-то значение\r" имеется отладка stm32f746g-disco и пример "LwIP_TCP_Echo_Client" из набора STM32Cube. работает замечательно, за исключением одного, не принимает сообщение №2. т.е. после приема первого сообщения соединение закрывается. err_t tcp_echoclient_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err) { struct echoclient *es; err_t ret_err; LWIP_ASSERT("arg != NULL", arg != NULL); es = (struct echoclient *)arg; /* if we receive an empty tcp frame from server => close connection */ if (p == NULL) { /* remote host closed connection */ es->state = ES_CLOSING; if (es->p_tx == NULL) { /* we're done sending, close connection */ tcp_echoclient_connection_close(tpcb, es); } else { /* send remaining data*/ tcp_echoclient_send(tpcb, es); } ret_err = ERR_OK; } /* else : a non empty frame was received from echo server but for some reason err != ERR_OK */ else if (err != ERR_OK) { /* free received pbuf*/ if (p != NULL) { pbuf_free(p); } ret_err = err; } else if (es->state == ES_CONNECTED) { /* increment message count */ message_count++; /* Acknowledge data reception */ tcp_recved(tpcb, p->tot_len); es->p_tx = p; char strmr[20] = ""; strncpy(strmr, es->p_tx->payload, es->p_tx->len); // здесь считали сообщение printf("%d %s\n", message_count, strmr); pbuf_free(p); tcp_echoclient_connection_close(tpcb, es); // соединение закрывается ret_err = ERR_OK; } /* data received when connection already closed */ else { /* Acknowledge data reception */ tcp_recved(tpcb, p->tot_len); /* free pbuf and do nothing */ pbuf_free(p); ret_err = ERR_OK; } return ret_err; } если соединение закрывать после второго сообщения, else if(es->state == ES_CONNECTED) { /* increment message count */ message_count++; /* Acknowledge data reception */ tcp_recved(tpcb, p->tot_len); es->p_tx = p; char strmr[20] = ""; strncpy (strmr,es->p_tx->payload,es->p_tx->len); //strmr[es->p_tx->len] = '\r'; printf ("%d %s\n", message_count, strmr); if (strncmp(strmr, "OK", 2) == 0) { pbuf_free(p); } else { pbuf_free(p); tcp_echoclient_connection_close(tpcb, es); } ret_err = ERR_OK; } то происходит переполнение буфера и ... 1 OK 2 4680235013820 3 OK 4 4680235013820 5 OK 6 4680235013820 7 OK 8 4680235013820 9 OK 10 4680235013820 11 OK Assertion "pbuf_free: p->ref > 0" failed at line 747 in ../Middlewares/Third_Party/LwIP/src/core/pbuf.c Assertion "mem_free: legal memory" failed at line 430 in ../Middlewares/Third_Party/LwIP/src/core/mem.c Assertion "pbuf_free: p->ref > 0" failed at line 747 in ../Middlewares/Third_Party/LwIP/src/core/pbuf.c Assertion "tcp_write: arg == NULL (programmer violates API)" failed at line 401 in ../Middlewares/Third_Party/LwIP/src/core/tcp_out.c Assertion "tcp_write: arg == NULL (programmer violates API)" failed at line 401 in ../Middlewares/Third_Party/LwIP/src/core/tcp_out.c 12 ER :smile3046: попробовал с компьютера в visual studio написать запрос 187 - запрос "M\r" 192 - ответ "OK\r" 198 - ответ "4680235013820" подскажите пожалуйста как правильно организовать прием второго пакета
  4. нет, ограничений нету, моя семантическая ошибка, все работает.
  5. имеется три сервопривода дельта подключенные по CAN, адаптировал Canopennode, уткнулся в проблему как увеличить количество RPDO и TPDO в Canopennode? через Object_Dictionary_Editor устанавливаю количество более 5 RPDO и 5 TPDO и при запуске в CO_OD_RAM.errorRegister появляется ошибка CO_ERR_REG_COMM_ERR = 0x10U, /**< bit 4, communication error (overrun, error state) */ хотя 5+5 работает нормально.
  6. STM32F429IDISCOVERY + LCD 800x480 + STemWin

    похоже много памяти выделялось для GUI уменьшил до 1024 * 120 и заработало CODE// // Define the available number of bytes available for the GUI // #define GUI_NUMBYTES (1024 * 120) // x KByte Цитата(aaarrr @ Mar 1 2014, 11:19) Проверьте корректость карты памяти МК в .scat файле. И .map на предмет запросов. в .map умрешь разбираться, спасибо за подсказку
  7. STM32F429IDISCOVERY + LCD 800x480 + STemWin

    я вижу по ошибкам что ее не хватает. только почему в объемном примере STemWin_SampleDemo с десятком окон с памятью все нормально, а для вывода HelloWorld ее не достаточно? наверное где-то проблемы с распределением памяти, только где?
  8. прикрутил tft lcd 800x480 к отладке STM32F429IDISCOVERY, все вроде настроил, дисплей работает, простенькие примеры отображает. ide Keil. пытаюсь "прикрутить" STemWim используя примеры из библиотек (STM32F429I-Discovery_FW_V1.0.1), на родном разрешении 240*320 все работает, как только меняю на 800*480 keil при компоновке выдает ошибки .\STM32F429I-Discovery_Demo\STM32F429I-Discovery_Demo.axf: Error: L6406E: No space in execution regions with .ANY selector matching guidrv_stm32f429i_discovery.o(.bss). .\STM32F429I-Discovery_Demo\STM32F429I-Discovery_Demo.axf: Error: L6407E: Sections of aggregate size 0x9600 bytes could not fit into .ANY selector(s). скачал STM32Cube_FW_F4_V1.0.0 пример STemWin_SampleDemo работает замечательно, а пример STemWin_HelloWorld опять ругается STM32F429I_DISCO_MB1075\STM32F429I_DISCO_MB1075.axf: Error: L6406E: No space in execution regions with .ANY selector matching startup_stm32f429xx.o(STACK). STM32F429I_DISCO_MB1075\STM32F429I_DISCO_MB1075.axf: Error: L6407E: Sections of aggregate size 0x2000 bytes could not fit into .ANY selector(s). кто может разбирался, подскажите что не так?
  9. Цитата(AlexeyW @ Nov 14 2010, 02:08) так я Вам пару сообщений выше написал принцип для синуса. Возможно, он применим даже в Вашей схеме, нужно только добавить генератор синуса нужной частоты и завести на ОС спасибо, будем искать
  10. частота коммутации - это кол-во включений транзистора? так оно и так в районе 10-50 кГц, а частота вибрации электромагнита должна регулироваться в районе 40-60 Гц. а вот для решений по синусу вообще ничего не видел в сети, подскажите где почитать спасибо.
  11. спасибо, дерзаю, но все таки интересно узнать (почитать) о преимуществах и недостатках различных схем включения силовых элементов, может поделитесь ссылкой?
  12. индуктивность у магнита я даже честно не знаю, сейчас работает одна схема (типовая схема включения IR2101) там выдаются прямоугольные импульсы с "заполнением" для ограничения протекающего тока, интересно было бы попробовать с имитацией полуволны синусоиды и регулировкой амплитуды и частоты.
  13. прошу прощения, а наверно некорректно выражаюсь: с выбором силового элемента проблем нет, есть проблема (в виду недостаточного незнания основ) с выбором самой схемы включения этого силового элемента, т.е. транзистор(ы) м.б. включен "нижним ключом", "верхним ключом", "нижним + верхним ключом", мостом и полумостом, так вот я пытаюсь понять почему люди применяют все эти разные схемы и какая именно мне нужна?
  14. вот именно, у меня ток маленький, около 1А, может чуть больше. а чопперы (которые видел в инете) начиная от 30А, да и дорогие они и в нашей глуши не достанешь.
  15. может и чоппер, тока у них токи великоваты, вроде как бы хотелось обойтись MOSFET-ом или IGBT. я вот только схему не знаю как выбрать, весь инет облазил, никаких рекомендаций не нашел. вроде самый простой "нижний ключ"? а может у него какие недостатки?