Olika metoder för att skicka stora datamängder (UART)

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Olika metoder för att skicka stora datamängder (UART)

Inlägg av jesse »

Brukar och brukar ... :vissla:

Nä, men har du gott om RAM-minne så är ju en buffert alltid bra att lagra data i under tiden som det läses in. Du läser in data med hjälp av interrupt (förstås?) och då kan det ju ligga där i evighet i princip...

En metod jag har använt är att varje dataström alltid inleds med ett tecken (i mitt fall '$'). Alltså:
$CMD | SIZE | DATA | CHKSUM
Det förutsätter att dollartecknet inte kan finnas med i datan någon annanstans (en stor begränsning, men i mitt fall körde jag ascii och då går det bra).

Jag gjorde så att inläsarrutinen ignorerar alla tecken ända tills ett '$'-tecken kommer in. Då sätts buffertpekaren till noll och den börjar fylla på. Detta fortsätter tills:
a) buffert full -> fel - töm, vänta på nytt '$'
b) nytt '$' -> börja om.
c) alla tecken inlästa. Sätt flagga.

Den här metoden fungerar även med långsamma sändare som har rejäla pasuer mitt i dataflödet.
Timeout-metoden kräver ju att sändaren håller en viss lägsta hastighet.

Om man nu inte vill ha ett unikt starttecken måste dataflödet istället regleras med pauser. Vi antar att en paus på >10ms innebär nystart. Jag har aldrig implemeterat detta, men kan det vara en väg att gå att du nollar en timer varje gång ett tecken kommer in. När nästa tecken kommer kollar du att timern inte nått owerflow. Om den gjort det så anses det vara första byten oavsett hur många som inkommit innan. Verkar det vettigt?

(Ämnet intresserar mig mycket, då det inte är särskilt ovanligt att man vill kommunicera med en massa data)
Nerre
Inlägg: 27235
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Olika metoder för att skicka stora datamängder (UART)

Inlägg av Nerre »

Men frågan här var väl hur man skulle hantera paket som börjar skickas men sen inte blir klara?

Alltså hur gör man om paketet inte sänds till fullo och det kanske inte kommer nåt mer starttecken.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Olika metoder för att skicka stora datamängder (UART)

Inlägg av sodjan »

Timeout.
Nerre
Inlägg: 27235
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Olika metoder för att skicka stora datamängder (UART)

Inlägg av Nerre »

Ja, och om man läser frågan står det "Hur brukar ni göra en Time Out funktion?"
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Olika metoder för att skicka stora datamängder (UART)

Inlägg av jesse »

Om du frågar mig, så löste jag ju "timeout"-problemet ovan genom att helt enkelt inte göra någonting - det halvfärdiga meddelandet kommer att ligga i inbufferten, men man får aldrig någon signal om att något meddelande kommit in. Om ett nytt meddelande påbörjas kommer ju man se att time-out uppnåtts och då börjar bufferten fyllas från start igen.

Vill man istället bri uppmärksam på att det gått t.ex. 10ms efter senaste byten och meddelandet inte är klart, så är det ju enkelt att sätta en flagga då timern gör owerflow som då visar att det blivit ett avbrott. man kan ju sätta en räknare som räknar upp antalet missade meddelanden om man vill och som man kan sända i nästa "status request".

(se inlägget ovan).
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Olika metoder för att skicka stora datamängder (UART)

Inlägg av sodjan »

> Om ett nytt meddelande påbörjas...

Det bygger på att du vet när händelsen "start av ett nytt meddelande" inträffar.
Du måste ju skilja på ett nytt meddelande och en vanlig paus i överföringen.
Det är bara att definiera vad som är acceptablent och se till att både
sändare och mottagare är överens om vad som gäller.

> "Hur brukar ni göra en Time Out funktion?"

Något som triggar när en viss tid har passerat. Det finns många sätt
att implementera det på och det beror mycket på hur den övriga
applikationen ser ut. Svårt att ge ett generellt svar.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Olika metoder för att skicka stora datamängder (UART)

Inlägg av jesse »

> Om ett nytt meddelande påbörjas...

Jag tog ju två olika exempel ovan. Det ena med ett starttecken, oberoende av tidsfaktorer som anger att ett nytt meddelande kommer, det andra med en paus på > 10 ms som villkor för att det ska anses vara ett nytt meddelande.
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Re: Olika metoder för att skicka stora datamängder (UART)

Inlägg av Korken »

Mycket bra information! :D

Jag kan tyvärr inte göra med unika tecken just därför att datat jag skickar kan vara vilken byte som helst.
För det jag skickar är floats som jag delar upp i 4 bytes och sedan skickar.
Men jag ska testa det du sa om pauser, då jag kör i 11520 byte/s så kan en lagom time out nog liga på några tecken.
Det lite jobbiga är att en "kommandokö" måste skapas istället för min surra. Så den vet när den ska ta en liten paus i överföringen.
Lite mer arbete bakom men en mer stabil länk i slutändan, det är vad jag vill ha.

Som du säger sodjan så är det en ganska öppen fråga, men jag brukar få bra svar när jag ställer dom så. :)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Olika metoder för att skicka stora datamängder (UART)

Inlägg av sodjan »

> ...därför att datat jag skickar kan vara vilken byte som helst.

Fel på designen, skulle jag säga.

> För det jag skickar är floats...

*Speciellt* fel att skicka ett internt format som float vilket kan
skillja i representation mellan olika plattformar.

Någon speciell anledning att inte hålla det hela på ASCII nivå?
Vad representerar dessa floats i verkligheten?
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: Olika metoder för att skicka stora datamängder (UART)

Inlägg av vfr »

Det finns i princip två olika sätt att särskilja start/stopp från paketdata. Antingen timing eller datainnehåll. I den senare varianten så får man speciella fall om man sänder binärdata med alla användbara tecken. Då måste man ha någon form av escaping som byter ut start/stopp-tecken som ligger i datan.

Jag har kört protokoll med båda varianterna och personligen så tycker jag att dataescaping är smidigare. Nackdelen med timingvarianten är att det väldigt ofta blir svårt att felsöka så fort någon form av timing är inblandat. Med den andra varianten så kan man köra i vilken tid man vill. Ja, vissa tider måste ju naturligtvis finnas även där. Men bara basicsaker som pakettimeout t.ex.

My five cents efter att ha kört en hel del seriekommunikation under senaste 20 åren...
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Re: Olika metoder för att skicka stora datamängder (UART)

Inlägg av Korken »

sodjan: Jag skickar floats för att annars skulle inte min bandbredd räcka till. Redan nu använder jag ca 70%, så det är inte mycket att göra åt.
Just när det håller datat så har jag skrivit en tolk som gör om datat till rätt format. :)

Jag gör inga approximationer för det kan göra skillanden på att hitta fel och att de inte kommer med. :)
Kaggen
Inlägg: 432
Blev medlem: 29 januari 2005, 03:06:02

Re: Olika metoder för att skicka stora datamängder (UART)

Inlägg av Kaggen »

Korken skrev:Detta använder jag främst för att mosa ut massa sensordata och filterdata på KFly medan det flyger för att lättare hitta problem i filterkod och reglerkod.
Lite off-topic, men... Vad använder du för TX/RX lösning för att skicka telemetridatan trådlöst?
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Re: Olika metoder för att skicka stora datamängder (UART)

Inlägg av Korken »

Hejhopp! Då va det dags att skaka liv i en gammal tråd igen!
Kan svara på ett gammalt inlägg först. Kaggen: Jag kör via en Bluetooth till UART omvlandlare.

Nu kommer det jag vill fråga/diskutera om.
Jag har nu märkt att använda binärdata fungerar dåligt.
Upptäcka fel är praktiskt taget omöjligt samt timing fungerar inge bra då sändaren bygger upp en buffert och sedan skickar det så det blir inge bra där heller.
Vad finns det för andra metoder för detta? Jag måste ju ha någon form av metod som använder "sync"-tecken.

Jag kan göra om alla mina bytes till ascii (hex) och skicka två bytes för varje byte. Detta tar dock 2x så mycket bandbredd men är den ända lösningen jag har kommit på.
Finns det inget bättre/effektivare sätt att göra detta utan att det blir väldigt komplext?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Olika metoder för att skicka stora datamängder (UART)

Inlägg av sodjan »

Vad du i princip säger är att "jag vill tappa 100 lit/min ur en
kran som max ger 10 lit/min, hur fixar jag det?". Tja... :-)
Antingen får du nöja dig med 10 lit/min eller så får du
skaffa en kraftigare kran... :-)
victor_passe
Inlägg: 2436
Blev medlem: 28 januari 2007, 18:45:40
Ort: Kungsbacka

Re: Olika metoder för att skicka stora datamängder (UART)

Inlägg av victor_passe »

Jag har gjort precis som du skrev i ditt första inlägg, det fungerar bra.
För mottagning kan man göra samma sak eller bara ha buffer nog för 1 packet "givet fix storlek" och inte använda en cirkelbuffer.
Skriv svar