/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
Seriel RS232 modtagelse
Fra : Wiljan


Dato : 17-12-03 00:02

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



 
 
Nicolai Hansen (17-12-2003)
Kommentar
Fra : Nicolai Hansen


Dato : 17-12-03 09:00

"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;

Wiljan (18-12-2003)
Kommentar
Fra : Wiljan


Dato : 18-12-03 09:38

Hej

Jeg har fået det til at fungerer med en global rx_buffer og en rx_index
pointer der viser hvor i bufferen ny data skal skrives og når jeg så bruger
noget fra bufferen roter jeg bufferen og dec mt index.

Tak for hjælpen

Wiljan



Søg
Reklame
Statistik
Spørgsmål : 177513
Tips : 31968
Nyheder : 719565
Indlæg : 6408602
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste