Go Down

Topic: declaration de variable (Read 693 times) previous topic - next topic

jvpython

Salut
Je travail sur un projet avec une WiShield ou l'utilisateur envoi les parametre de configuration par Serial.

Voici le code de declaration normal:
Code: [Select]

// Wireless configuration parameters ----------------------------------------
unsigned char local_ip[] = {192,168,1,2};      // IP address of WiShield
unsigned char gateway_ip[] = {192,168,1,1};      // router or gateway IP address
unsigned char subnet_mask[] = {255,255,255,0};      // subnet mask for the local network
const prog_char ssid[] PROGMEM = {"ASYNCLABS"};            // max 32 bytes

unsigned char security_type = 0;      // 0 - open; 1 - WEP; 2 - WPA; 3 - WPA2

// WPA/WPA2 passphrase
const prog_char security_passphrase[] PROGMEM = {"12345678"};      // max 64 characters

// WEP 128-bit keys
// sample HEX keys
prog_uchar wep_keys[] PROGMEM = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,      // Key 0
                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,      // Key 1
                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,      // Key 2
                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00      // Key 3
                       };

// setup the wireless mode
// infrastructure - connect to AP
// adhoc - connect to another WiFi device
unsigned char wireless_mode = WIRELESS_MODE_INFRA;

unsigned char ssid_len;
unsigned char security_passphrase_len;
// End of wireless configuration parameters ----------------------------------------

void setup() {....}

void loop(){....}

etc...


Ce que je voudrais c'est une methode qui lit par connection Serial et qui declare les variable ensuite.

Comme ca:
Code: [Select]


void lireSerial() {
   const prog_char ssid[] PROGMEM = {(prog_char)*(Serial.read())};

   etc....
}

void setup() {....}

void loop(){....}

etc...


Sauf que le probleme c'est que puisque les variable sont declare dans une methode elle sont locale et pas accessible par les biblioteque de la WiShield.[size=12] Et je ne peux pas les declare avant car les variable sont constante[/size]. Je ne vois pas se que je peux faire.

Merci pour toute sugestion.  :)

Cyril

Teiva

Bonjour,
En effet tu ne peux pas modifier une variable déclarée const, et encore moins PROGMEM (dans la flash).
Il faut que tu déclares les variables sans const et PROGMEN ainsi elle seront dans la ram et tu pourras les modifier, évidemment ça prend de la place dans la ram et il n'y en a pas beaucoup  ;)
De plus si tu n'initialises pas la variable il faut déclarer sa taille.

donc dans la décla globale à la place de :
const prog_char ssid[] PROGMEM = {"ASYNCLABS"};
tu remplaces par
char ssid[16];  // 15 char + fin de chaine \0
si tu as une valeur par défaut à mettre :
char ssid[16] = {"ASYNCLABS"};

ensuite ton programme
int i=0; // un indice pour le tableau
... une boucle de lecture des chars du serial ...
ssid[i++] = (char)Serial.read(); // Transforme int en char
... verif de ne pas dépasser la longueur max de ssid
... a la fin ...
ssid = 0; // pour la fin de chaine


En espérant que ça va t'aider  ;)

PS : comment on fait pour mettre des citations de code ???
A+


www.Zartronic.fr : Arduino & Robotique

jvpython

Bonjour
Merci beaucoup pour l'info. Il y a juste un problème. Pour que la WiShield marche il faux que la variable ssid soit const et PROGMEM sinon j'ai une erreur de compilation.

PS: pour mettre du code click sur # dans la bar de format. :)

Cyril

Teiva

C'est quoi l'erreur ?
Car en effet en changeant le type tu dois tout recompiler, y compris la librairie, et certaines fonctions qui utilise cette variable on peut être une déclaration de type const progmem, alors il va falloir les modifier ...
Peut être il faut trouver une autre approche ...
A+


www.Zartronic.fr : Arduino & Robotique

Go Up