/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Optimering af lille kode?
Fra : Lasse Madsen


Dato : 27-08-04 23:30

Hej jeg har et spørgsmål om optimering af kode ...

Jeg sender kommandoen AT(CR)(LF) ud på seriel porten og forventer at modtage
enten OK(CR)(LF) eller ERROR(CR)(LF)
og min funktion gsm_at() skal så retunere enten 1 for OK 0 for ERROR eller
noget andet for time out... (softwaren må ikke låse)

Jeg har en seriel port med en modtage buffer på 255 bytes (det er en
cirkulær buffer) og bruger i dag denne kode til det men der findes
garanteret en super smartere måde at gøre det på og den vil jeg gerne se for
jeg syntes denne er lidt amatør agtig

extern unsigned char rx_buffer[255];
unsigned char gsm_at ( void )
{
unsigned int at_a=0,at_b=0;
for ( at_a = 0 ; at_a < 255 ; at_a++ ) rx_buffer[at_a]=0; // nulstil min
modtage buffer
at_a=0; // nulstil variablen igen...
printf("AT%c",0x0D); // send kommandoen til modemet...

while ( at_a < 10000 )
{
for ( at_b = 0 ;at_b < 250 ; at_b++ ) // løk kun til 249+4 for at undgå
buffer overflow
{
if ( rx_buffer[at_b]=='O' && rx_buffer[at_b+1]=='K' ) return 1;
if ( rx_buffer[at_b]=='E' && rx_buffer[at_b+1]=='R'&&
rx_buffer[at_b+2]=='R' \
&& rx_buffer[at_b+3]=='O'&& rx_buffer[at_b+4]=='R' ) return 0;
}
at_a++;
}
return 3; // Timeout ...
}

Nogen bud ?

M.v.h.
Lasse Madsen



 
 
Bertel Brander (28-08-2004)
Kommentar
Fra : Bertel Brander


Dato : 28-08-04 00:05

Lasse Madsen wrote:
> Hej jeg har et spørgsmål om optimering af kode ...
>
> Jeg sender kommandoen AT(CR)(LF) ud på seriel porten og forventer at modtage
> enten OK(CR)(LF) eller ERROR(CR)(LF)
> og min funktion gsm_at() skal så retunere enten 1 for OK 0 for ERROR eller
> noget andet for time out... (softwaren må ikke låse)
>
> Jeg har en seriel port med en modtage buffer på 255 bytes (det er en
> cirkulær buffer) og bruger i dag denne kode til det men der findes
> garanteret en super smartere måde at gøre det på og den vil jeg gerne se for
> jeg syntes denne er lidt amatør agtig
>

Man kunne overveje at bruge memset til at nullstille bufferen.
Man kan også overveje at bruge strncmp isf. if( ... && ... )
Man kunne også overveje at lave at_a og at_b om til
unsigned char's, hvis disse er 8 bit og lave rx_buffer
på 256 chars, så wrapper at_a og at_b selv om.
Man kunne også overveje kun at checke på modtagne karakterer og
ikke loope bufferen over igen og igen.
Hvis man kun forventer "OK" eller "ERROR" kunne man sætte sig til
vente på disse og smide alt andet over bord.
Man bør måske også overveje om telefonen kunne finde på at svarre
Ok.

--
What's in a name?
That which we call a rose by any other name would smell as sweet.
- Juliet

Lasse Madsen (28-08-2004)
Kommentar
Fra : Lasse Madsen


Dato : 28-08-04 13:29

Hej Bertel

Tak for dit input især med wrapping det havde jeg ikke tænkt på ... så
simpelt og alligevel så smart og det sparer en ufattelig masse tjek og
kontrol rundt omkring i min kode hehe, takker !

m.v.h.
lasse madsen



Soren Kuula (29-08-2004)
Kommentar
Fra : Soren Kuula


Dato : 29-08-04 15:48

Lasse Madsen wrote:
> Hej Bertel
>
> Tak for dit input især med wrapping det havde jeg ikke tænkt på ... så
> simpelt og alligevel så smart og det sparer en ufattelig masse tjek og
> kontrol rundt omkring i min kode hehe, takker !

Måske ådan (pseudo C) :

enum pladder {
OK,
ERROR,
DUNNO
};

int testsvar(.... *port)
{
char *ok = "OK"; char* err = "ERROR";

int okp = 0, erp = 0;

int t = 10000000;

int in;

while (t--) {
in = fgetc(port);

if (in < 0) continue; // ingen tegn ankommet

if (in == ok[okp]) okp++; else okp = 0;
if (okp == 3) return OK;

if (in == err[erp]) erp++; else erp = 0;
if (erp == 5) return ERROR;
}

return DUNNO
}


eller sådan noget ...

MVH
Søren


Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409076
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste