Go Down

Topic: Conflit entre GSM et SoftwareSerial (Read 1 time) previous topic - next topic

Ilaan

Bonjour à tous,

Je viens d'apprendre qu'il y aurait un conflit entre les bibliothèques GSM et SoftwareSerial, car le GSM aurait sa propre version de SoftwareSerial.
Je me tourne vers vous pour savoir s'il y a une solution à cela, sans utiliser AltSoftSerial car ça me ferais revoir énormément de choses, étant donné la complexité de mes programmes..

Voilà mon erreur de compilation :
Code: [Select]
GSM\GSM3SoftSerial.cpp.o: In function `__vector_9':
C:\Elec\Arduino\arduino-1.6.5\libraries\GSM\src/GSM3SoftSerial.cpp:499: multiple definition of `__vector_9'
SoftwareSerial\SoftwareSerial.cpp.o:C:\Elec\Arduino\arduino-1.6.5\hardware\arduino\avr\libraries\SoftwareSerial/SoftwareSerial.cpp:227: first defined here
c:/elec/arduino/arduino-1.6.5/hardware/tools/avr/bin/../lib/gcc/avr/4.8.1/../../../../avr/bin/ld.exe: Disabling relaxation: it will not work with multiple definitions
GSM\GSM3SoftSerial.cpp.o: In function `GSM3SoftSerial::spaceAvailable()':
C:\Elec\Arduino\arduino-1.6.5\libraries\GSM\src/GSM3SoftSerial.cpp:487: multiple definition of `__vector_10'
SoftwareSerial\SoftwareSerial.cpp.o:C:\Elec\Arduino\arduino-1.6.5\hardware\arduino\avr\libraries\SoftwareSerial/SoftwareSerial.cpp:392: first defined here
GSM\GSM3SoftSerial.cpp.o: In function `GSM3SoftSerial::spaceAvailable()':
C:\Elec\Arduino\arduino-1.6.5\libraries\GSM\src/GSM3SoftSerial.cpp:487: multiple definition of `__vector_11'
SoftwareSerial\SoftwareSerial.cpp.o:C:\Elec\Arduino\arduino-1.6.5\hardware\arduino\avr\libraries\SoftwareSerial/SoftwareSerial.cpp:392: first defined here
collect2.exe: error: ld returned 1 exit status
Erreur lors de la compilation.


Voilà, si jamais quelqu'un saurait m'aider, je lui en serais reconnaissant !

Merci beaucoup.

hbachetti

Salut
Quel est l'intérêt d'utiliser SoftwareSerial et GSM3SoftSerial dans le même projet ?

@+
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

Ilaan

Bonjour,

En fait le SoftwareSerial me permet de communiquer entre une MEGA et une YUN, et le GSM à envoyer un sms lorsqu'un des capteurs s'active.

hbachetti

GSM3SoftSerial utilise les pins TX et RX en 3 et 2.
SoftwareSerial te laisse libre de choisir les pins qui t'arrangent, à passer en paramètres au constructeur.

Rien ne t'empêche d'utiliser 2 instances de SoftwareSerial, donc, et donc d'éliminer GSM3SoftSerial.
Les principales méthodes begin, read, write ont la même signature, cela ne devrait pas poser trop de problèmes.

@+
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

Ilaan

Mais mon SoftwareSerial est en 8, 9
Donc je ne vois pas où est le problème s'il utilise 2 et 3..

hbachetti

Le problème est que les deux librairies possèdent des fonction - apparemment des routines d'interruption - qui portent le même nom, et donc rendent ces librairies incompatibles entre elles.

Il faut faire un choix.

@+
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

Apex142

Si tu utilise un GSM normalement dans presque tout les gsm il y a des commandes AT, et c'est beaucoup plus simple à utilisé qu'une library (pour mo).

hbachetti

Dans SoftwareSerial.cpp :

Code: [Select]

#if defined(PCINT0_vect)
ISR(PCINT0_vect)
{
  SoftwareSerial::handle_interrupt();
}
#endif

#if defined(PCINT1_vect)
ISR(PCINT1_vect, ISR_ALIASOF(PCINT0_vect));
#endif

#if defined(PCINT2_vect)
ISR(PCINT2_vect, ISR_ALIASOF(PCINT0_vect));
#endif

#if defined(PCINT3_vect)
ISR(PCINT3_vect, ISR_ALIASOF(PCINT0_vect));
#endif


Dans GSM3SoftSerial.cpp :

Code: [Select]

#if defined(PCINT0_vect)
ISR(PCINT0_vect)
{
  GSM3SoftSerial::handle_interrupt();
}
#endif

#if defined(PCINT1_vect)
ISR(PCINT1_vect)
{
  GSM3SoftSerial::handle_interrupt();
}
#endif

#if defined(PCINT2_vect)
ISR(PCINT2_vect)
{
  GSM3SoftSerial::handle_interrupt();
}
#endif

#if defined(PCINT3_vect)
ISR(PCINT3_vect)
{
  GSM3SoftSerial::handle_interrupt();
}
#endif


Les deux bibliothèques installent les mêmes routines d'interruption.
Dommage que GSM3SoftSerial ne permette pas d'utiliser d'autres pins que 2 et 3. Cela aurait permis de créer deux instances.

Il te faut probablement envisager un autre moyen de communication entre MEGA et YUN.
Quelle distance ?

@+

Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

infobarquee

bonjour,
pour utiliser SoftwareSerial en plus sur une mega?
la mega a plusieurs pin série d'origine.
serial, serial1, 4 de mémoire

Quote
The Arduino Mega has three additional serial ports: Serial1 on pins 19 (RX) and 18 (TX), Serial2 on pins 17 (RX) and 16 (TX), Serial3 on pins 15 (RX) and 14 (TX).
AUCUNE AIDE PAR MP

hbachetti

Ce n'est pas idiot ça monsieur infobarquee.
A force de bosser avec des MINI et des NANO on oublie ce détail.

Tiré de https://www.arduino.cc/en/serial/begin

Code: [Select]

void setup(){
  Serial.begin(9600);
  Serial1.begin(38400);
  Serial2.begin(19200);
  Serial3.begin(4800);

  Serial.println("Hello Computer");
  Serial1.println("Hello Serial 1");
  Serial2.println("Hello Serial 2");
  Serial3.println("Hello Serial 3");
}


Donc pas besoin de SoftwareSerial.

@+
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

Ilaan

Sauf que je communique pas entre 2 mega mais entre une mega et une Yun donc impossible pour moi d'utiliser serial1,2,3 ou 4.
J'avais déjà réfléchis à cette option, sinon la distance entre les deux cartes est de quelques centimètres (même pas 10)

J'ai bloqué pendant 1 mois et demi sur la communication entre les deux cartes et ça m'embeterais beaucoup de devoir renoncer au SoftwareSerial..

Merci de votre aide à tout les deux

hbachetti

Donc SoftwareSerial côté YUN. Une seule ligne série.

GSM3SoftSerial et SoftwareSerial étant incompatibles, tu peux envisager SPI ou I2C. Avec 10cm de fils ça passe à l'aise.
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

infobarquee

je vois pas le soucis pour l'utilisation des serial sur la mega.
ca évite d'utiliser une lib en plus qui entre en conflit.

explique mieux la chose
AUCUNE AIDE PAR MP

hbachetti

Quote
Sauf que je communique pas entre 2 mega mais entre une mega et une Yun donc impossible pour moi d'utiliser serial1,2,3 ou 4.
Apparemment le problème est plutôt côté YUN, pas MEGA.

Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

Ilaan

Non le GSM lui est sur la mega, et c'est la compilation de la mega qui ne fonctionne pas.. je n'ai pas le matériel je ne l'aurais que lundi à 14:00 donc je peux rien essayer pour le moment..

Go Up