Pages: [1]   Go Down
Author Topic: EthernetServer/EthernetClient: tempo di lettura e acquisizione client.  (Read 427 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Buongiorno a tutti, sto lavorando da un po' ad un progetto (con Arduino Mega e Ethernet Shield rev3). Si tratta di un'applicazione che si interfaccia ad un pc, ed attalmente ho gestito due protocolli di comunicazione tra Arduino con un applicativo su PC: uno seriale e uno EthernetUDP.
Entrambi sono estrememamente fluidi e il codice gira in circa 2ms di loop......
Ho implementato anche un EthernetServer, quindi un ServerWeb all'interno di Arduino che è in grado di ricevere informazioni da un qualsiasi browser web di un qualsiasi dispositivo.....
Ho fatto i salti mortali per mantenere fluido il codice e girare in tempi molto stretti: addirittura quando invio la pagina al client invio una riga HTML ogni giro di loop....
Il sistema funziona, ma mi si ferma tutto per alcuni decimi di secondo appena arriva un pacchetto dati nella funzione "EthernetServer.available()"......
Ho tolto anche tutto il codice di gestione al di sotto di questo comando per esserne sicuro: se arriva un pacchetto dati, quando questa funzione lo intercetta, resta impegnata per un tempo abbastanza importante....
In realtà ho filtrato già il problema controllando l'EthernetServer solo quando non ho processi in corso che devo controllare RealTime, ma se qualcuno avesse una qualche idea su come risolvere una gestione di questo tipo in modo più elegante lo apprezzerei...

Grazie in anticipo per eventuali suggerimenti..
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2741
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Direi che è abbastanza normale che impieghi qualche istante quando arriva un pacchetto dal client.
Il tuo client.read() ti restituisce solo i byte del get o il post che invii, ma in realtà ad arduino arriva più che un pacchetto uno scatolone ri roba tipo questo

Code:
User-Agent: Mozilla/5.0 (Linux; U; Android 4.0.3; it-it; Sensation_Z710e Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30
Accept: text/plain, */*
Accept-Language: it-it,it;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Referer: http://192.168.1.177/file.htm
Content-Length: 35
Pragma: no-cache
Cache-Control: no-cache
code: 200
handler: la tua stringa on/off eccetera GET o POST.....

il tutto passa dalla libreria w5100 rifacendo poi il percorso inverso per dire al client "ho ricevuto" costruendolo un altro pacco per poi rinviarlo al client.
La differenza sta nel fatto che il pc legge in un istante il pacchetto e risponde in tempi brevissimi,ma arduino è un 16Mhz ci mette più tempo a leggere e rispondere, a mio parere ci puoi fare ben poco se non passare a un chip più veloce.

Posso chiedere perchè ti serve un tempo minore di 20-30 ms?

ciao
« Last Edit: February 07, 2013, 05:32:20 am by pablos » Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie per la risposta, (lo immaginavo, ma ci ho provato....)
mi serve un tempo così ristretto perchè sto muovendo dei motori in CC a piccoli step per regolare dei flussi di gas....
I movimenti di regolazione hanno tempi che partono dai 5ms a svariati secondi.....(con 5ms il motore reagisce... con meno di 5ms non fa a tempo a muoversi)
Quindi se durante un movimento che dovrebbe durare non più di 7 o 8 ms vengo fermato in un punto del processo è chiaro che perdo il controllo del flusso di gas...

Ciao e grazie

Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 102
Posts: 6537
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hai pensato di svicolare il WebServer dall'Arduino?
Nel senso che potresti programmare un PC, o un server su internet, per fungere da WebServer e inviare all'Arduino solo i dati di cui necessiti per le varie azioni.
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hai ragione, se collegassi un pc da usare come webserver ad Arduino funzionerebbe alla grande. Il problema è che il giochetto del webserver l'ho fatto appositamente per non costringere l'utente a collegare sempre un pc...
Comunque ho già gestito la lettura del server solo nei momenti in cui i motori sono fermi: in questo modo non rischio di aprire o chiudere troppo i gas, ma semplicemente parto leggermente in ritardo se arriva un comando dal server... Questo tipo di ritardo non comporta alcun tipo di problema è dunque una soluzione accettabile.... (Almeno credo: dovrà essere testato bene)

Ciao e grazie
Logged

Pages: [1]   Go Up
Jump to: