Newsgroup: it.comp.lang.visual-basic
Titolo: Mscomm.ocx

Sto impazzendo a leggere il buffer in entrata (win nt - dlephi C/S -
mscomm32.ocx), non riesco a capire il modo migliore di settare
RThreshold, SThreshold, ecc).
Se qualcuno puo' darmi una mano? grazie e saluti a tutta la mailing.
Leoanrdo
_________________________________________________________
DO YOU YAHOO!?
Get your free @
yahoo.com
 address at 
http://mail.yahoo.com
--
Automatic posted from 
send1e.yahoomail.com
 [205.180.60.64]
via Mailgate Server - 
http://www.mailgate.org

 Leoanrdo
Se non ricordo male:
SThreshold indica ogni quanti caratteri trasmessi viene scatenato l'evento
di OnComm.
E' raro che serva sapere quando un frame o un carattere e' stato realmente
trasmesso,
quindi io consiglio di metterlo a zero, ossia di disabilitarlo, ossia
MSComm.SThreshold=0
 
RThreshold indica ogni quanti caratteri ricevuti viene scatenato l'evento
di OnComm.
Io lo uso sempre e, secondo me, l'unico valore che ha senso e' uno, ossia
che venga
scatenato un evento di OnComm ad ogni ricezione di un carattere, ossia
MSComm.RThreshold=0
Hi, Ciao
Ettore         By -MES-

MSComm.RThreshold=0
Volevi dire RThreshold=1 ? Giusto?
Partendo dal presupposto che ho le impostazioni che tu mi hai dato,
ora ho il problema della lettura del buffer, es. se ho in entrata una
stringa molto lunga, circa 70 caratteri, non riesco a leggerle in
maniera coerente, cioe' la mia variabile d'appoggio si perde i primi
dati; ti propongo parte della mia procedura (delphi 3), modificata
svariate volte, e che ora tranne per questo handicap, va bene :
procedure TTotem.lettoreComm(Sender: TObject);
var { ATTESA risposta da LETTORE }
   letto_in : string;  { appoggio per il contenuto del buffer in
entrata }
   x : smallint;
   count_in : integer; { contatore del buffer in entrata }
begin
     letto_in:='';
     count_in:=lettore.inbuffercount;
     for x :=1 to count_in do begin
         letto_in:=letto_in+lettore.input;
     end;
 
Grazie a tutta la mailing da Leonardo
_________________________________________________________
DO YOU YAHOO!?
Get your free @
yahoo.com
 address at 
http://mail.yahoo.com
--
Automatic posted from 
send1d.yahoomail.com
 [205.180.60.48]


      end;
Ok, Confermo di non capirci nulla, o quasi.....
C'e' da fare due considerazione.
La prima e' che la proprieta' lettore.input e' una stringa
che contiene tutti i caratteri ricevuti sino a quel momento,
quindi non ha senso mettere in un loop la
riga: letto_in:=letto_in+lettore.input;
in pratica lettore.input rappresenta l'intero buffer di ricezione
ed una volta letto, si autoresetta (non si puo' leggere due volte).
La seconda considerazione e' che la variabile letto_in deve essere
una variabile statica (capisci il gergo C++) o globale dell'applicazione,
e deve funzionare come da buffer, ossia deve archiviare tutti i
caratteri ricevuti.
Ogni volta che appendi nuovi caratteri a questo buffer, controlli
se al suo interno e' riconoscibile un datagam (un messaggio iniziato
e finito), quando lo riconosci, lo estrai dal buffer e lo elabori,
lasciando nel buffer gli ultimi caratteri che per ora non
corrispondono ad un datagam completo.
Esempio: preparati che l'ho fatto molto incasinato.......
Supponiamo che il datagram inizia con '{' e finisce con '}',
Supponi che ricevi dei caratteri, li estrai e li metti nel
buffer, e ti metti ad analizzarlo, trovando quanto segue:
buffer contiene "spurio{001msg 1}{002msg due}{003m"
ti metti ad analizzare la stringa e ti accorgi che c'e' un
carattere '{' e dopo questo un carattere '}'.
Butti via tutto cio' che sta prima di '{' isoli la stringa
datagram "{001msg 1}", la elimini dal buffer e la analizzi.
A questo punto nel buffer ti ritrovi "{002msg due}{003m" e
ripeti l'analisi, trovando il datagram "{002msg due}", lo
elabori e continui con l'analisi del buffer che  a queso
punto contiene "{003m" in cui trovi lo start del datagram
'{' ma non lo stop '}'. Quindi aspetti altri eventi
di ricezione.
Provo a farti un esempio in VB, cosi' al volo,
spero di non sbagliare....
'--------------- INIZIO ESEMPIO -----------------------------
dim MioBuffer		as string
sub MSComm1_OnComm ()
	dim tmp$
	dim Datagram$
	dim PosStart%
	dim PosEnd%
	tmp$ = MSComm1.input
	' controllo che vi sia veramente qualcosa, non fa male, anzi...
	if len(tmp$)=0 then exit sub
	' Aggiungo i/il nuovo carattere in coda al buffer
	MioBuffer = MioBuffer + tmp$
	' un controllo per pararsi il sederino
	if len(MioBuffer) > 8096 then MioBuffer = right$(MioBuffer,8096)
	do
		Rifai:
		PosStart% = instr(MioBuffer,"{")
		if PosStart%=0 then exit do
		PosEnd% = instr(MioBuffer,"}")
		if PosEnd%=0 then exit do
		if PosStart%>PosEnd% then 	
			' qui qualcosa non va, ho perso dei dati, e mi riparo come posso
			MioBuffer = mid$(MioBuffer,PosStart%)  ' butto via tutto quello prima
del "{"
			Goto Rifai
		end if
		' Estraggo il Datagram
		Datagram$ = mid$(MioBuffer,PosStart%,PosEnd%-PosStart%+1)		
		' lo elimina dal buffer
		MioBuffer = mid$(MioBuffer,PosEnd%+1)
 
		'
		' QUI ELABORO IL MIO DATAGRAM
		'
		call ElaboraDatagram( Datagram$ )
	loop
end sub
'--------------- FINE ESEMPIO -----------------------------
Forse ho esagerato, ma con questo dovresti risolvere
i tuoi problemini.
A questo punto fammi sapere se tutto cio' ti e' tornato
utile e se hai altri problemini.
BUON LAVORO.
Hi,Ciao
Ettore             By -MES-