Conflit entre GSM et SoftwareSerial

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 :

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.

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

@+

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.

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.

@+

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

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.

@+

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).

Dans SoftwareSerial.cpp :

#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 :

#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 ?

@+

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

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).

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 Serial.begin() - Arduino Reference

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.

@+

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

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.

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

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.

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..

Dans ce cas je ne comprends pas ce commentaire :

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.

Tu ne comprend pas quoi?

Si ton GSM est sur la MEGA, rien ne t'empêche de communiquer avec la YUN sans passer par SoftwareSerial, simplement en utilisant une vraie ligne série : Serial1, Serial2, ou Serial3.

@+

Tu saurais me dire comment ?
Mon prof ne me l’a pas dis je pense pas qu’il le sache..

Merci :slight_smile:

Voir post #9