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