tweede serieele poort d.m.v. SoftwareSerial.h

Arduino specifieke Software
Berichten: 17
Geregistreerd: 06 Feb 2013, 19:30

tweede serieele poort d.m.v. SoftwareSerial.h

Berichtdoor retlawrobbe » 06 Feb 2013, 19:58

Hallo iedereen,

Ik ben bezig met een project om voor een RC model vliegtuig de hoogte, snelheid coordinaten enz op de grond te volgen, dit door middel van een GPS welke in het RC vliegtuig zit en de data doorstuurd via een XBEE naar een grondstation, een XBEE in het grondstation is aangesloten op de klassieke RX TX poort van de ARDUINO Fio ( welke standaard voorzien is van een socket opm een XBEE in te plaatsen ).
Nu wou ik in het grondstation een tweede GPS gebruiken om in geval van een crasch het vliegtuig terug te kunnen opsporen?
Daarom moest er een tweede serieele poort gedefinieerd worden en dan komt de kat op de koord! zie verder

Ik heb een probleem bij het uitlezen van data op een tweede RX poort, ( Uitzenden van data op de TX poort geeft geen probleem b.v. bij het zenden van de welomgekende tekst "Hello World" is er geen enkel probleem.
Uitlezen van de RX poort geeft soms goede en soms verkeerde letters, wanneer ik de volgende letter reeks
"ABCDEFGHIJKLMNOPQRSTUVW123456789" doorstuur naar de RX poort zend en uitlees met de instructie xbyteGPS = Internal_GPS.read();
geeft dit als resultaat ABÃDE†GH‰JKÌMNÏPQ²TU–W1r3456788 of ABƒDEÆGH™JKÌLNQ²STÕVWq23456w89
Zoals je kan zien zijn enkele letters juist zijn en andere niet , na uren en uren gezocht te hebben op het internet kan ik geen oplossing vinden.
De normale serie poort werkt zonder problemen , maar ik zou graag een tweede GPS via een nieuwe tweede seriale poort willen uitlezen.
Hopelijk is er iemand die ook al hetzelfde probleem ervaren heeft en er een oplossing voor heeft, of toch enkele tips kan geven welke tot een mogelijke oplossing kan leiden.

De test code voor het uitlezen van de tweede GPS is als volgt :

Code: Alles selecteren
 #include <SoftwareSerial.h>
 
   const int rxpin = 6;        // INTER GPS D6 pin used to receive from GPS
   const int txpin = 7;        // INTER GPS D7 pin used to send to GPS
   SoftwareSerial Internal_GPS(rxpin, txpin);
   #define maxlin 50   //int  maxlin = 200;
   char linea[maxlin] = "";
   char buf;
   
void setup() {
   Serial.begin(38400);
   Internal_GPS.begin(38400);
   Internal_GPS.listen();
 
}

void loop() {
 getGpsData();
}

 void getGpsData(){
   int xbyteGPS = -1; 
   int xconta = 0;
   
   for (int i=0;i<maxlin;i++){ linea[i]=' '; }
     while ( xconta < maxlin ){
         
        // Read a byte of the serial port 
readB:    xbyteGPS = Internal_GPS.read();
        if (xbyteGPS == -1 ) {
          goto readB;
        } else {
          buf = xbyteGPS;
          Internal_GPS.print(buf); Serial.print(buf);
         
            linea[xconta]=xbyteGPS;
            xconta++;
        } // else byte |= -1
      } //end while
      Internal_GPS.print("Hello,world?----------------");
     for (int i=0;i<xconta;i++){
       Internal_GPS.print(linea[i]);
     Serial.print(linea[i]);
   }
     
 }
Laatst gewijzigd door retlawrobbe op 07 Feb 2013, 19:44, in totaal 1 keer gewijzigd.

Advertisement

Gebruikers-avatar
Berichten: 270
Geregistreerd: 30 Dec 2012, 11:42

Re: tweede serieele poort d.m.v. SoftwareSerial.h

Berichtdoor Rudi » 06 Feb 2013, 20:33

Laat me beginnen met te zeggen dat ik nog nooit van de Fio had gehoord :oops: maar los daarvan lijkt het duidelijk om een timing probleem te gaan waardoor sommige karakters (meestal om drie karakters) verminkt toekomen of worden uitgelezen. Misschien is 38400 bps wel te snel voor de Fio om hardwarematig bij te houden in combinatie met de snelheid van de eerste seriele poort. Wilde gok hoor.
Arduinows!
Why do computer programmers confuse Halloween with Christmas? Because Oct 31 = Dec 25
I got 01100011 problems but a bit ain't 00000001

Gebruikers-avatar
Berichten: 116
Geregistreerd: 23 Dec 2011, 00:11
Woonplaats: Enschede

Re: tweede serieele poort d.m.v. SoftwareSerial.h

Berichtdoor bigred » 07 Feb 2013, 01:28

Welke Arduino software versie gebruik je ?
Voor de oudere versies van arduino (voor 1.0) is de software serial bibliotheek erg slecht.
Hiervoor is destijds ook een nieuwe bibliotheek geschreven met de naam newsoftwareserial.

In versie 1.0 is de newsoftwareserial geïntegreerd als softwareserial en is de oude helemaal komen te vervallen .

informatie (helaas alleen in het Engels te vinden):
http://www.pjrc.com/teensy/td_libs_SoftwareSerial.html
http://www.pjrc.com/teensy/td_libs_NewSoftSerial.html

Berichten: 17
Geregistreerd: 06 Feb 2013, 19:30

Re: tweede serieele poort d.m.v. SoftwareSerial.h

Berichtdoor retlawrobbe » 07 Feb 2013, 12:09

Bedankt voor de snelle reactie
Rudi
Mij lijkt het ook een timing probleem , maar aangezien de baudrate van beide GPS(en) 38400 is zal ik me daaraan wel moeten houden.
ik heb gezien dat de baudrate is gedefinieerd in de file SoftwareSerial.cpp, misschien kan ik wat naar onder of boven met de baudrate en zien wat dit geeft.
Hopelijk kan ik het vandaag nog uittesten door de baudrate aan te passen in de .cpp file en mijn testprogramma.

bigred
Ik gebruik de versie 1.0.3 waarin de SoftwareSerial reeds is ingevoerd.
Ik had ook reeds de twee linken gelezen waaruit blijkt dat ( toch volgens mijn idee en kennis van het engels)
met gebruik van 1.0.3. De reeds ingesloten library SoftwareSerial moet gebruikt worden
Ik heb voor de aardigheid eens een include van de NewSoftSerial uitgebrobeerd maar dan krijg ik een fout bij
het compileren van mijn testprogrammaatje.
Opmerking in de file In de file SoftwareSerial .cpp staat in het commentaar op de eerste lijn SoftwareSerial.cpp (formerly NewSoftSerial.cpp) -

Berichten: 85
Geregistreerd: 10 Jan 2013, 14:51
Woonplaats: Waddinxveen

Re: tweede serieele poort d.m.v. SoftwareSerial.h

Berichtdoor Karel » 07 Feb 2013, 12:33

Je kan ook eens naar het protocol van die interne GPS kijken. Zijn je GPS-en van hetzelfde type?
In seriële communicatie bestaan diverse protocollen: 7 of 8 bits data, 1 of 2 stopbits, Even, Oneven of geen parity, Handshake met XON/XOFF of hardwarematig. Misschien kan je er iets over vinden in de specs van je interne GPS.

Groet, Karel
If you think education is expensive, try ignorance! (Derek Bok)

Berichten: 17
Geregistreerd: 06 Feb 2013, 19:30

Re: tweede serieele poort d.m.v. SoftwareSerial.h

Berichtdoor retlawrobbe » 07 Feb 2013, 14:26

Karel
De specificaties van de GPS zijn de klassieke Baudrate = 38400 , databits = 8 ,Parity = No parity , Stop bits = 1 ,
Flow = None (*)
Met een Serial port terminal emulator op PC kunnen al deze parameters naar believen gewijzigd worden en nagekeken of het resultaat beter is of niet.
Met elke afwijking van de klassieke instellingen werd het resultaat er niet beter op!
Het aanpassen van de parameters in de libray files kan ik niet met mijn SW kennis

Rudi
Bij het testen op 19200Baud blijkt wat ik opstuur ( niet het GPSsignaal maar met een Serial port termilal emulator op PC ) ook correct gelezen worden alles wijst wel degelijk in de richting van de snelheid, maar aangezien ik de baudrate van de GPS niet kan aanpassen blokkeer ik daar wel op.

Als test heb ik de file SoftwareSerial.cpp eens aangepast m.a.w. alle vermeldingen met 38400 gewijzigd
naar 38350 baud
Het resultaat werd er niet beter op

Groeten Walter

Berichten: 17
Geregistreerd: 06 Feb 2013, 19:30

Re: tweede serieele poort d.m.v. SoftwareSerial.h

Berichtdoor retlawrobbe » 07 Feb 2013, 17:50

Heb nog wat gevonden in http://arduino.cc/forum/index.php?topic=121811.0
de max limit is 9600 blijkbaar.
Blijkbaar hetzelfde probleem . Na verschillende testen gedaan te hebben blijkt 9600 baud te werken.
14400 baud werkt ook nog correct wanneer de data niet te snel wordt doorgestuurd en daarmee bedoel ik wanneer de data elke 100milliseconden
is het lezen nog correct , bij elke 10milliseconden gaat er reeds informatie verloren.
Nu is de volgende vraag : Kan men de baudrate van een GPS wijzigen met bv een programmaatje ? Ik heb er nog geen gevonden !

Berichten: 85
Geregistreerd: 10 Jan 2013, 14:51
Woonplaats: Waddinxveen

Re: tweede serieele poort d.m.v. SoftwareSerial.h

Berichtdoor Karel » 07 Feb 2013, 18:46

Van deze link:

There has been considerable support for an library that would allow multiple soft serial devices. However, handling asynchronously received data from two, three, or four or more serial devices turns out to be an extremely difficult, if not intractable problem. Imagine four serial devices connected to an Arduino, each transmitting at 38,400 baud. As bits arrive, Arduino’s poor little processor must sample and process each of 4 incoming bits within 26 microseconds or else lose them forever. Yikes!

Er wordt daar verderop in de link over een oplossing geschreven, maar dan accepteer je wat dataverlies. Dat lijkt met geen probleem als een GPS z'n NMEA strings tig keer per seconde verstuurt. Moet je alleen per keer wel het begin van zo'n string opsporen.

Succes, Karel
If you think education is expensive, try ignorance! (Derek Bok)

Berichten: 85
Geregistreerd: 10 Jan 2013, 14:51
Woonplaats: Waddinxveen

Re: tweede serieele poort d.m.v. SoftwareSerial.h

Berichtdoor Karel » 07 Feb 2013, 18:49

Oh, en heb je de mogelijkheid bekeken van een USB GPS muis?

groet, Karel
If you think education is expensive, try ignorance! (Derek Bok)

Berichten: 17
Geregistreerd: 06 Feb 2013, 19:30

Re: tweede serieele poort d.m.v. SoftwareSerial.h

Berichtdoor retlawrobbe » 07 Feb 2013, 19:43

Hallo Karel
Inderdaad vrij complex om al deze data uit te lezen, in de "link" wordt ook ergens vermeld dat men de verschillende poorten
één voor één moet uitlezen. en het herkennen van de GPS geven strings valt wel mee omdat elke specifieke informatie voorafgegaan wordt door
$GPxxx waar xx staat vor GGA RMC GSA enz.
Een GPS muis was/is een mogelijkheid.
Op dit ogenblik ben ik in het bezit van twee GPS(en) ééntje welke ik al lang gebruik is deze van EAGLE TREE ( kostprijs 71.99$ bij HK)
de tweede GPS heb ik recent aangeschaft ( kostprijs 20.99$ ook bij HK ) spijtig genoeg de helft grote van formaat als deze van Eagle Tree
maar met het voordeel , dat heb ik daarstraks ontdekt, dat deze laatste te programeren is met het programma "u-blox"
de baudrate staat nu op 9600 baud zodat ik beide GPS(en) afwisselend kan uitlezen ( dat laatste enkel nog maar uitgetest met een klein testprogrammaatje.
Morgen gaan we trachten alles te implementeren in het eindprogramma.

Groeten Walter

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 15 gasten