Att jämföra sträng på rätt sätt?
Re: Att jämföra sträng på rätt sätt?
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
Jag har nu lagt till som ovan nämnt \n
- Jan Almqvist
- Inlägg: 1598
- Blev medlem: 1 oktober 2013, 20:48:26
- Ort: Orust
Re: Att jämföra sträng på rätt sätt?
Om prylar ska kommunicera med varandra skulle jag rekommendera att använda ett riktigt protokoll t.ex. Modbus RTU.
Re: Att jämföra sträng på rätt sätt?
Fast nu är det knappt kommunikation. Det är ju eg bara en trådlös trigger.
- Swech
- EF Sponsor
- Inlägg: 4702
- 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?
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
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
Re: Att jämföra sträng på rätt sätt?
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å
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å
Re: Att jämföra sträng på rätt sätt?
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
- Swech
- EF Sponsor
- Inlägg: 4702
- 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?
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
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
Re: Att jämföra sträng på rätt sätt?
Det enda vettiga för att få en någorlunda säker mottagning är att använda interrupt.
Re: Att jämföra sträng på rätt sätt?
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.
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.
-
- Inlägg: 1400
- Blev medlem: 29 januari 2011, 21:06:30
- Ort: Lapplandet
Re: Att jämföra sträng på rätt sätt?
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).
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).
Re: Att jämföra sträng på rätt sätt?
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.
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.
Re: Att jämföra sträng på rätt sätt?
Ska fixas.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
Re: Att jämföra sträng på rätt sätt?
Kommer kolla upp hur detta funkar då jag antagligen kommer bygga grejer då det krävs mer noggrann överföring.TomasL skrev:Det enda vettiga för att få en någorlunda säker mottagning är att använda interrupt.
Re: Att jämföra sträng på rätt sätt?
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 haltandeIcecap 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.
Re: Att jämföra sträng på rätt sätt?
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.
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.