(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);
}
}
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.).
(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 ?
zawiesza sie na tym kodzie :
ReadString = gpsBoard.readString();
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?
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ę."
(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);
}
}
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
Jest mały sukces, działa ale strasznie wolno, co kilka sekund coś odczytuje... w char znów tego problemu nie ma
(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.