Att jämföra sträng på rätt sätt?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
newbadboy
Inlägg: 2426
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: Att jämföra sträng på rätt sätt?

Inlägg av newbadboy »

Hmmm 20 sätter bara maxlängd på strängen. 255 anger att man vill kontinuerligt läsa tills man hittar delimitern.

Jag har nu lagt till som ovan nämnt \n
Användarvisningsbild
Jan Almqvist
Inlägg: 1580
Blev medlem: 1 oktober 2013, 20:48:26
Ort: Orust

Re: Att jämföra sträng på rätt sätt?

Inlägg av Jan Almqvist »

Om prylar ska kommunicera med varandra skulle jag rekommendera att använda ett riktigt protokoll t.ex. Modbus RTU.
Användarvisningsbild
newbadboy
Inlägg: 2426
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: Att jämföra sträng på rätt sätt?

Inlägg av newbadboy »

Fast nu är det knappt kommunikation. Det är ju eg bara en trådlös trigger.
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4689
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: Att jämföra sträng på rätt sätt?

Inlägg av Swech »

Du kan inte anta att läsningen råkar starta på exakt korrekt tecken.

Det du skall göra är att endast läsa in tecken för tecken och spara dem
och så avslutar du med ett specialtecken t.ex carriage return eller Line feed

När du har hittat ett specialtecken så går du igenom de tecken du redan sparat för
att se om din sträng finns där och så startar processen om igen

Swech
Användarvisningsbild
newbadboy
Inlägg: 2426
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: Att jämföra sträng på rätt sätt?

Inlägg av newbadboy »

Swech.

Innan jag provar ditt förslag....

Har suttit och provat en massa grejer. Sändar chippet sände post varmed 5ms intervaller. Såg med min logik analysator att det hela tiden kom post\npost\n....5ms....post\npost\

Satte ner sändarintervallet till 500ms intervall istället och nu verkar överföringen funka om än lite långsammare vilket inte spelar ngn roll. Är det rimligt att jag helt enkelt skickat för och det kan ha gjort konstiga inläsningar??

Har provat med 100ms och det gick oxå
Användarvisningsbild
newbadboy
Inlägg: 2426
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: Att jämföra sträng på rätt sätt?

Inlägg av newbadboy »

Swech skrev:Du kan inte anta att läsningen råkar starta på exakt korrekt tecken.

Det du skall göra är att endast läsa in tecken för tecken och spara dem
och så avslutar du med ett specialtecken t.ex carriage return eller Line feed

När du har hittat ett specialtecken så går du igenom de tecken du redan sparat för
att se om din sträng finns där och så startar processen om igen

Swech

låter väldigt vettig iof
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4689
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: Att jämföra sträng på rätt sätt?

Inlägg av Swech »

i din recieve rutin så finns det delay upp till 0.9 sekunder
de tecken som då samtidigt kommer in till enheten tappar du bort
Att du då skall kunna hoppa in igen och råka träffa exakt rätt så
att du får "POST" igen är osannorlikt...
kanske "OSTP"
eller "TPOS"
eller "STPO"

Alla delay måste bort.

Swech
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45176
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Att jämföra sträng på rätt sätt?

Inlägg av TomasL »

Det enda vettiga för att få en någorlunda säker mottagning är att använda interrupt.
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Att jämföra sträng på rätt sätt?

Inlägg av Icecap »

Håller med TomasL, att förlita sig på annat är att gräva ner sig i förtid.
Jag har inte grävd mig ner i källkoden men det jag har sett är en katastrof.

Hela principet som är vald är fel till att börja med.
Mr Andersson
Inlägg: 1394
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: Att jämföra sträng på rätt sätt?

Inlägg av Mr Andersson »

Använd aldrig 255 som timeout till UARTx_Read_Text() om du inte kan garantera att du har oändligt med plats i output-bufferten. Det är att be om buffer overflows och korrupt minne. Timeout:en ska aldrig vara större än bufferutrymmet. Alternativt om du absolut måste ha en mottagarfunktion som kan blockera för evigt så bör du använda någon form av ringbuffer i kombination med en rx-interrupt.

För att hålla sig till ämnet, att jämföra strängar på "rätt" sätt; Ditt sätt med nästlade if-satser fungerar men det ser inte direkt snyggt ut. Använd strcmp eller ännu hellre memcmp då det handlar om strängar med känd längd. Dels så blir koden mycket mera lättläst, och sen så blir det lättare för kompilatorn att optimera koden både för hastighet (memcmp är extremt hårt optimerad i nästan alla standardbibliotek) och troligen också binärstorlek (alla jämförelser kan dela på samma memcmp istället för att det ska genereras en unik jämförelsesekvens för varje sträng).
Användarvisningsbild
newbadboy
Inlägg: 2426
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: Att jämföra sträng på rätt sätt?

Inlägg av newbadboy »

Jag ska def pula mer och försöka få till det mer driftsäkert. Måste dock erkänna att OM det funkar tillfredsställande i slutändan är jag nog lite för bekväm att skriva om för mycket. Det är ju en relativt enkel grej jag försöker åstadkomma och känner kanske att just i denna applikationen kan det räcka även om det eg är "fel" kodmässigt.

Ang det med att jag satt 255 som timeout. Det förklarar kanske varför jag fick en massa konstiga tecken men även hängningar.

Återkommer säkert med fler frågor.
Användarvisningsbild
newbadboy
Inlägg: 2426
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: Att jämföra sträng på rätt sätt?

Inlägg av newbadboy »

Swech skrev:i din recieve rutin så finns det delay upp till 0.9 sekunder
de tecken som då samtidigt kommer in till enheten tappar du bort
Att du då skall kunna hoppa in igen och råka träffa exakt rätt så
att du får "POST" igen är osannorlikt...
kanske "OSTP"
eller "TPOS"
eller "STPO"

Alla delay måste bort.

Swech
Ska fixas.
Användarvisningsbild
newbadboy
Inlägg: 2426
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: Att jämföra sträng på rätt sätt?

Inlägg av newbadboy »

TomasL skrev:Det enda vettiga för att få en någorlunda säker mottagning är att använda interrupt.
Kommer kolla upp hur detta funkar då jag antagligen kommer bygga grejer då det krävs mer noggrann överföring.
Användarvisningsbild
newbadboy
Inlägg: 2426
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: Att jämföra sträng på rätt sätt?

Inlägg av newbadboy »

Icecap skrev:Håller med TomasL, att förlita sig på annat är att gräva ner sig i förtid.
Jag har inte grävd mig ner i källkoden men det jag har sett är en katastrof.

Hela principet som är vald är fel till att börja med.
Katastrof för vissa, glädje för andra när de lyckas skicka ngt trådlöst för första gången även om ngt haltande :-)
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Att jämföra sträng på rätt sätt?

Inlägg av Icecap »

Jo, jag förstår det synpunkt, har själv varit där.
Men sådana moduler är inte olika en trådad förbindelse med glappkontakt varför man måste ta hänsyn till detta.

Och att ta on data på det viset du gör är snudd på katastrof - och det har inget med radio eller inte, det har med kommunikationen att göra.

Så interrupt är det enda vettiga alternativ.
Skriv svar