"Wiljan" <Wiljan@post8.tele.remove.dk> wrote in message news:<3fdf8ed3$0$9757$edfadb0f@dread14.news.tele.dk>...
> Hej
>
> Jeg har efterhånden lavet en del forskellige RS232 aplikationer og prøvet en
> del forskellige komponenter til Delphi.
> Der er dog et tilbage vendende problem når jeg skal modtage seriel data på
> en PC.
>
> De fleste komponenter kalder typisk en event on_recieve_data og så laver man
> (jeg) ofte en while data_count >0 og fylder et array med data og laver så
> dekodningen af data i arrayet med det samme og det virke langt hen af vejen.
>
> Men hvis der kommer en lang streng ind på com porten bliver on-recieve-data
> nogle gange brudt op i to kald og dermed er mit arryr jo ikke i orden når
> det bliver dekodet = dur ikke.
>
> Omvendt kan det også ske at der komme 2 data strenge hurttigt efter hinanden
> og dermed bliver den sidste streng ikke dekodet = dur ikke.
>
> Er her nogen der har en stump kode der vise hvordan man fylder recieved data
> i en buffer løbende og hvordan man så ved hvornår man skal dekode disse
> data?
>
> De stenge jeg modtager er typisk 7-10 bytes lange og skal tolkes som hex
> bytes og den første byte fortælle hvor mange bytes der kommer
>
> Venlig hilsen
>
> Wiljan
Du læser den første byte, og derefter X antal frem i bufferen når du
har brug for det... Ret simpelt.
Nu ved jeg ikke hvilke komponenter du bruger, men hvis du læser
direkte på porten (dvs gennem Windows API), ser det sådan ud:
function ReadSeri: String;
var
size: Word;
i: Word;
s: String;
begin
ReadFile(SeriHandle, s, 1, size, nil);
s:='';
ReadFile(SeriHandle, s, size, i, nil);
// her kan du evt. raise en exception eller noget hvis i<>size
// dette betyder at der ikke var nok data i bufferen.
// evt. kan du også vente - dette afhænger
result:=s;
end;
|