• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
dane z serial port
#11
(01-12-2019, 16:20)Robson Kerman napisał(a): W normalnej sytuacji napisał bym: debuguj.
Ale programowanie Arduino nie stwarza normalnych sytuacji, więc najlepszym sposobem jest wypisanie zmiennych na serial w istotnych miejscach programu.
Ale zanim zaczniemy, to powinieneś sprawdzić, czy przepisałeś mój kod dokładnie, bo jeśli tak, to tam jest błąd.

Jest:
Kod:
  while (gpsBoard.available()) {
    ReadString = Serial.readString();
   }

Powinno być:
Kod:
  while (gpsBoard.available()) {
    ReadString = gpsBoard.readString();
   }

tak to zauważyłem i poprawiłem, niestety którejś pętli nie przechodzi, tak zrobiłem i nic :
#include <SoftwareSerial.h>
SoftwareSerial gpsBoard (2, 3, false);
String ReadString;

void setup() {
Serial.begin(115200);
gpsBoard.begin(9600);
}

void loop()
{
while (gpsBoard.available()) {
ReadString = gpsBoard.readString();

Serial.print(ReadString);

}
ReadString.trim(); // usuwamy spacje przed $

if (ReadString.startsWith("$GPVTG")) { // jeśli string zaczyna się znakami $GPVTG

for (int x = 0 ; x < 7; x++){ // usuń wszystko do siódmego przecinka
int pozycja=ReadString.indexOf(',');
ReadString.remove(0, pozycja+1);

}
char Speed[3];
for (int i=0; i < 3; i++){
Speed[i]=ReadString.charAt(i); // przeczytaj pięć pierwszych znaków
}
Serial.print(Speed);
}

}
 
Odpowiedź
#12
Co się dzieje w tej pętli?
Kod:
while (gpsBoard.available()) {
ReadString = gpsBoard.readString();

Serial.print(ReadString);

}

Nic nie wypisuje na serial?
Bo jeśli nic nie wypisuje, to znaczy że GPS nic nie wysyła, a to już nie wina kodu tylko sprzętu (połączenia, zasilanie itp.).
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#13
(02-12-2019, 15:07)Robson Kerman napisał(a): Co się dzieje w tej pętli?
Kod:
while (gpsBoard.available()) {
ReadString = gpsBoard.readString();

Serial.print(ReadString);

}

Nic nie wypisuje na serial?
Bo jeśli nic nie wypisuje, to znaczy że GPS nic nie wysyła, a to już nie wina kodu tylko sprzętu (połączenia, zasilanie itp.).

ten kod co podałem na początku wypisuje komunikaty nmea.
po zmianie na String, czyli:

#include <SoftwareSerial.h>
SoftwareSerial gpsBoard (2, 3, false);
String ReadString;

void setup() {
  Serial.begin(115200);
  gpsBoard.begin(9600);
}

void loop()
{   
  while (gpsBoard.available() > 0 ) {
    ReadString = gpsBoard.readString();
   
    Serial.println(ReadString);

  }
  // ReadString.trim();                        // usuwamy spacje przed $

  // if (ReadString.startsWith("$GPVTG")) {    // jeśli string zaczyna się znakami $GPVTG

    //  for (int x = 0 ; x < 7; x++){        // usuń wszystko do siódmego przecinka
      //    int pozycja=ReadString.indexOf(',');
        //  ReadString.remove(0, pozycja+1);

    //  }
        //  char Speed[3];         
        //    for (int i=0; i < 3; i++){
        //    Speed[i]=ReadString.charAt(i);  // przeczytaj pięć pierwszych znaków       
        //    }
          //  Serial.print(Speed);
  //}
 
}

nic nie ma...
nie rozumiem ?
 
Odpowiedź
#14
zawiesza sie na tym kodzie :
ReadString = gpsBoard.readString();
 
Odpowiedź
#15
Metoda ->available() przechowuje ilość danych w buforze, jeśli nie ma danych to program nie wejdzie w pętlę.
Jeśli są dane, to metoda ->readString() oczekuje terminatora, może sprzęt nie wysyła znaku końca linii?
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#16
to by się mogło zgadzać, skoro char odczytuje... da się to obejść czy czytać char, przerabiać na string ?

kolego gdzie znajdę takie opisy jak zamieściłeś wyżej: "Metoda ->available() przechowuje ilość danych w buforze, jeśli nie ma danych to program nie wejdzie w pętlę."
 
Odpowiedź
#17
Przecież to podstawy komunikacji

https://www.arduino.cc/reference/en/lang...available/

https://www.arduino.cc/reference/tr/lang...readstring
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#18
(04-12-2019, 16:27)tabulek napisał(a): to by się mogło zgadzać, skoro char odczytuje... da się to obejść czy czytać char, przerabiać na string ?

No ewidentnie nie ma terminatora. Można to wymusić sprzętowo, albo czytać stringa do jakiegoś określonego znaku, który zawsze występuje w naszym łańcuchu.
Możemy wykorzystać na przykład speed indicator w postaci litery K.
Wszystko wrzuciłem do pętli czytającej bufor, ponieważ po przeczytaniu tablicy do pewnego znaku bufor nie jest opróżniony i przypisuje do stringa to co zostało, więc wcześniej załatwiamy sprawę ze znalezieniem prędkości i przypisaniem jej do tablicy.

Kod:
    if (gpsBoard.available() > 0 ) {
        ReadString = gpsBoard.readStringUntil('K');

             ReadString.trim();                        // usuwamy spacje przed $

             if (ReadString.startsWith("$GPVTG")) {    // jeśli string zaczyna się znakami $GPVTG

                 for (int x = 0 ; x < 7; x++){        // usuń wszystko do siódmego przecinka
                     int pozycja=ReadString.indexOf(',');
                     ReadString.remove(0, pozycja+1);

                 }
                 char Speed[5];
                 for (int i=0; i < 5; i++){
                     Speed[i]=ReadString.charAt(i);  // przeczytaj pięć pierwszych znaków
                 }
                 Serial.print("Speed: ");
                 Serial.println(Speed);
             }
    }
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#19
Wiem że to podstawy ale codzienna praca do wieczora, dwoje dzieci którym trzeba chwile poświęcić i zostaje bardzo mało czasu na naukę, w dodatku zmęczony organizm słabo wiedzę przyswaja Sad

Jest mały sukces, działa ale strasznie wolno, co kilka sekund coś odczytuje... w char znów tego problemu nie ma
 
Odpowiedź
#20
(05-12-2019, 12:40)tabulek napisał(a): w char znów tego problemu nie ma

Bo czytasz po jednym bajcie i go wypisujesz na konsolę. W takim przypadku nie masz w pamięci łańcucha znaków, ale przy każdym przejściu pętli zmienna przyjmuje wartość aktualnego znaku pobranego z bufora.
Można to zrobić w tablicy char zamiast w stingach, ale to dopiero wieczorem się odezwę, bo jestem w pracy.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości