Arduino: Slå i sönder String

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
RadioDJ
Inlägg: 446
Blev medlem: 7 november 2005, 16:18:15
Ort: Helsingborg

Arduino: Slå i sönder String

Inlägg av RadioDJ »

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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Arduino: Slå i sönder String

Inlägg av sodjan »

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.
Nerre
Inlägg: 27229
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Arduino: Slå i sönder String

Inlägg av Nerre »

Varje värde har sedan inget bestämt antal positioner.
Det är med andra ord inte bara att räkna positioner utan det krävs "strängsökning".

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.
RadioDJ
Inlägg: 446
Blev medlem: 7 november 2005, 16:18:15
Ort: Helsingborg

Re: Arduino: Slå i sönder String

Inlägg av RadioDJ »

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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Arduino: Slå i sönder String

Inlägg av sodjan »

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...
RadioDJ
Inlägg: 446
Blev medlem: 7 november 2005, 16:18:15
Ort: Helsingborg

Re: Arduino: Slå i sönder String

Inlägg av RadioDJ »

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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Arduino: Slå i sönder String

Inlägg av sodjan »

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>" ??
RadioDJ
Inlägg: 446
Blev medlem: 7 november 2005, 16:18:15
Ort: Helsingborg

Re: Arduino: Slå i sönder String

Inlägg av RadioDJ »

sodjan:
De är samma.
Blev nog något fel i klipp och klistra processen. :D

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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Arduino: Slå i sönder String

Inlägg av sodjan »

*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?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Arduino: Slå i sönder String

Inlägg av sodjan »

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...
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Arduino: Slå i sönder String

Inlägg av jesse »

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
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> ???

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
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Arduino: Slå i sönder String

Inlägg av sodjan »

> 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".
Nerre
Inlägg: 27229
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Arduino: Slå i sönder String

Inlägg av Nerre »

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).
RadioDJ
Inlägg: 446
Blev medlem: 7 november 2005, 16:18:15
Ort: Helsingborg

Re: Arduino: Slå i sönder String

Inlägg av RadioDJ »

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.
Användarvisningsbild
SeniorLemuren
Inlägg: 8426
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Arduino: Slå i sönder String

Inlägg av SeniorLemuren »

Vad är det för program i pc:n som genererar strängen och hur hanteras den normalt i pc:n i vanliga fall?
Skriv svar