Go Down

Topic: Invio sms e carattere ° (gradi) (Read 2936 times) previous topic - next topic

mimmofire

Salve ragazzi, sono alle prese con un ennesimo problema!!!
Con un modulo gsm devo inviare una stringa contenente il carattere ° ( gradi) ma non riesco a capire come inserirlo.
Ho "trovato" il carattere nella tabella ASCII estesa ma :
1) Arduino la supporta
2) come inserirlo nella stringa

Premetto che ho letto di tutto, ho le lacrime agli occhi e non è allergia... :-)

Intanto provo e riprovo

Grazie

lesto

Dunque, bel problema.
il char di arduino è signed, quindi non puoi avere valori > 127 (niente tabella estesa)
Però forse puoi fregarlo se scrivi un byte (arrivi a 255)

A questo punto però, bisogna vedere se il cellulare/la rete gsm che riceve supporta la ascii estesa... probabilmente la rete la supporta, non ho mai avuto cellulariu stra-moderni, ma ricordo che alle volte i messaggi inviati a marche diverse alcuni simboli "saltavano"
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

astrobeed


il char di arduino è signed, quindi non puoi avere valori > 127 (niente tabella estesa)
Però forse puoi fregarlo se scrivi un byte (arrivi a 255)


Un dato di tipo char è compreso tra 127 e -128 se interpretato come numero, tra 0 e 255 se interpretato come carattere con relativa interpretazione nella tabella ASCII o altro formato di decodifica.

leo72

Il reference di Arduino riporta però sì che il char va da -128 a 127 ma che se si vuole usare il range 0-255 bisogna usare il "byte", che poi è un alias di "unsigned char".
Inoltre il Playground riporta questa tabella come quella dei caratteri ASCII supportati da Arduino:
http://www.arduino.cc/en/Reference/ASCIIchart
ma vanno da 0 a 127, che sono l'ASCII "regolare", la tabella ASCII estesa (128-255) se non ricordo male non è standard per cui ognuno la implementa come vuole. Dico male?

astrobeed


Il reference di Arduino riporta però sì che il char va da -128 a 127 ma che se si vuole usare il range 0-255 bisogna usare il "byte", che poi è un alias di "unsigned char".


State facendo un sacco di confusione tra il valore numerico, che per il char effettivamente va da 127 a -128, e l'interpretazione ASCII del valore contenuto in un char che spazia da 0 a 255.
Se in C definisco una variabile come char questa può contenere sia un numero, e in questo caso va da 127 a -128, oppure un carattere alfanumerico e in questo caso il valore spazia da 0 a 255, come il C interpreta il contenuto della char dipende da cosa ci si mette dentro durante l'inizializzazione della stessa.
Chi ama scrivere in modo prolisso in C normalmente usa mettere il prefisso signed prima di char per facilitare l'identificazione del tipo di valore contenuto nella variabile, da notare che anche in Wiring è possibile usare la stessa notazione.
Il problema con la parte estesa, da 128 a 255, della tabella ASCII è proprio che non è standard quindi rischi di vedere caratteri diversi da quelli attesi oppure di non vedere proprio nulla.
La tabella nel playground è semplicemente lo standard ASCII, Arduino non sa nemmeno cosa sia, è il programmatore che deve tenere conto di queste cose.

leo72

Chiaro come al solito. Grazie delle delucidazioni.

astrobeed

Giusto per fare totale chiarezza sulla cosa ho modificato lo sketch di esempio che stampa la tabella ASCII per visualizzare tutti e 255 i valori e non solo fino a 126 come nell'originale.
Una volta avviato il programma sul terminale seriale appaiano i vari caratteri corrispondenti al valore numerico contenuto  sotto forma del carattere corrispondente alla tabella ASCII in uso sul pc (code page) per tutta l'estensione da 32 (spazio) a 255, la parte oltre 127 sono i vari simboli speciali e le accentate che non fanno parte della tabella standard.
Da notare che è possibile usare la variabile char anche per il ciclo con la differenza che il confronto si fa su -1 invece che su 255 perché con uno char tale è l'interpretazione numerica, -1 = 11111111 = 255.

Code: [Select]

char caratteri=32;  // variabile char che contiene caratteri
unsigned char ciclo=32; // variabile unsigned char che conta fino a 255 per il ciclo.

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

  // prints title with ending line break
  Serial.println("ASCII Table ~ Character Map");
}


void loop()
{
  Serial.print(caratteri);//, BYTE);   

  Serial.print(", dec: ");
  Serial.println(ciclo, DEC); 

  if(ciclo == 255) while(1);
  //  if(caratteri == -1) while(1);

  // go on to the next character
  caratteri++;
  ciclo++; 
}

mimmofire

#7
Jun 24, 2011, 01:39 pm Last Edit: Jun 24, 2011, 01:47 pm by mimmofire Reason: 1
Gentilissimo astrobeed!!!
Secondo te qual è il miglior metodo per provare ad inviare dei caratteri di prova al modulo gsm.
Mi spiego la stringa accettata dalla funzione di invio sms è del tipo char[] ed io vorrei inviare una stringa del tipo
" la temperatura in casa è di 24 °C"
succede che se inserisco il carattere ° il messaggio, sul telefono, termina il carattere precedente al simbolo °

astrobeed


Mi spiego la stringa accettata dalla funzione di invio sms è del tipo char[] ed io vorrei inviare una stringa del tipo
" la temperatura in casa è di 24 °C"


Il problema è se il telefono ha il carattere  ° , se non c'è non puoi fare nulla, se c'è devi scoprire a quale valore numerico corrisponde.

leo72

Da "pragmatic programmer", io taglierei la testa al toro TOGLIENDO quel carattere.
Se ricevi 24C capisci che si tratta di 24°C, non ti pare?  XD XD

mimmofire

:) Leo sono d'accordo con te infatti per adesso il programma funziona così un bel "24 gradi" e tutto fila liscio, ma purtroppo non ci dormo la notte!!!
Ci deve pur essere una soluzione. :smiley-eek:

astrobeed


Ci deve pur essere una soluzione. :smiley-eek:


La soluzione c'è se il tuo telefono ha il ° nel set di caratteri visualizzabile, se non è presente non c'è soluzione.


mimmofire

Astrobeed infatti l'avevo pensato e sto provando ad inviare sms su diverse tipologie di telefono ma fino ad adesso nulla....
Nokia fascia 30€
Samsung
NGM

Marco Benini

Ciao,

dato che stai tentando di inviare un SMS presumo tut utilizzi un modulo GSM oppure un telefonino, il "problema", oltre che la mappa caratteri dell'Arduino e' la codifica caratteri utilizzata per gli SMS.

Comando
AT+CSCS

AT+CSCS=? ti dovrebbe dare la lista delle codifiche carattere supportate dal modulo.

Ad esempio un modulo GSM come il Telit con firmware 6 supportano:

"GSM" (alfabeto di defualt)
"IRA" - ITU-T.50 ossia International Reference Alphabet
"8859-1" - ISO 8859 Latin 1
"PCCP437" - PC character set Code Page 437.
"UCS2" - 16-bit universal multiple-octet coded character set (ISO/IEC10646)

Pertanto devi vedere quale codifica e' supportata dal tuo GSM in invio, alla ricezione bisogna vedere poi se il set di carattaeri e' disponibile nel telefonino di destinazione (altrimenti in genere si passa alla codifica caratteri standard).

Poi devi vedere se utilizzi la codifica degli SMS di tipo PDU o testuale (presumo la modalita' testuale dato che quella PDU e' un " po' " pesante da implementare). Non ricordo se tutte i set caratteri siano disponibili nell'una o nell'altra modalita'.

Ciao,
Marco.

mimmofire

Grazie Marco, provero' subito e postero' i risultati...
Ciao,
Mimmo

Go Up