Sida 1 av 2

Skicka bytes eller strängar till datorn?

Postat: 12 oktober 2014, 22:03:29
av Al_Bundy
Jag ska skicka värden i from av heltal och decimaler till min dator. Men det blir lite fel när jag skickar värden. När JAG skickar värden så använder jag mig av det fantastiska framtidsverktyget Arduino.

Serial.write(34); skickar ett värde till datorn, men när jag läser av det så kanske jag ser "#¤%".
Om jag skulle skicka Serial.print(34); så får datorn en sträng som är "34" och då måste man konvertera om den.

Arduino(det fantastiska++ verktyget som sagt) talar om för mig att när jag använder Serial.write(); så skickar jag bytes och när jag använder Serial.read(); så tar jag emot bytes, och sist Serial.print(); så skickar jag strängar.

Jag undrar hur man kan omvandla bytes till t.ex floats eller int på en dator. Jag frågar inte om någon kod direkt, utan på ett ungefär hur man brukar göra. Varför skickar man just bytes via USB? Varför kan man inte bara skicka en int eller float? Nu talar jag bytes som en storlek.

Just ja. Har jag glömt att berätta för er om det fantastiska++ verktyget Arduino? :wink:

Best regards
Al

Re: Skicka bytes eller strängar till datorn?

Postat: 12 oktober 2014, 22:14:47
av konig7070
Kan det vara så att Serial.print skickar ASCII-kod medans Serial.write skickar datavärdet 34 och datorn försöker tolka det som ASCII-tecken(#%)?
http://www.asciitable.com/

Re: Skicka bytes eller strängar till datorn?

Postat: 12 oktober 2014, 22:29:45
av sodjan
> http://arduino.cc/en/Serial/write
> http://arduino.cc/en/Serial/Print

konig7070, ja så är det ju så klart. :-)

> Varför kan man inte bara skicka en int eller float?

Vad är en "int" eller en "float"? Det finns ingenting som
säger att det är samma sak på olika plattformat/miljöer.

> så får datorn en sträng som är "34" och då måste man konvertera om den.

Ja, men då så har du ju lösningen. Bara att göra det. Case closed...

Re: Skicka bytes eller strängar till datorn?

Postat: 12 oktober 2014, 22:33:38
av Muppis
Spinner vi vidare på Sodjans idé att använda strängar så kan jag tipsa om funktionen scanf på mottagarsidan.

Re: Skicka bytes eller strängar till datorn?

Postat: 12 oktober 2014, 22:43:48
av sodjan
C-specifik. Vi vet ingenting om miljön "på andra sidan"...

Re: Skicka bytes eller strängar till datorn?

Postat: 12 oktober 2014, 23:00:56
av Al_Bundy
Ja exakt så!

När datorn skickar "3.34" till en float på min ATmega så blir den floaten = 0.00.

Alltså måste datorn konvertera om eller direkt lägga in dessa i en variabel.

Då förstår jag. :tumupp:

Re: Skicka bytes eller strängar till datorn?

Postat: 12 oktober 2014, 23:08:13
av Al_Bundy
Ett problem som jag har är att om jag tar t.ex

float a = Serial.parseFloat();
Serial.print(a);

Så kommer resultatet bli typ "," eller liknande.
Det är detta jag har egentligen problem med.

Re: Skicka bytes eller strängar till datorn?

Postat: 13 oktober 2014, 19:43:01
av bearing
Då kanske problemet är att du skickar flyttal med decimalkomma istället för decimalpunkt. Antagligen använder både PC och Arduino decimalpunkt.

Re: Skicka bytes eller strängar till datorn?

Postat: 13 oktober 2014, 22:13:03
av slo
Behövde själv enkelt sätt att sätta parametrar på Arduinon från pc tidigare i somrast så jag gjorde dett:
https://github.com/straend/Arductrl

Re: Skicka bytes eller strängar till datorn?

Postat: 13 oktober 2014, 23:10:32
av sodjan
> Då kanske problemet är att du skickar flyttal med decimalkomma istället för decimalpunkt.

Snarare decimalkomma istället för "decimal point". :-)
Finns inget rätt eller fel här, bara olika standards.
Det är bara att se till att man använder det som fungerar
i varje enskilt fall. Många miljöer har inställningar för att
"lokalisera" t.ex vilket decimaltecken som ska användas.

Re: Skicka bytes eller strängar till datorn?

Postat: 14 oktober 2014, 07:32:12
av Nerre
Al_Bundy skrev: Jag undrar hur man kan omvandla bytes till t.ex floats eller int på en dator. Jag frågar inte om någon kod direkt, utan på ett ungefär hur man brukar göra. Varför skickar man just bytes via USB? Varför kan man inte bara skicka en int eller float? Nu talar jag bytes som en storlek.
En serieport är normalt gjord för att skicka 8 bitar i taget. Start-bit, 8 databitar, stoppbit. Nu har vi sån tur att det matchar en byte!

Så, med Serial.write() så kan du enkelt skicka en byte via serieporten och ta emot med Serial.read.

En float är inte 8 bitar, för att kunna skicka en float så måste du "hacka sönder" den i delar som är max 8 bitar stora, skicka dem som bytes och sen sätta ihop dem på mottagarsidan. Denna "sönderhackning" kan göras på en massa olika sätt. Att konvertera talet till ascii är ett sätt, men Serial.print är nog främst tänkt för att skicka data till ett terminalprogram eller en skrivare, som är gjorde för att ta emot ascii via serieporten.

Om du BARA ska skicka och ta emot floats så kan du skriva en egen Serial.write_float() och Serial.read_float(), men ska du skicka mixade värden blir det värre.

Re: Skicka bytes eller strängar till datorn?

Postat: 14 oktober 2014, 12:33:18
av sodjan
Dessutom finns det massor av olika lagringsformat för "float"
så det vill till maximal tur om man kan skicka en "float" binärt
och mottagaren faktiskt kan tolka och förstå värdet!

Nej, det är sannolikt mycket bätte och stabilare att köra det
som strängar via ftoa/atof (eller motsvarade om man kör något
annat än C) så får man varje miljös eget float format automatiskt.

Om man nu över huvudtaget måste köra med float...

Re: Skicka bytes eller strängar till datorn?

Postat: 14 oktober 2014, 12:40:48
av Nerre
Eftersom man ändå kommer behöva skriva funktionen för att skicka och ta emot float så kommer ju såklart bägge ändar ha kompatibla funktioner.

Men det gäller ju som sagt var att bestämma sig för ett format som man använder för att skicka. Och helst ska det ju tåla lite överföringsfel också utan att ge felaktiga värden.

Att köra via strängar är ETT sätt, men det kräver ju att man har libbar för de olika printf/scanf eller konverteringsfunktionerna ftoa/atof. Det är ju dock enkelt att felsöka.

Re: Skicka bytes eller strängar till datorn?

Postat: 14 oktober 2014, 12:54:02
av bearing
På arduinon använder han ju iaf redan stränghanterande funktioner, så jag förstår inte dina inlägg. Vad som används i andra änden vet vi inte ännu.

Re: Skicka bytes eller strängar till datorn?

Postat: 14 oktober 2014, 12:56:59
av Nerre
Jag diskuterar från en lite mer övergripande nivå: Hur skickar man float över en serielina.