Skicka bytes eller strängar till datorn?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Skicka bytes eller strängar till datorn?

Inlägg 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
Användarvisningsbild
konig7070
Inlägg: 888
Blev medlem: 2 augusti 2008, 11:51:14
Ort: Uddevalla

Re: Skicka bytes eller strängar till datorn?

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

Re: Skicka bytes eller strängar till datorn?

Inlägg 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...
Muppis
Inlägg: 275
Blev medlem: 15 februari 2007, 10:26:28
Ort: Halmstad

Re: Skicka bytes eller strängar till datorn?

Inlägg av Muppis »

Spinner vi vidare på Sodjans idé att använda strängar så kan jag tipsa om funktionen scanf på mottagarsidan.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Skicka bytes eller strängar till datorn?

Inlägg av sodjan »

C-specifik. Vi vet ingenting om miljön "på andra sidan"...
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Skicka bytes eller strängar till datorn?

Inlägg 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:
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Skicka bytes eller strängar till datorn?

Inlägg 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.
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Skicka bytes eller strängar till datorn?

Inlägg 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.
slo
Inlägg: 103
Blev medlem: 7 januari 2009, 10:57:35
Ort: Åbo, Finland
Kontakt:

Re: Skicka bytes eller strängar till datorn?

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

Re: Skicka bytes eller strängar till datorn?

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

Re: Skicka bytes eller strängar till datorn?

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

Re: Skicka bytes eller strängar till datorn?

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

Re: Skicka bytes eller strängar till datorn?

Inlägg 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.
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Skicka bytes eller strängar till datorn?

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

Re: Skicka bytes eller strängar till datorn?

Inlägg av Nerre »

Jag diskuterar från en lite mer övergripande nivå: Hur skickar man float över en serielina.
Skriv svar