Hur skicka strängar via ASCII?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
danei
EF Sponsor
Inlägg: 27427
Blev medlem: 2 juni 2003, 14:21:34
Ort: Östergötland
Kontakt:

Re: Hur skicka strängar via ASCII?

Inlägg av danei »

"Connect a data source to the block input on the Serial Transmit block.

If the data type is not uint8, use a Data Type Conversion block to convert it to uint8."

Det står tämligen tydligt tycker jag.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Hur skicka strängar via ASCII?

Inlägg av Al_Bundy »

Jo, jag testade det där faktiskt men det blev inget bra resultat för mig.

Jag testade att konvertera talet 40 som var Double -> Konvertering -> Uint8 -> Serial write.

Jag fick inte fram något. Men jag ska testa igen.

Jag tog en Constant(48) som hade värdet Double - > Konvertering -> Uint8 -> Serial write -> 0.

Alltså fick jag inte ut talet 48.
danei
EF Sponsor
Inlägg: 27427
Blev medlem: 2 juni 2003, 14:21:34
Ort: Östergötland
Kontakt:

Re: Hur skicka strängar via ASCII?

Inlägg av danei »

Double är inget värde, det är en datatyp. Double är ett flyttal med hög precision. Uint8 är ett 8 bitars tal dvs. 0-255. konverteringen borde med andra ord resultera i en Uint med värdet 48 vilket är ascii värdet för 0. DVs det funkade alldeles utmärkt för dig utan att du fattade det. 40 borde ha resulterat i en "(" om du tolkar det som ascii.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Hur skicka strängar via ASCII?

Inlägg av Al_Bundy »

Jo, jag vet att 40 är tecknet "(", men jag vill skicka 40 och ta emot 40.

- Gumman?
- Ja, älskling?
- Vad är det för temperatur ute denna varma dag?
- Temperaturen är (.
- Okej, då vet jag!
danei
EF Sponsor
Inlägg: 27427
Blev medlem: 2 juni 2003, 14:21:34
Ort: Östergötland
Kontakt:

Re: Hur skicka strängar via ASCII?

Inlägg av danei »

Du skickar värdet 40, det är mottagaren som tolkar det som "(" Du vill med andra ord inte skicka talet 40 utan ascii tecknen "4" och "0"
Testat med funktionen num2str() ?
Användarvisningsbild
MiaM
Inlägg: 12943
Blev medlem: 6 maj 2009, 22:19:19

Re: Hur skicka strängar via ASCII?

Inlägg av MiaM »

Det står "Send buffered data to serial port"

Du behöver kanske göra någon slags "flush" på slutet för att den buffrade datan verkligen ska knuffas iväg?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hur skicka strängar via ASCII?

Inlägg av sodjan »

> Serial write -> 0.

Du måste vara mycket nogrannare med vad du skriver!
Jag tror att alla här tolkade det som att du fick värdet/talet 0.
Alltså inte strängen "0" som det faktriskt ser ut som att du fick.

write() verkar skicka det den får som bytes rak av utan konverteringar.

Vill du skicka talet 48 som strängen "48" så ska du skicka talen 52 och 56 (decimalt).
Alltså ASCII koderna för tecknen "4" respektive "8".


Och i fortsättningen, om du menar ett tal, skriv utan "", om du menar en
sträng (även en sträng som enbart har siffror!) skriv det med ""...

En sträng med enbart siffror är inte detsamma som ett tal!
Det är fortfarande bara en sträng...
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46974
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Hur skicka strängar via ASCII?

Inlägg av TomasL »

Dessutom får man skilja på data-strängar och text-strängar.
Beroende på språk hanteras de olika (nullterminering osv)

http://en.wikipedia.org/wiki/String_(computer_science)
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Hur skicka strängar via ASCII?

Inlägg av Al_Bundy »

Arduino har ändå en hemmagjord funktion som heter String(textsträng).toInt() som fungerar bra.
Jag hittade något matnyttigt här.

Kod: Markera allt

void setup(){
  Serial.begin(9600);
}

void loop(){
  Serial.write(45); // send a byte with the value 45

   int bytesSent = [b]Serial.write(“hello”)[/b]; //send the string “hello” and return the length of the string.
}

http://arduino.cc/en/Serial/Write

Funktionen write(); vill alltså ha datatypen uint8 för det ska vara en int med 8 bitar, dvs en byte, dvs ett tecken.
Så jag får väll bygga en algoritm som fungerar så att Simulink först skickar något tal t.ex 48 som ska föreställa en nolla och det betyder att AVR programmet ska läsa av enda tills den får 10, vilket är "\n".

Sedan får man klippa och klistra.
En fråga! Varför gjorde dem så här? Var de det enklaste sättet på den tiden?
Nerre
Inlägg: 27229
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Hur skicka strängar via ASCII?

Inlägg av Nerre »

Om du har en sträng som är "40" så består den (om vi använder C) av tre stycken bytes. Dessa bytes har värdena 52, 49 och 0 (strängar i C avslutas alltid av ett NULL-tecken).

Om nu din funktion vill ha ascii-värdet så är det bara att ta en byte i taget och skicka till din funktion.
Du får alltså göra en loop som går igenom strängen steg för steg tills den hittar NULL, och det är väldigt enkelt gjort just eftersom en strängvariabel i C egentligen är en pekare till första tecknet i strängen.

I princip kan man göra en sån loop som

Kod: Markera allt

for (i = 0; string[i] != 0; i++)
{
/* Gör vad du vill med byten string[i], eventuellt måste du casta */
/* write(unit8 string[i]); eller nåt sånt */
}
Du måste förstå att en dator jobbar ALLTID med tal. Även strängar är tal, skillnaden är att där har vi bestämt att talen ska motsvara bokstäver. Vilken bokstav ett visst tal står för beror på vilken ASCII-tabell vi använder.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hur skicka strängar via ASCII?

Inlägg av sodjan »

> skillnaden är att där har vi bestämt att talen ska motsvara bokstäver.

Helt fel. Eller i alla fall inte komplett. Lägg till ett "bl.a." så blir det rätt...
Användarvisningsbild
bit96
Inlägg: 2529
Blev medlem: 3 september 2007, 10:04:29
Ort: Säffle

Re: Hur skicka strängar via ASCII?

Inlägg av bit96 »

Nerre skrev:Om du har en sträng som är "40" så består den (om vi använder C) av tre stycken bytes. Dessa bytes har värdena 52, 49 och 0 (strängar i C avslutas alltid av ett NULL-tecken).

Om nu din funktion vill ha ascii-värdet så är det bara att ta en byte i taget och skicka till din funktion.
Du får alltså göra en loop som går igenom strängen steg för steg tills den hittar NULL, och det är väldigt enkelt gjort just eftersom en strängvariabel i C egentligen är en pekare till första tecknet i strängen.

I princip kan man göra en sån loop som

Kod: Markera allt

for (i = 0; string[i] != 0; i++)
{
/* Gör vad du vill med byten string[i], eventuellt måste du casta */
/* write(unit8 string[i]); eller nåt sånt */
}
Du måste förstå att en dator jobbar ALLTID med tal. Även strängar är tal, skillnaden är att där har vi bestämt att talen ska motsvara bokstäver. Vilken bokstav ett visst tal står för beror på vilken ASCII-tabell vi använder.
För att vara på säkra sidan ifall strängen saknar NULL bör man lägga till ett villkorligt 'break' i for-loopen.

Kod: Markera allt

for (i = 0; string[i] != 0; i++)
{
if(i>(MAXLEN_STRING)) break; /* t.ex. kan man sätta MAXLEN_STRING till 20 eller liknande om man ända bara har plats för 20 tecken på sin LCD*/ 
/* Gör vad du vill med byten string[i], eventuellt måste du casta */
/* write(unit8 string[i]); eller nåt sånt */
}
Nerre
Inlägg: 27229
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Hur skicka strängar via ASCII?

Inlägg av Nerre »

Man kan också göra koden tydligare genom att loopa till strlen(string) (men även den spricker ju på om strängen saknar NULL antar jag).
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Hur skicka strängar via ASCII?

Inlägg av Al_Bundy »

Jag kan skicka talet 70 direkt, men talet 500 kan jag inte skicka. Jag tror att det begränsar sig max till 256 tecken i från av tal från 0 till 256.

Nu gäller det bara för mig att lista ut hur att skicka flyttal via Simulink. :)
Problemet är att om konverterar om double 89.04 till uint8 så blir det 89 då int kan bara ha heltal.
Senast redigerad av Al_Bundy 13 februari 2015, 15:05:49, redigerad totalt 1 gång.
ronnylov
Inlägg: 987
Blev medlem: 23 februari 2012, 12:06:19
Ort: Borås

Re: Hur skicka strängar via ASCII?

Inlägg av ronnylov »

bit96 skrev:
Nerre skrev:Om du har en sträng som är "40" så består den (om vi använder C) av tre stycken bytes. Dessa bytes har värdena 52, 49 och 0 (strängar i C avslutas alltid av ett NULL-tecken).

Om nu din funktion vill ha ascii-värdet så är det bara att ta en byte i taget och skicka till din funktion.
Du får alltså göra en loop som går igenom strängen steg för steg tills den hittar NULL, och det är väldigt enkelt gjort just eftersom en strängvariabel i C egentligen är en pekare till första tecknet i strängen.

I princip kan man göra en sån loop som

Kod: Markera allt

for (i = 0; string[i] != 0; i++)
{
/* Gör vad du vill med byten string[i], eventuellt måste du casta */
/* write(unit8 string[i]); eller nåt sånt */
}
Du måste förstå att en dator jobbar ALLTID med tal. Även strängar är tal, skillnaden är att där har vi bestämt att talen ska motsvara bokstäver. Vilken bokstav ett visst tal står för beror på vilken ASCII-tabell vi använder.
För att vara på säkra sidan ifall strängen saknar NULL bör man lägga till ett villkorligt 'break' i for-loopen.

Kod: Markera allt

for (i = 0; string[i] != 0; i++)
{
if(i>(MAXLEN_STRING)) break; /* t.ex. kan man sätta MAXLEN_STRING till 20 eller liknande om man ända bara har plats för 20 tecken på sin LCD*/ 
/* Gör vad du vill med byten string[i], eventuellt måste du casta */
/* write(unit8 string[i]); eller nåt sånt */
}

Jag brukar skriva

Kod: Markera allt

for (i = 0; (string[i] != '\0') && (i < MAXLEN_STRING); i++) {
    /* Gör något med string[i] */
}
Tycker inte om break;
Skriv svar