ne pas etre obliger d'utiliser SoftwareSerial.h

Bonjour,

De nombreuse librairie utilise #include <SoftwareSerial.h> pour ne pas utiliser les port physique rx/tx.

Y a t’il une solution afin de pouvoir forcer une librairie a utiliser un RX/TX physique ?

#include <SerialGSM.h>
#include <SoftwareSerial.h>
SerialGSM cell(2,3);

Merci

SerialGSM.zip (5.48 KB)

Bonjour,

SerialGSM est écrit pour utiliser SoftwareSerial. Il faudrait le modifier pour utiliser SerialX.

Selon leur type, les modules Arduino disposent d'une seule ou plusieurs liaisons série "physiques". Toutes les autres liaisons de ce type que l'on peut adjoindre à un Arduino ne sont qu'émulées par soft.

La bibliothèque SoftwareSerial et autres équivalents ne servent pas à ne pas utiliser la liaison physique mais à ajouter d'autres liaisons non disponibles "physiquement".

Cordialement.

Pierre

Merci Ok mais ou trouver une bibliothèque qui n'utilise pas SoftwareSerial.h ? y a que ça partout :( (je n'est plus de port digital disponible)

Quel port série tu veux utiliser? Si tu compte utiliser Serial tu risques d'aller au devant de problèmes (mais ce n'est pas impossible) car c'est le port qui est utilisé pour communiquer avec le PC (sur les cartes avec processeur AVR)

Si les bibliothèques que vous trouvez utilisent "SerialSoftare", c'est que, a priori, ça fonctionne avec.

Alors pourquoi vouloir absolument utiliser une liaison physique ? Y a-t-il un avantage en cela ?

Cordialement.

Pierre

ChPr:
Alors pourquoi vouloir absolument utiliser une liaison physique ? Y a-t-il un avantage en cela ?

Parce que a priori:

djbouns:
(je n’est plus de port digital disponible)

Notre ami doit vouloir utiliser les broches 0 et 1.

Par contre

Quelle est la carte utilisé?

Tu évoques “plus de port digital” mais qu’en est-il des broches ‘injustement’ appelée Analogique?

Bonjour,

C'est une mega j'utilise le rx/tx1 pour mon WIFI Je veut utiliser le rx/tx2 pour le gsm Le rx/tx0 n'est pas utilisé.

soit tu modifies la librairie pour utiliser Serial2 soit tu utilises SoftwareSerial sur les pins 16 et 17 (ce qui est un peu dommage alors qu'il existe des serial hard libres).

kamill: soit tu modifies la librairie

Justement, j'y pensait mais je ne vois pas comment faire dans tout se M......

Dans la bibliothèque du GSM, il faut :

  • supprimer l'instanciation de l'objet SoftwareSerial. Supposons que ce soit : "SoftwareSerial gsmSerial(RX, TX)"
  • remplacer le "gsmSerial.begin(Fréquence);" par "Serial2.begin((Fréquence);"
  • remplacer toutes les occurrences relatives à "gsmSerial" par "Serial2". Cordialement.

Pierre

Comme dit ChPr il faut remplacer toutes les références à SoftwareSerial par Serial2.

Si tu veux faire quelque-chose de plus universel, tu peux aussi passer un pointeur vers le SerialX que tu veux utiliser dans le constructeur. Tu peux aussi utiliser un template.

ChPr: Dans la bibliothèque du GSM, il faut :

  • supprimer l'instanciation de l'objet SoftwareSerial. Supposons que ce soit : "SoftwareSerial gsmSerial(RX, TX)"
  • remplacer le "gsmSerial.begin(Fréquence);" par "Serial2.begin((Fréquence);"
  • remplacer toutes les occurrences relatives à "gsmSerial" par "Serial2".

Cordialement.

Pierre

C'est pas tout a fait comme ca,

Dans le fichier serialGSM.h j'ai ca :

class SerialGSM : public SoftwareSerial {
public:
  SerialGSM(int rxpin,int txpin);

et dans le fichier serialGSM.ccp j'ai :

SerialGSM::SerialGSM(int rxpin,int txpin):
SoftwareSerial(rxpin,txpin)

C’est parce que l’auteur a décidé d’en faire une sous classe de SoftwareSerial, ce qui est un choix d’architecture objet discutable

l’auteur aurait pu en faire une sous classe de Print et et avoir une variable d’instance qui pointe vers soit un HarwareSerial, soit un SoftwareSerial. Ce n’est pas super difficile à changer

Mais En pratique lisez les peu de lignes de la “librairie” les fonctions majoritairement ne font qu’encapsuler des this->print() codés en dur avec la commande AT qui va bien sans même se soucier de la réponse ‘donc pas super robuste ! )... le concept est général, faites en simplement des fonctions de votre projet et changez this-> enSerial2. quand il s’agit de fonctions héritées de la classe Stream ou Print et juste un appel de fonctions locale si c’est une des méthodes locales de l’objet.

Note

Si vous modifiez la librairie (elle est GPLV3 donc pensez aux attributions) il y a ces méthodes

void SerialGSM::Sender(char * var1){
    sprintf(sendernumber,"%s",var1);
}


void SerialGSM::Rcpt(char * var1){
    sprintf(rcpt,"%s",var1);
}

void SerialGSM::Message(char * var1){
    sprintf(outmessage,"%s",var1);
}

ce qui est une hérésie sur un petit micro-contrôleur car l’usage de sprintf() va inclure une fonction gigantesque pour rien. Remplacez ça par

void SerialGSM::Sender(char * var1){
    strcpy(sendernumber,var1);
}


void SerialGSM::Rcpt(char * var1){
    strcpy(rcpt,var1);
}

void SerialGSM::Message(char * var1){
    strcpy(outmessage,var1);
}

Et dans l’absolu un strncpy avec la taille du buffer et en prenant soin du ‘\0’ final serait plus robuste même

Vu la légèreté de la librairie, je m'en passerai et coderai a la main les utilisations de commande AT.

A la limite en re-pompant le contenu des fonctions que tu utilises vraiment

Jambe: Vu la légèreté de la librairie, je m'en passerai et coderai a la main les utilisations de commande AT.

A la limite en re-pompant le contenu des fonctions que tu utilises vraiment

Oui, ça a fini comme ça ... et sa marche enfin ... merrrccccciiiiiii