Problemy s komunikaci mezi Starterwarem a Indy UDP server

David Belohrad david na belohrad.ch
Čtvrtek Červen 19 09:44:14 CEST 2014


Nevim, jestli to tu uz neprobehlo:

- jiny software nez ta vase komponenta data prijima spravne? (zkuste
  napsat treba maly script v pythonu, ktery otevre socket, bude prijimat
  data a zobrazi je na terminalu [1]
- pokud ani python script nefunguje (= nedostava zadne data), je potreba
  se ujistit, zdali Vam funguji timery. lwip bez timeru nefunguje vubec
- pokud timery funguji, asi bych se podival na rozdil mezi tcp_write and
  tcp_output, nikdy jsem nepochopil, jak to poradne funguje, ale v
  zavislosti na tom, jak je odesilany paket dlouhy tcp_write nemusi nic
  poslat az do te doby nez (a) timer da timeout a tim padem lwip provede
  flush (b) se nasklada dostatecny pocet dat. Pokud mate male pakety a
  ty se neodeslou, podeziral bych, ze timer nefunguje spravne

Takhle mame zaintegrovany timeout timer my:


---- tohle nakonfiguruje preruseni pro lwip a zavola EthernetTcpTimerISR
void EthernetTcpTimerSetup(void)
{
  UARTPuts("\r\nTCP timer setting...", -1);

  // This function will enable clocks for the DMTimer7 instance
  DMTimer4ModuleClkConfig();

  // Registering DMTimerIsr
  IntRegister(SYS_INT_TINT4, EthernetTcpTimerISR);

  // Set the priority
  IntPrioritySet(SYS_INT_TINT4, 0, AINTC_HOSTINT_ROUTE_IRQ);

  // Enable the system interrupt
  IntSystemEnable(SYS_INT_TINT4);

  // Configure the DMTimer for Auto-reload and compare mode
  DMTimerModeConfigure(SOC_DMTIMER_4_REGS, DMTIMER_AUTORLD_NOCMP_ENABLE);

  // Set timer load value, it directly influences timer overflow frequncy
  DMTimerCounterSet(SOC_DMTIMER_4_REGS, TIMER_OVERFLOW - (200 * TIMER_1MS_COUNT));
  DMTimerReloadSet(SOC_DMTIMER_4_REGS, TIMER_OVERFLOW - (200 * TIMER_1MS_COUNT));

  // Enable the DMTimer interrupts
  DMTimerIntEnable(SOC_DMTIMER_4_REGS, DMTIMER_INT_OVF_EN_FLAG);

  // Start the DMTimer
  DMTimerEnable(SOC_DMTIMER_4_REGS);
}

---- tohle je ta prerusovaci rutina
void EthernetTcpTimerISR(void)
{
  tcp_tmr();

  // clear interrupt status flag
  DMTimerIntStatusClear(SOC_DMTIMER_4_REGS, DMTIMER_INT_OVF_IT_FLAG);
}


vsimnete si, ze v ni je *nutne* volat tcp_tmr(), ktery obsluhuje cely
lwip a potom zrusit flag preruseni.




[1] https://docs.python.org/2/howto/sockets.html



Pavel Hudeček <edizon na seznam.cz> writes:

> Dobrý den všem,
>
> (když už se tu chválí Ethernet, tak tady zase pro změnu problém)
>
> máme tu program psaný v C++ Builderu, který pomocí komponenty Indy UDP 
> Server má přijímat data, které posílá modul s ARM, na kterém je Starterware 
> s LwIP. Z nějakého záhadného důvodu ale komponenta takto odeslaná data 
> nepřijímá. Když stejná data odešlu z PC, problém nenastane. Na druhou 
> stranu, všechny možné testovací programy pro UDP co jsem zkoušel, data z 
> ARMu přijmou, včetně velmi starého programu ve VB98 s Winsockem v OCX.
>
> Nejraději bych použil nějakou jinou komponentu, ale všude všichni chválí 
> Indy Server a to i jako odpovědi na dotazy, jak použít jiné komponenty z 
> Builderu, takže se mi jiné rozchodit nepodařilo...


Další informace o konferenci Hw-list