Unterschied zwischen SoftwareSerial und Serial


7

Aus dem Beispielcode

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
void setup()  
{
  // Open serial communications and wait for port to open:
  Serial.begin(57600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  Serial.println("Goodnight moon!");
  // set the data rate for the SoftwareSerial port
  mySerial.begin(4800);
  mySerial.println("Hello, world?");
}

void loop() // run over and over
{
  if (mySerial.available())
    Serial.write(mySerial.read());
  if (Serial.available())
    mySerial.write(Serial.read());
}

Was ist der Unterschied zwischen, warum zwei Arten von Anrufen verwenden, um AT-Befehlsaufrufe zu tätigen.

SoftwareSerial mySerial (10,11) mySerial.begin (10,11)

und

Serial.begin (9600)

Bearbeiten, dies beantwortet meine Frage in meinen eigenen Worten basierend auf der Antwort von @jfpoilpret.

  1. Es ist wichtig, sowohl Serial als auch SoftwareSerial zu initialisieren , da SoftwareSerial zum Senden der eigentlichen Befehle an das GSM verwendet wird und Serial für viewalle Befehle und deren Antworten am Debug-Port des GSM verwendet wird
  2. Die Pins am GSM und am Arduino werden verwendet, um die 2 zu verbinden und die tatsächlichen Befehle weiterzuleiten . Während der RS232 nur zum Debuggen verwendet wird. Wir können jedoch einen RS232 an einen USB-Anschluss anschließen, um das GSM an den Desktop (oder Laptop) anzuschließen.
  3. Der Code in der Schleife ist wichtig, um alle tatsächlichen Befehle in den RS232-Debugging-Port umzuwandeln und umgekehrt, damit wir ein Tool wie cutecom(auf Ubuntu) verwenden können, um Befehle an die seriellen GSM-Eingangsstifte zu übergeben.

Wichtiger Hinweis: Stellen Sie bei Verwendung von cutecom sicher, dass Sie das CR-Zeilenende auswählen , um Befehle zu senden.

Antworten:


7

Alle Atmel-MCUs, auf denen Arduino-Modelle basieren, enthalten spezielle Hardware für die serielle Kommunikation. Dieser Teil der MCU heißt USART (steht für Universal Synchronous / Asynchronous Receiver / Transmitter ).

Basierend auf dem Arduino-Modell, das Sie haben, haben Sie möglicherweise nur einen (z. B. UNO) oder mehrere USART (Leonardo, Mega ...) auf der Board-MCU.

Jeder MCU USART ist bestimmten Pins der Karte zugeordnet. Sie können diese Pins nicht ändern.

Wenn Sie unter Arduino den Monitor verwenden, um Debug-Informationen an Ihren PC zu senden, wird ein USART verwendet Serial.

Wenn Sie mehr als eine serielle Kommunikationsverbindung benötigen (z. B. weil Sie einige Geräte haben, die seriell kommunizieren), Ihr Arduino-Modell jedoch nur einen USART hat, müssen Sie die Bibliothek verwenden SoftwareSerial, die den Job eines USART nur per Software "simuliert". Daher ist es viel weniger optimiert als die Hardware USART.

Ein Vorteil von SoftwareSerialist, dass Sie es jedem beliebigen Pin-Paar zuordnen können.

Gehen Sie zu Ihrem Codebeispiel:

if (mySerial.available())
    Serial.write(mySerial.read());
if (Serial.available())
    mySerial.write(Serial.read());

Offensichtlich wird hier Serialzum Debuggen (Senden von Informationen an den seriellen Monitor Ihres PCs) verwendet, während mySerialhier für die Kommunikation mit dem GSM-Gerät verwendet wird.

Mit dieser Skizze können Sie also AT-Befehle auf dem Monitor eingeben, die dann an das GSM-Gerät weitergeleitet werden. Umgekehrt werden alle vom GSM-Gerät zurückgegebenen Zeichenfolgen an den seriellen Monitor zurückgegeben.


Ich verwende das SIM808-Modul mit Arduino Uno. Eine Sache, die ich nicht verstehe, ist, wenn ich TX1 und RX0 von Arduino für die Kommunikation mit dem GSM-Modul verwende. Während des Upload-Vorgangs wird eine Fehlermeldung in der Arduino-Software angezeigt: so etwas wie 'avrude ... . '. Wenn ich jedoch die SoftwareSerial-Einstellung tx- und rx-Pins auf Pin7 und Pin8 verwende, gibt es kein Problem beim Hochladen, wenn Pins verbunden sind. Eine andere Sache ist, dass, wenn verschiedene Versionen von Arduino verwendet werden, wie Sie mit dem GSM-Gerät kommunizieren, wenn Sie SoftwareSerial nicht verwenden? Ich habe Code für andere Versionen von Arduino und SIM908 gesehen, bei denen SoftwareSerial lib. wird überhaupt nicht verwendet.
RegarBoy

0
#include <SoftwareSerial.h>

SoftwareSerial GSMSerial(7, 8); //use pins 7 and 8 as RX and TX

void setup() {
   GSMSerial.begin(19200);               // the GPRS/GSM baud rate   
   Serial.begin(19200);                 // the GPRS/GSM baud rate   
}

void loop() {
    if(Serial.available()) {
       //to send commands received from Serial Monitor to GSM module
       GSMSerial.print((char)Serial.read());
    }
    else  if(GSMSerial.available()) {
       //To print data responded from GSM module to the Serial Monitor.  
       Serial.print((char)GSMSerial.read());
    }
}

Im obigen Code innerhalb der Schleifenfunktion ist die erste ifAnweisung erforderlich, um vom seriellen Monitor aus mit dem GMS-Modul zu kommunizieren. Wenn Sie beispielsweise ATden Monitor eingeben und die Eingabetaste drücken, wird Ihr Befehl an das GSM-Modul gesendet.

Die zweite if-Anweisung else ifbesteht darin, alles zu drucken, was vom GSM-Modul empfangen oder beantwortet wurde, z. B. antwortet das GSM-Modul auf den empfangenen Befehl wie ATund dessen Ergebnis, OKnachdem Sie den Befehl ATan das Modul gesendet haben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.