Pages: [1]   Go Down
Author Topic: Comment gérer la taille d'un char  (Read 347 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Sr. Member
****
Karma: 0
Posts: 394
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour à tous,

Me voilà de retour sur mon projet apèrs une petite pause obligatoire  smiley

Je dois répondre a une question de taille d'une variable de type char.

En gros, je dois envoyé des valeurs au format xml. Ces valeurs sont collectées toutes les minutes et enregistrés dans un EPROM.
Je ne souhaite pas que ces valeurs soient envoyés toutes les minutes, mais toutes les 5 minutes. Donc toutes les minutes il y aura 5 set de valeurs
Aussi s'il n'y a pas de réseau 3G, elles peuvent etre envoyé après 10 ou 15 mn, et évidement le contenu de l'EEPROM augmente jusqu'a l'envoi.

L'envoi
Pour envoyé ces valeurs au serveur, j'utilise une fonction d'une librairie
Code:
//inet.httpPOST(host, port, path, coords, "Result", 0);
Format des données
C'est la valiable "coords", de type char, qui contient les données.
Un set de donnée est sous cette forme
Quote
char coords["<fix><co>123456</co><lo>46.23546542341</lo><la>462.3546542341</la><al>457.0000000000</al><ti>20131025122500</ti><ve>1.00000000000</ve><st>1</st></fix>"]
Mais vu qu'il doit envoye 5 set tous les 5 minutes, la variable "coords" prendra ceci (avec des valeurs différentes bien sure):
Quote
char coords["<fix><co>123456</co><lo>46.23546542341</lo><la>462.3546542341</la><al>457.0000000000</al><ti>20131025122500</ti><ve>1.00000000000</ve><st>1</st><co>123457</co><lo>46.23546542341</lo><la>462.3546542341</la><al>457.0000000000</al><ti>20131025122500</ti><ve>1.00000000000</ve><st>1</st><co>123458</co><lo>46.23546542341</lo><la>462.3546542341</la><al>457.0000000000</al><ti>20131025122500</ti><ve>1.00000000000</ve><st>1</st><co>123456</co><lo>46.23546542341</lo><la>462.3546542341</la><al>457.0000000000</al><ti>20131025122500</ti><ve>1.00000000000</ve><st>1</st><co>123459</co><lo>46.23546542341</lo><la>462.3546542341</la><al>457.0000000000</al><ti>20131025122500</ti><ve>1.00000000000</ve><st>1</st></fix>"]
et s'il n'y a pas de connection réseau, et bien il y a plus de données à envoyé

Donc je dois me mettre dans l'hypothese ou je suis en montagne, mon GPS collecte les données et les stock dans mon EEPROM. Mais en montagne il ne peu ne pas avoir de connection 3G pendant, une heure, ou plus.

Dans mon char coords peut devenir très gros.


Donc j'ai une question, comment puis gérer mon char coords, sans que mon Arduino Mini Pro crash, sachant que j'ai déjà 25k604 de code (sketch size) sur 32k720?????

Je vous remercie pour vos lumières et vous souhaite un bon week.end, d'avance


Logged

Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!

Ales
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3628
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Les variables ne vont pas dans la flash mais dans la RAM smiley-wink

Donc je te conseille tout simplement de réserver un espace mémoire :

char coord[1000]; // la "j'ai droit" à  1000 caractères

Voila, l'espace en RAM est réservé smiley-wink Maintenant attention, il y a d'autres consommateurs de RAM, et il ne faut pas la saturer. La ça fait 1ko soit la moitié de la RAM ...

Comment optimiser : il y a beaucoup de caractère qui reviennent, autant les mettre dans la flash (fonction F()), et ne stocker dans l'EEPROM que ce qui nécessaire (tes coordonnées). Et lorsque tu as du réseau tu recomposes et tu envois.
Logged


Offline Offline
Sr. Member
****
Karma: 0
Posts: 394
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hai, ben le problème c'est qu'il me reste 191 de mémoire. Donc je ne peux pas faire grand chose.

Quote
Comment optimiser : il y a beaucoup de caractère qui reviennent, autant les mettre dans la flash (fonction F()), et ne stocker dans l'EEPROM que ce qui nécessaire (tes coordonnées). Et lorsque tu as du réseau tu recomposes et tu envois.
En fait tout est stocké dans mon EEPROM

Tout ca, c'est extrait de l'EEPROM
Quote
<co>123456</co><lo>46.23546542341</lo><la>462.3546542341</la><al>457.0000000000</al><ti>20131025122500</ti><ve>1.00000000000</ve><st>1</st><co>123457</co><lo>46.23546542341</lo><la>462.3546542341</la><al>457.0000000000</al><ti>20131025122500</ti><ve>1.00000000000</ve><st>1</st><co>123458</co><lo>46.23546542341</lo><la>462.3546542341</la><al>457.0000000000</al><ti>20131025122500</ti><ve>1.00000000000</ve><st>1</st><co>123456</co><lo>46.23546542341</lo><la>462.3546542341</la><al>457.0000000000</al><ti>20131025122500</ti><ve>1.00000000000</ve><st>1</st><co>123459</co><lo>46.23546542341</lo><la>462.3546542341</la><al>457.0000000000</al><ti>20131025122500</ti><ve>1.00000000000</ve><st>1</st>

Simplement pour envoyé au serveur avec la fonction
Code:
inet.httpPOST(host, port, path, coords, "Result", 0);
La variable doit etre grande pour tout contenir
Logged

Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!

Ales
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3628
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Le problème c'est que ça doit forcément passer par la RAM puisque ta chaîne est ensuite traitée pour l'envoi. Donc tu l'as dans l'os ... Sur Atmega 328 en tout cas ! Il te reste toujours l'option de passer à plus gros, Mega (ram =8 ko) ou Sanguino (Ram = 4ko)

Autre option : envoi de plusieurs messages tout simplement.
Logged


France
Offline Offline
Faraday Member
**
Karma: 38
Posts: 3515
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hai, ben le problème c'est qu'il me reste 191 de mémoire. Donc je ne peux pas faire grand chose.

Il suffit de découper la chaîne à envoyer en petits morceaux qui seront reconstitués à l'arrivée. Ce qui demandera un buffer de taille plus réduite.
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 394
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok aussi, je peux commencer à diminuer certain char.

Par exemple, j'ai 4 char qui fau aussi ofice de tempo

lon, lat, vel, alt, time

Dans l'exemple de la librairie que j'utilise il est indiqué qu'il faut les déclarer ainsi

Code:
char lon[15]
char lat[15]
char alt[15]
char vel[15]
char time[15]
gps.getPar(lon,lat,alt,tim,vel);

Serial.println(lon);
Serial.println(lat);
Serial.println(alt);
Serial.println(vel);
Serial.println(time);

Maintenant une latitude ou altitude à 15 numero, ca fait peut etre un peu beaucoup surtout que ca fini souvent avec 4-5 zéro et 10 après la virgule.

Donc je me suis dit que je pouvais changer ainsi
Code:
char lon[9]
char lat[9];
char alt[9];
char vel[9];
char time[14]; //20131027073510, YYYYMMDDHHMMSS

Mais la je ne risque pas de fait bloquer mon programme vu que les chiffres sont plus grand que le char?
Si non, dois-je modifier aussi ,ma librairie pour qu'elle retourne des chiffre a 8 ou 14 chiffres?
Logged

Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!

Pages: [1]   Go Up
Jump to: