Jump to content

    

Oleg_IT

Свой
  • Content Count

    936
  • Joined

  • Last visited

Everything posted by Oleg_IT


  1. Я свои байты вижу четыре раза в секунду. Может и копит, этот момент я пока не понимаю. Не понимаю тогда куда мне девать ошибку памяти? Если я два раза подряд отправляю пакеты, то второй раз выдаёт ошибку памяти. Не пойму пока куда смотреть чего проверять. Размерв буферов максимальные из рекомендации поставил.
  2. Буфер конечно не резиновый, но и о скорости 100500 я не говорю, первый же вызов tcp_write не дождавшись ответа, вызывает ошибку памяти и этот посланный пакет теряется. Из этого и сделал вывод, что «lwip, у меня, ни чего не копит» и на приёмной стороне номеров этих пакетов не получаю. По Qt. Можно и не очищать. Да всё так. В обработчике AddData у меня стоит сборщик кусков, в пакете синхронизатор включён, а сам пакет постоянной длины, сделал этот код сам, проверено, работает. Пришлось сделать этот код, кода начал получать два пакета одинаковой длины в двух пакетах разной длины, я это уже отмечал. Сделал на PC имитатор стороны ARM, скорости держит несколько килогерц, специально вводил разбиение пакетов, связка работает стабильно. Смотрел, информации по этим темам не много, пока чего-то туплю:)
  3. Еслиб это было так, lwip, у меня, ни чего не копит, в начале я говорил, что если посылать чаще, то пакеты теряются, подпрограмма tcp_write выдаёт ошибку памяти.
  4. Wireshark показывает Test1.JPG из приложения. IP …18 это модуль на ARM, …150 это PC с Windows XP. Получается, что тормоза идут от модуля. И откуда такие залипания, на 4 секунды, строки 36-37? Как в модуле проверить, что данные ушли в контроллёр изернет? Реестр поменял по рекомендации Sanya_kv Реестр.JPG из приложения. Результата не видно. Фрагмент кода приёмника void MainWindow::slotReadyRead() { if (m_pTcpSocket == NULL || m_pTcpSocket->isOpen() == false) return; slotSendToServer(); QByteArray dAll; dAll.clear(); dAll = m_pTcpSocket->readAll(); SizeAll = dAll.count(); if (AddData(dAll.data(),SizeAll,(uint8_t*)m_Data.Data) == true) WidgetMain->DrawGr(); } void MainWindow::slotSendToServer() { if (m_pTcpSocket == NULL || m_pTcpSocket->isOpen() == false) return; GetControlToModul(m_ControlToModul); m_pTcpSocket->write((const char*)&m_ControlToModul,sizeof(ControlToModul)); } GetControlToModul(…) заполняет передаваемую структуру. AddData(...) обработка принятых данных, сейчас только извлечения номера посылки, который приходит из модуля.
  5. По моей ссылки кода нет, там теория TCP для новичков. Проект на PC достаточно большой, приёмная часть это класс QTcpSocket и его окружение из примера. Обработка пока вообще ни какая, просто беру и вывожу номер пакета, а пвкет это те самые 512 байт. По поводу двух пакетов, заметил, что lwip собирает два павкета, не всегда, но часто и передаёт их в двух пакетах, но с другими длиними, 588 и 436 байт. Увеличивал и уменьшал объём передаваемых данных в два раза, результат тотже.
  6. Чем TCP от UDP отличается я знаю, это так к сведению:) Для уточнений можно, например сюда обратится https://electronix.ru/forum/index.php?showtopic=115578 , там и на стандарты ссылки есть. На приемной стороне, т.е. на РС стоит Qt-шная программа с кодом приёма передачи из её, Qt родного примера, обработка полученного массива данных и генерация передаваемых данных естественно свои, с начало передача ответа, потом обработка.
  7. Да, не уточнил у меня TCP. По буферам посмотрю, но со временем и они забьются. Auto Negotiation возвращает 10 Мбит.
  8. Проект сгенерил в STM32Cube. Работает нормально. Возникла необходимо увеличить скорость передачи, данные 512 байт, очередную порцию передаю по приходу ответа с принимающей стороны. Скорость получается всего 4 Гц да ещё с периодическим замиранием секунды на две, три. Если игнорировать сообщение о получении данных и слать чаще, то возникает ошибка памяти и пакеты теряются. Как ускорить передачу? Приемная сторона или 100 Мбит или 1Гбит (пробую на двух компах), ARM автоматом определяет 10 Мб, если при генерации проекта ставлю 100 Мбит картина не меняется.
  9. Похоже проблема с памятью, лог файл в приложении, там три варианта с разными установками по объёму памяти, последний с 2048 байт. Не помогает. Не могу понять что вызывает проблему. lwip_err.txt
  10. Похоже модуль(сервер) совсем не реагирует на запросы клиента. Один раз в модуле вызывается функция ошибки с кодом ERR_ABRT или ERR_RST.
  11. Модулю с STM32F4, использую lwip, с её функциями инициализации и передачи. Данные передаются нормально, но после нескольких обменов обмен останавливается, картинка в приложении, сбойные пакеты выводится черным цветом. После нескольких сбойных пакетов связь закрывается. Ни на стороне PC ни на стороне STM ошибок не возникает, только сообщение о разрыве соединения. Скорость отсылки пакетов низкая, по таймеру снижал до одного в секунду. Что за ошибка, как исправить?
  12. Я собственно этим и занимаюсь сейчас, лезу внутрь библиотеки, смотрю как оно там работает. А Куб, повторюсь, использую только для начального конфигурирования Есть у меня желание найти рабочий пример, такой как для LPC - LEDClient, с ним у меня сходу всё получилось. Нет на сервере странички по ссылке:(
  13. Вы предлагаете самому переписать lwip или ...?
  14. Большой кусок инициализации lwip строит STM32CubeMX, там все вызовы lwip_init() netif_add, ... sys_check_timeouts(), ethernetif_input() включены в MX_LWIP_Process(); С логами разберусь, надеюсь поможет.
  15. Собрал простую программу на STM32CubeMX с ETH и LWIP. Пытаюсь установить соединение, как показано в примерах err_t tcp_recv_cb(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err) { return ERR_OK; } void tcp_err_cb(void *arg, err_t err) { Err = err; arg_ = arg; } err_t tcp_poll_cb(void *arg, struct tcp_pcb *tpcb) { return ERR_OK; } err_t tcp_accept_cb(void *arg, struct tcp_pcb *newpcb, err_t err) { tcp_arg(tcp_pcb_, tcp_pcb_); tcp_recv(tcp_pcb_,tcp_recv_cb); tcp_err(tcp_pcb_,tcp_err_cb); tcp_poll(tcp_pcb_, tcp_poll_cb, 10); return ERR_OK; } err_t tcp_connected_cb(void *arg, struct tcp_pcb *tpcb, err_t err) { return ERR_OK; } ………………………………………………………………… To_IP_ADDRESS[0] = 169; To_IP_ADDRESS[1] = 254; To_IP_ADDRESS[2] = 248; To_IP_ADDRESS[3] = 45; My_IP_ADDRESS[0] = 169; My_IP_ADDRESS[1] = 254; My_IP_ADDRESS[2] = 61; My_IP_ADDRESS[3] = 18; IP4_ADDR(&To_ipaddr, To_IP_ADDRESS[0], To_IP_ADDRESS[1], To_IP_ADDRESS[2], To_IP_ADDRESS[3]); IP4_ADDR(&My_ipaddr, My_IP_ADDRESS[0], My_IP_ADDRESS[1], My_IP_ADDRESS[2], My_IP_ADDRESS[3]); tcp_pcb_ = tcp_new(); tcp_setprio(tcp_pcb_,TCP_PRIO_NORMAL); Err = tcp_bind(tcp_pcb_,&My_ipaddr,2323); tcp_accept(tcp_pcb_,tcp_accept_cb); Err = tcp_connect(tcp_pcb_,&To_ipaddr,2324,tcp_connected_cb); while (1) { /* USER CODE END WHILE */ MX_LWIP_Process(); /* USER CODE BEGIN 3 */ } Результат смотрю и в Wireshark и в дебагере. Ни какая колбек функция не вызывается. ARP запрос и, соответствующий ответ поступают в Wireshark в тот момент, когда в программе на модуле соединение закрывается, tcp_pcb_.state равно CLOSED. Принимающая программа запущена, она работала с модулем на LPC с TCP_ARM_L.lib. Все примеры, которые я нашёл это или эхо клиент, сервер или протоколы высокого уровня, а мне нужно просто гонять бинарные буфера между модулем и компьютером. Помогите поднять соединение.
  16. Не мой случай, это прерывание возникает только один раз за период обмена, проверено.
  17. Не правильно, но работает. Почему прерывание раньше происходит так и не понял, может так задумано.
  18. Заметил особенность, при увеличении BaudRatePrescaler общее время приёма растёт быстрее чем время нахождения CS в открытом состоянии, т.е. при BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2(4, 8, 16) приём укладывается в CS == 0, а когда BaudRatePrescaler больше, приём обрезается. Похоже DMA живёт отдельно от SPI. CS аппаратный не подходит, для каждого девайса у меня он свой. Теорию SPI я знаю, но сейчас не в ней проблема.
  19. Да ни какого парадокса, просто экономия времени и можно посмотреть как люди программы пишут, если опыта мало. А с DMA пока не пойму. в прерывания он входит только с HAL_DMA_STATE_READY_MEM0, сконфигурил я его так. Я вот думаю, может в SPI флаг окончания приёма контролировать, в основном цикле и когда прерывание от DMA пришло. Кривовато это как-то.
  20. А что таково в нём плохого? Открытый код делает, что не нравится можно менять, дорабатывать, знать бы что, где.
  21. Я так и делаю, у меня пока один девайс с одной линией SO и с Full-Duplex Master не работает. Наверное придётся переключать Full-Duplex Master <-> Receive Only Msster <-> Transmit Only Msster
  22. Так не получается. Проект генерю из STM32CubeMx. Пока работаю только с датчиком температуры, подключены SO, SCK и CS. Если конфигурить SPI как Full-Duplex Master то программа виснет на чтении данных, если как Receive Only Msster то данные идут, но не полностью. SPI сконфигурю с DMA, когда наступает момент чтения температуры вызываю функции uint16_t Temp; // Значение измеренной температуры ………………………………………………… HAL_GPIO_WritePin(GPIOA,CS_Termo_Pin,GPIO_PIN_RESET); HAL_SPI_Receive_DMA(&hspi1,(uint8_t*)&Temp,2); По окончанию работы DMA вызывается прерывание со статусом HAL_DMA_STATE_READY_MEM0, поднимаю пин CS HAL_GPIO_WritePin(GPIOA,CS_Termo_Pin,GPIO_PIN_SET); Но по осциллографу вижу, что CS отключает датчик температуры ровно посередине второго байта. Соответственно первый байт приходит, видно он меняется, второго байта нет. Почему так может быть? В какой момент отключать CS? Как правильно работать с несколькими девайсами ни одном SPI? Нужно и одно чтение и одна запись и Full-Duplex Master для третьего девайса.
  23. Сохранять нужно не более 10 байт, и очень редко, скорей всего при настройке. Чего-то про встроенный флешь не подумал.
  24. Модуль готовый, программа моя. То что программа загружается в ОЗУ это понятно. Есть библиотека или примеры как в NAND записать/прочитать байт?