Arduino: Slå i sönder String
Arduino: Slå i sönder String
Någon som vill knäcka en liten tankenöt till mig?
Jag får in en sträng från en pc som jag måste stå i sönder och dela upp i några nya strängar så att jag sedan kan visa dessa på en display.
// Sträng in
<BS>0<CR>
<BS><LF>
Nils Nilsson<CR>
<BS><LF>
<LF>
Nisse
<CR>
<BS><LF>
<LF>
<LF>
Nisse Hult<BS><LF>
<LF>
<LF>
<LF>
0,00<CR>
<BS><LF>
<LF>
<LF>
<LF>
<LF>
0<CR>
<BS><LF>
<LF>
<LF>
<LF>
1,00<CR>
// Sträng slut
<BS> = Hex 08
<LF> = Hex 0A
<CR> = Hex 0D
Varje värde har sedan inget bestämt antal positioner.
Värdena som jag sedan vill ha i nya strängar har jag markerat med rött.
Vad jag har lyckat att reda ut är:
<BS>0<CR> = Troligen start bitar
<BS><LF> = Efter detta kommer det en sträng, avslutas med <CR>
<BS><LF><LF> = Här efter kommer nästa sträng, avslutas med <CR>
<BS><LF><LF><LF> = Här efter kommer nästa sträng, avslutas med <CR>
<BS><LF><LF><LF><LF> = Här efter kommer nästa sträng, avslutas med <CR>
Allt är analyserat i serieportsanalysator. Där av kanske konstiga tecken, ex <CR>.
Någon villig själ som kan mer om Arduino än jag som kan tänka sig att skriva ihop ett litet exempel till mig?
Tacksam för alla ledtrådar.
Jag får in en sträng från en pc som jag måste stå i sönder och dela upp i några nya strängar så att jag sedan kan visa dessa på en display.
// Sträng in
<BS>0<CR>
<BS><LF>
Nils Nilsson<CR>
<BS><LF>
<LF>
Nisse
<CR>
<BS><LF>
<LF>
<LF>
Nisse Hult<BS><LF>
<LF>
<LF>
<LF>
0,00<CR>
<BS><LF>
<LF>
<LF>
<LF>
<LF>
0<CR>
<BS><LF>
<LF>
<LF>
<LF>
1,00<CR>
// Sträng slut
<BS> = Hex 08
<LF> = Hex 0A
<CR> = Hex 0D
Varje värde har sedan inget bestämt antal positioner.
Värdena som jag sedan vill ha i nya strängar har jag markerat med rött.
Vad jag har lyckat att reda ut är:
<BS>0<CR> = Troligen start bitar
<BS><LF> = Efter detta kommer det en sträng, avslutas med <CR>
<BS><LF><LF> = Här efter kommer nästa sträng, avslutas med <CR>
<BS><LF><LF><LF> = Här efter kommer nästa sträng, avslutas med <CR>
<BS><LF><LF><LF><LF> = Här efter kommer nästa sträng, avslutas med <CR>
Allt är analyserat i serieportsanalysator. Där av kanske konstiga tecken, ex <CR>.
Någon villig själ som kan mer om Arduino än jag som kan tänka sig att skriva ihop ett litet exempel till mig?
Tacksam för alla ledtrådar.
Re: Arduino: Slå i sönder String
Hur har du producerat listan?
> <BS>0<CR> = Troligen start bitar
Njae, det är tre *bytes*.
Backspace, hex "08"
En nolla, hex "30"
Carriage return, hex "0D".
Men är det inte bara att räkna tecken och plocka
ut det som du vill ha kvar?
En fråga är ju också hur mycket detta format kan variera.
> <BS>0<CR> = Troligen start bitar
Njae, det är tre *bytes*.
Backspace, hex "08"
En nolla, hex "30"
Carriage return, hex "0D".
Men är det inte bara att räkna tecken och plocka
ut det som du vill ha kvar?
En fråga är ju också hur mycket detta format kan variera.
Re: Arduino: Slå i sönder String
Det är med andra ord inte bara att räkna positioner utan det krävs "strängsökning".Varje värde har sedan inget bestämt antal positioner.
Lite snabbt googlande:
http://arduino.cc/en/Tutorial/StringIndexOf
http://arduino.cc/en/Reference/StringSubstring
Sen blir väl den enkla proceduren att:
Sök upp start för första värdet, använd resten av strängen till nästa steg (kasta alltså allt före första värdet)
Läs ut värdet fram till sluttecken, använd sen resten av strängen till nästa steg
Sök upp start för andra värdet, använd resten av strängen till nästa steg
Läs ut värdet fram till sluttecken, använd sen resten av strängen till nästa steg
Sök upp start för tredje värdet, använd resten av strängen till nästa steg
Läs ut värdet fram till sluttecken, använd sen resten av strängen till nästa steg
Man tuggar sig alltså igenom strängen steg för steg och kastar bort det man har passerat (efter att ha plockat ut det intressanta).
Men ska man sen kunna hantera att det blivit fel nånstans blir det lite värre.
Re: Arduino: Slå i sönder String
sodjan:
Som jag sa sedan tidigare, så har alla som är markerade med rött ingen bestämd längd.
Nerre:
Tack. Ska kolla kolla på detta.
Som jag sa sedan tidigare, så har alla som är markerade med rött ingen bestämd längd.
Nerre:
Tack. Ska kolla kolla på detta.
Re: Arduino: Slå i sönder String
Har du utrymme att läsa in hela strängen innan bearbetningen?
Eller behöver du dela upp den on-the-fly samtidigt som den läses in?
> Som jag sa sedan tidigare, så har alla som är markerade med rött ingen bestämd längd.
Men är *resten* alltid av samma längd och utseende?
Det förrenklar ju det hela avsevärt...
Eller behöver du dela upp den on-the-fly samtidigt som den läses in?
> Som jag sa sedan tidigare, så har alla som är markerade med rött ingen bestämd längd.
Men är *resten* alltid av samma längd och utseende?
Det förrenklar ju det hela avsevärt...
Re: Arduino: Slå i sönder String
sodjan:
Att läsa in hela strängen på en gång är inga problem. Plats finns.
Vad jag kan se i mina tester så är allt annat (utom de röda) exakt samma hela tiden.
Att läsa in hela strängen på en gång är inga problem. Plats finns.
Vad jag kan se i mina tester så är allt annat (utom de röda) exakt samma hela tiden.
Re: Arduino: Slå i sönder String
OK. Men då är det ju enkelt.
Bara att räkna fram till första röda strängen.
Spara tills man hittar <CR>. Räkna vidare till
nästa röda sträng, spara till nästa <CR> o.s.v.
Jag antar att dessa två delar egentligen är likadana:
Nils Nilsson<CR>
och:
Nisse
<CR>.
Eller varför är det en radbrytning i det andra fallet?
Är det något mellan "Nisse" och "<CR>" ??
Bara att räkna fram till första röda strängen.
Spara tills man hittar <CR>. Räkna vidare till
nästa röda sträng, spara till nästa <CR> o.s.v.
Jag antar att dessa två delar egentligen är likadana:
Nils Nilsson<CR>
och:
Nisse
<CR>.
Eller varför är det en radbrytning i det andra fallet?
Är det något mellan "Nisse" och "<CR>" ??
Re: Arduino: Slå i sönder String
sodjan:
De är samma.
Blev nog något fel i klipp och klistra processen.
Jag tror inte att det räcker det som du skrev.
Namnet (det röda) kan vara olika långt och det är inte varje gång som hela strängen ser ut som i fallet nedan.
Jag måste på något vis hålla kolla på alla <BS><LF><LF><LF>. Hur många <LF> är det efter <BS> 1, 2, 3 eller 4, för att säkert veta vilken sträng det är som kommer.
De är samma.
Blev nog något fel i klipp och klistra processen.

Jag tror inte att det räcker det som du skrev.
Namnet (det röda) kan vara olika långt och det är inte varje gång som hela strängen ser ut som i fallet nedan.
Jag måste på något vis hålla kolla på alla <BS><LF><LF><LF>. Hur många <LF> är det efter <BS> 1, 2, 3 eller 4, för att säkert veta vilken sträng det är som kommer.
Re: Arduino: Slå i sönder String
*Om* det som är mellan de röda strängarna alltid är samma så
är det bara att "snabbspola" förbi dom. Sedan sparar du det som
är rött tills det kommer ett <CR>, det kan ju så klart bli lite
olika längder (du bör nog bestämma en maxlängd).
> för att säkert veta vilken sträng det är som kommer.
Vilken sträng? Ser inte hela paketet alltid ut som i ditt
exempel, förrutom längden på det som är rött?
är det bara att "snabbspola" förbi dom. Sedan sparar du det som
är rött tills det kommer ett <CR>, det kan ju så klart bli lite
olika längder (du bör nog bestämma en maxlängd).
> för att säkert veta vilken sträng det är som kommer.
Vilken sträng? Ser inte hela paketet alltid ut som i ditt
exempel, förrutom längden på det som är rött?
Re: Arduino: Slå i sönder String
Något i stil med:
- Hoppa över 5 tecken (<BS>0<CR><BS><LF>).
- Spara fram till nästa <CR>. ("Nils Nilsson" i exemplet)
- Hoppa över 4 tecken (<CR><BS><LF><LF>)
- Spara from till nästa <CR>. ("Nisse" i exempelt)
- Hoppa över 5 tecken (<CR><BS><LF><LF><LF>)
- Spara from till nästa <CR>. ("Nisse Hult" i exempelt)
- Hoppa över 5 tecken (<BS><LF><LF><LF><LF>)
- Spara from till nästa <CR>. ("0.0" i exempelt)
- Hoppa över 7 tecken (<CR><BS><LF><LF><LF><LF><LF>)
- Spara from till nästa <CR>. ("0" i exempelt)
- Hoppa över 6 tecken (<CR> <BS><LF><LF><LF><LF>)
- Spara from till nästa <CR>. ("1,00" i exempelt)
Klart!
Med reservation för att att du kar klippt en korrekt dump av strängen...
- Hoppa över 5 tecken (<BS>0<CR><BS><LF>).
- Spara fram till nästa <CR>. ("Nils Nilsson" i exemplet)
- Hoppa över 4 tecken (<CR><BS><LF><LF>)
- Spara from till nästa <CR>. ("Nisse" i exempelt)
- Hoppa över 5 tecken (<CR><BS><LF><LF><LF>)
- Spara from till nästa <CR>. ("Nisse Hult" i exempelt)
- Hoppa över 5 tecken (<BS><LF><LF><LF><LF>)
- Spara from till nästa <CR>. ("0.0" i exempelt)
- Hoppa över 7 tecken (<CR><BS><LF><LF><LF><LF><LF>)
- Spara from till nästa <CR>. ("0" i exempelt)
- Hoppa över 6 tecken (<CR> <BS><LF><LF><LF><LF>)
- Spara from till nästa <CR>. ("1,00" i exempelt)
Klart!
Med reservation för att att du kar klippt en korrekt dump av strängen...
Re: Arduino: Slå i sönder String
Du vill kunna ta ut vissa tecken. Det beror ju på hur mycket datasträngen varierar från gång till gång. Ibland kanske det kommer fler skrivbara tecken mellan raderna. Hur vet du att det .t.ex inte i vissa fall kommer mer text på vissa platser. Efter Nisse Hult<BS><LF><LF> kan det ju komma Storgatan 13 <LF> Umeå<LF> ???RadioDJ skrev:Jag får in en sträng från en pc som jag måste stå i sönder och dela upp i några nya strängar så att jag sedan kan visa dessa på en display.
// Sträng in
<BS>0<CR>
<BS><LF>
Nils Nilsson<CR>
<BS><LF>
<LF>
Nisse
<CR>
<BS><LF>
<LF>
<LF>
Nisse Hult<BS><LF>
<LF>
<LF>
<LF>
0,00<CR>
<BS><LF>
<LF>
<LF>
<LF>
<LF>
0<CR>
<BS><LF>
<LF>
<LF>
<LF>
1,00<CR>
// Sträng slut
Nu har du ju en Arduino, och den har säkert en egen konstig sträng-typ som har en massa smarta funktioner knutna till sig. Men om jag tänker mig strängen som en normal C-array så skulle jag göra så här:
1) börja läs tecken från position noll.
2) är det ett icke-skrivbart tecken (dvs < 0x20), hoppa över tills du kommer till första läsbara tecknet, som är ett 'N'.
3) skicka ut tecknet till displayen.
4) fortsätt läsa tecken, om det kommer läsbara tecken, skicka dem till displayen.
5) så fort det kommer in ett icke-läsbart tecken, markerar du på displayen att en ny sträng börjar, t.ex. genom att skriva ut ett mellanslag, ny rad eller ett '/'.
6) fortsätt på punkt (1) igen.
7) avbryt när du kommit till strängens slut. (antagligen läser tecknet 0x00 eller om du i förväg vet antalet tecken)
Beroende på hur du gör kommer du att få följande text på displayen:
Nils Nilsson Nisse Nisse Hult 0,00 0 1,00
Nils Nilsson
Nisse
Nisse Hult
0,00
0
1,00
Nils Nilsson/Nisse/Nisse Hult/0,00/0/1,00
Re: Arduino: Slå i sönder String
> Efter Nisse Hult<BS><LF><LF> kan det ju komma Storgatan 13 <LF> Umeå<LF> ???
Kan det? Fick vi inte just veta att det inte kan det?
Man visst, *om* det finns osäkerhet kring det (det vet ju inte *vi*)
så är det klart att man får ta hänsyn till det. Men tillsvidare så får
vi väl lite på vad som faktist sägs i beskrivningen i tråden. Annars
blir alla föreslagna metoder helt meningslösa.
> hoppa över tills du kommer till första läsbara tecknet, som är ett 'N'.
Nej, det är det inte. Det är "0".
Kan det? Fick vi inte just veta att det inte kan det?
Man visst, *om* det finns osäkerhet kring det (det vet ju inte *vi*)
så är det klart att man får ta hänsyn till det. Men tillsvidare så får
vi väl lite på vad som faktist sägs i beskrivningen i tråden. Annars
blir alla föreslagna metoder helt meningslösa.
> hoppa över tills du kommer till första läsbara tecknet, som är ett 'N'.
Nej, det är det inte. Det är "0".
Re: Arduino: Slå i sönder String
Jag är lite fascinerad över att antalet LF efter varje fält verkar öka, är detta nåt medvetet som "pekar ut" fälten så är ju det kanske relevant information (om ett fält kan vara tomt kanske det kan blir problem annars).
Re: Arduino: Slå i sönder String
Nej, Storgatan i Umeå kommer aldrig att komma
Dock har jag märkt efter fler mätningar att enbart:
<BS><LF>
<LF>
<LF>
<LF>
<LF>
0<CR>
ELLER
<BS><LF>
<LF>
<LF>
<LF>
1,00<CR>
kan förekomma.
Så på något vis måste man nog hålla koll på alla <LF>er. Bara för att veta vilken information som kommer.
Ber om förlåtelse att all information inte har framkommit på ett korrekt sätt.
OBS!! Specen kommer kanske att ändras lite igen efterhand som jag hittar fler saker. Tror dock att allt är hittat nu.
Dock har jag märkt efter fler mätningar att enbart:
<BS><LF>
<LF>
<LF>
<LF>
<LF>
0<CR>
ELLER
<BS><LF>
<LF>
<LF>
<LF>
1,00<CR>
kan förekomma.
Så på något vis måste man nog hålla koll på alla <LF>er. Bara för att veta vilken information som kommer.
Ber om förlåtelse att all information inte har framkommit på ett korrekt sätt.
OBS!! Specen kommer kanske att ändras lite igen efterhand som jag hittar fler saker. Tror dock att allt är hittat nu.
- SeniorLemuren
- Inlägg: 8426
- Blev medlem: 26 maj 2009, 12:20:37
- Ort: Kristinehamn
Re: Arduino: Slå i sönder String
Vad är det för program i pc:n som genererar strängen och hur hanteras den normalt i pc:n i vanliga fall?