Hur skicka strängar via ASCII?
Re: Hur skicka strängar via ASCII?
"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.
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.
Re: Hur skicka strängar via ASCII?
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.
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.
Re: Hur skicka strängar via ASCII?
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.
Re: Hur skicka strängar via ASCII?
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!
- Gumman?
- Ja, älskling?
- Vad är det för temperatur ute denna varma dag?
- Temperaturen är (.
- Okej, då vet jag!
Re: Hur skicka strängar via ASCII?
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() ?
Testat med funktionen num2str() ?
Re: Hur skicka strängar via ASCII?
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?
Du behöver kanske göra någon slags "flush" på slutet för att den buffrade datan verkligen ska knuffas iväg?
Re: Hur skicka strängar via ASCII?
> 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...
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...
Re: Hur skicka strängar via ASCII?
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)
Beroende på språk hanteras de olika (nullterminering osv)
http://en.wikipedia.org/wiki/String_(computer_science)
Re: Hur skicka strängar via ASCII?
Arduino har ändå en hemmagjord funktion som heter String(textsträng).toInt() som fungerar bra.
Jag hittade något matnyttigt här.
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?
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.
}
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?
Re: Hur skicka strängar via ASCII?
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
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.
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 */
}
Re: Hur skicka strängar via ASCII?
> 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...
Helt fel. Eller i alla fall inte komplett. Lägg till ett "bl.a." så blir det rätt...
Re: Hur skicka strängar via ASCII?
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.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 somDu 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.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 */ }
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 */
}
Re: Hur skicka strängar via ASCII?
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).
Re: Hur skicka strängar via ASCII?
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.
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.
Re: Hur skicka strängar via ASCII?
bit96 skrev: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.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 somDu 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.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 */ }
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] */
}