Newsgroup: it.comp.lang.visual-basic
Titolo: Come avere un delay preciso?

Ho un problema di comunicazione seriale fra due computer che sfruttano un
protocollo dedicato.
Il problema consiste nel fatto che dopo aver spedito una stringa di testo il
tempo in  millisecondi
necessari alla stringa per non essere troncata prima di abbassare la RTS non
sono stabili in un sistema
multitasking.
Ho provato con sistemi diversi come "timeGetSystemTime" o "GetTickCount" e
timer multimediali ma il problema
persiste se il computer non ha task attivi o ne ha pochi, il dalay creato si
mantiene quasi stabile, ma come viene
aperto un altro programma o si ridimensiona una finestra o c'è un processo
in background il delay varia anche del
100% del suo valore programmato.
Si riesce ad avere un timer stabile per creare un delay che non è
influenzato da fattori esterni, oppure si può creare un task
stabile per tale delay?
Grazie per il vostro aiuto.

 creare un task stabile per tale delay?
In un sistema multitasking preemptive per un'applicazione "normale"
questo è un problema.
Sicuramente dare una priorità più alta al processo e/o al thread ti
può aiutare ad avere tempi più precisi. Attenzione però agli effetti
negativi che ciò può avere su altre applicazioni.
Vedi:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dll
proc/prothred_9z1v.asp?frame=true
**** ATTENZIONE **** Il link è su due righe e va ricomposto.
Ciao.
--
BSD is for UNIX-lovers -- linux is for Windows-haters.

 proc/prothred_9z1v.asp?frame=true
Non lo so se bastera aumentare la priorità (si può fare una prova in
NT/2k/XP) sul task manager e vedere se funza, un mio vecchio progetto non
riusciva ad avere una "correttezza temporale" assoluta e son dovuto passare
ad una libreria in C (sarebbe meglio assebler).
Ciao
--
Timothy Redaelli

 Grazie per il vostro aiuto.
Sul sito comune c'era un timer più preciso... non so se può aiutarti...
--
Ciao,
Alessandro

multitasking.
Perchè riabbassi la RTS a tempo ?

 ha scritto nel messaggio
news:3c3af51f...@news.tiscalinet.it...

Hai un suggerimento migliore?

 ha scritto nel messaggio
news:3c3b361...@news.tiscalinet.it...

Il colloquio tra i due computer è del tipo:
il primo invia la richiesta
RTS=on
esc+richiesta+vbcr
RTS=off
e immediatamente l'altro risponde alla richiesta con dei dati
esc+risposta+vbcr
Dopo aver inviato la richiesta occorre attendere alcuni millisecondi prima
di abbassare la RTS
altrimenti abbiamo due situazioni
se l'attesa è troppo breve la stringa viene troncata e l'altro non può
rispondere perché non riconosce la richiesta
se l'attesa è troppo lunga ho errori di ricezione della risposta
Quindi tutto dipende da questo momento critico :
L'invio della richiesta e l'attesa per abbassare la RTS.

A me č capitato un lavoro del genere, allora lo puoi risolvere mettendo un
protocollino:
esempio:
definisci
const STX = &H02 'start trasmissione
const ETX = &H03 'end trasmissione
const ESC = &H1B 'escape code
poi il protocollo di trasmissione č
STX dato1 dato2 ... daton checksum ETX
dove se uno qualunque dei dati (checksum compreso) vale uno dei caratteri
"caldi" (cioč 2,3 o 27) ci metti prima un ESC e poi il dato complementato
(XOR con 255). Il checksum te lo puoi calcolare ad esempio facendo
0-dato1-dato2-...-daton e poi preleva l'ultimo byte.
Esempio: trasmissione di 10,20,2,15,3,30,40,27,50
invierai: STX, 10, 20, ESC, 253, 15, ESC, 252, 30, 40, ESC, 228, 59, ETX
dove 253 = 2 XOR 255
252 = 3 XOR 255
228 = 27 XOR 255
59 si ricava da 0-10-20-2-15-3-30-40-27-50 = -197 = &HFF3B che messo in AND
255 = &H3B = 59
in questo modo sei sicuro che ogni volta che il PC ricevente trova il
carattere ESC sa come deve trattare il dato successivo (cioč di nuovo con lo
XOR 255 per avere il dato originale), ma soprattutto sei sicuro che ogni
volta che ricevi il carattere di ETX hai effettivamente raggiunto la fine
della coda (dato che non ci puň essere un'altro dato pari a ETX=3 nel flusso
dati). Il programma sull'altro PC non deve far altro che considerare la
trasmissione iniziata solo quando riceve il carattere STX=2 (tanto altri non
ce ne possono essere) e considerare il dato valido (previo controllo del
checksum) sulla ricezione del carattere ETX e non sui segnali RTS e
compagnia bella (che in effetti per sincronizzarli...)
Io questo protocollo l'ho implementato nel dialogo tra un PC ed una scheda a
micro (e pure tra un palmare con WindowsCE e la medesima scheda), quindi non
ti dovrebbe essere difficile farlo per il dialogo tra due PC... E' un po'
piů di lavoro ma ti posso assicurare che ne vale veramente la pena ;-)
Ciao,
Valerio

altrimenti abbiamo due situazioni
Si si, ho capito il problema.
Ora, un metodo sicuramente semplice da realizzare è il seguente (senza
usare RTS):
1) Il computer1 invia un segnale al computer2 e si mette in attesa del
segnale di risposta dal computer2
2)Il computer2 dopo che ha ricevuto ed elaborato il segnale, invia la
risposta al computer 1.
Questo può essere un modo per risolvere il problema.
Dimmi se può essere sufficiente nel tuo caso.

 ha scritto nel messaggio
news:3c3dbab...@news.tiscalinet.it...

Io non posso intervenire sul programma dell'altro computer, del quale
conosco soltanto il protocollo di comunicazione
ed il fatto che usa la linea RTS.

 100% del suo valore programmato.
[SNIP]
Hai gia' provato con Sleep, come si dicena nell'analogo messaggio del
25/12/2001?
Ciao
--
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

ed il fatto che usa la linea RTS.
Chiamiamo computer2 quello che tu chiami "altro computer" e computer1
il computer su cui gira il TUO programma.
Se il computer2 RICEVE soltanto messaggi, nel senso che di suo non mi
deve inviare niente, se non msg di risposta ai msg del computer1,
allora puoi benissimo usare il metodo sopra descritto (completando
magari il protocollo con gli header e le terminazioni suggerite da
Valerio).
Se non gli imposti l'RTS il tutto non funziona ?
Sei sicuro di essere obbligato ad imposta l'RTS ?