Newsgroup: it.comp.lang.delphi
Titolo: Problema Manipolazione Dati da seriale

Salve
Devo gestire dei dati acquisiti da una porta seriale; nello specifico si 
tratta di un palmare (modello DataLogic F732, se può esser d'aiuto) con 
caricato un semplice programma di acquisizione barcode+quantità.
Usando Async Pro ho risolto la cosa in maniera piuttosto semplice, abbinando 
all'evento OnTriggerAvail del TApdComPort il seguente codice:
 var
   Buffer: string;
   I: integer;
   C: String;
 begin
   for I := 1 to Count do begin
       if C in [#32..#126] then
         begin
         C := ApdComPort1.GetChar;
         Buffer := Buffer + C;
       end;
   end;
   Memo1.Lines.Add(Buffer);
end;
I dati vengono acquisiti correttamente.
Il problema - probabilmente banale - sta nel fatto che non riesco a far si 
che mi mostri i dati ricevuti su un unica linea di una componente Memo, ma 
mi mostra un carattere per riga, e questo rende poi problematica la 
manipolazione dei dati che dovrei fare; suppongo dipenda dal fatto che uso 
Add per passare i valori letti dalla seriale al Memo, ma con l'Append il 
risultato è identico, mentre se uso la proprietà Text mi mostra solo 
l'ultimo carattere, come se anzichè prendere tutto il buffer gli venisse 
passato solo l'ultimo carattere ... perchè?! 

 l'ultimo carattere
Infatti l'evento puo' tranquillamente essere scatenato dal singolo 
carettere, scommetterei che se provi a fare
--> Memo1.Lines.Add(Buffer+IntToStr(I))
vedresti che il ciclo esce sempre con il contatore ad 1;
La soluzione piu' semplice e brutale dovrebbe essere
--> Memo1.Text := Memo1.Text+Buffer;
Cosi' ti assicuri che il ritorno ci sara' solo se esiste nei dati, 
funziona a me su un programma simile che uso da anni, deve funzionare 
anche a te. :-)

 ha scritto nel messaggio 
news:d0mf32$1nk$1...@newsreader1.mclink.it...


 11/?5/?218?1?8?077?8?212?6111
Probabile che perda appunto qualcosa per strada mentre perde tempo ad 
aggiornare il memo.
Io non uso gli stessi tuoi componenti ma una libreria nostra quindi non 
saprei consigliarti una strada diversa.
Prova con il controllo di flusso hardware, oppure usare un buffer 
temporaneo dal quale aggiornare poi il memo dopo essere usciti dalla 
routine di ricezione o ancora usa thread separati.
Anche se mi pare assurdo perdere caratteri leggendo una seriale a 9600 
con una macchina moderna.
Per il debug della seriale ti posso consigliare Realterm, 
http://sourceforge.net/projects/realterm/
, che poi usa i componenti di 
TP quindi puoi anche trarne qualche utile spunto dai sorgenti.

 TP quindi puoi anche trarne qualche utile spunto dai sorgenti.
Guarda ti ringrazio molto per questo link, non ne conoscevo l'esistenza e
ora lo scarico: avere un'interfaccia grafica di log a volte puo' essere di
grande aiuto per comprendere in maniera sincrona cosa succede sulla porta.
Grazie,
ciao
-- 
Morde. 
M-List di icld: 
http://it.groups.yahoo.com/group/icld/

 ha scritto nel messaggio 
news:d0ngek$jji$1...@newsreader1.mclink.it...


 11/?5/?218?1?8?077?8?212?6111
Perche invece di mandare tutto al memo non lo mandi a una stringa e poi 
lo processi cercando il carattere #13 per dividere le varie linee??
penso che sarebbe piu immediato poi avere anche gia i dati suddivisi.

11/?5/?218?1?8?077?8?212?6111
penso che il problema derivi da fatto che una
TStrings(List) interpreta un accapo com una serie di
#13#10 e non solo come #13 che arriva dalla seriale ...
quindi ti interpreta male la decodifica Ascii dei vari
caratteri successivi al #13 un quanto è un carattere
non visualizzabile.
Ho tirato ad indovinare in quanto ho poca esperienza
... o meglio non ho trovato mai problemi.
	Ciao
	MassimoB
 
---------------------------
http://www.massimobeschi.it/