• 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
formatowanie danych....
#1
Witam,
mógłby ktoś mi pomóc z formatowaniem danej którą dostaje przez serial?
Dostaje dane w formacie "a100" "b100" "c20" , może to być dana np ze spacją czyli odpowiednio "a 100" "b 100" "c 20"
i chciałbym wysterować nimi odpowiedni pin z pwm
literka oznacza pin PWM

a=9
b=10
c=11

a liczba za literką jego wypełnienie. nie bardzo wiem jak to ogarnąć, proszę o jakąś podpowiedz..
 
Odpowiedź
#2
Całą dokumentację masz na dysku.
Pomoc->Referencje - przeczytaj najpierw o funkcjach klasy Serial.
Jak poczytasz to użyj metody Serial.readBytesUntil() do oczytania ciągu danych do bufora. Pierwsza pozycja w tablicy(buforze) to nr pinu, reszta to wartość.

Inna opcja(chyba łatwiejsza) to użycie Serial.readStringUntil() i odczytanie danych do łańcucha. Pierwszy znak to numer pinu, reszta wartość. Wycinasz znaki używając odpowiednich metod klasy String o której oczywiście musisz poczytać w referencjach(String - object).
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
#3
Witam, nie moge zrozumieć dlaczego nie działa, w konsoli wpisuje 1 255 wiec silnik poinien ruszyć a tu lipa

Kod:
#define   DEBUG   1  
const int bSize = 20;
int Led = 13;
int dir1PinA = 2;
int dir2PinA = 3;
int speedPinA = 9;
int dir1PinB = 4;
int dir2PinB = 5;
int speedPinB = 10;
 
   char Buffer[bSize];  
       char Command[10];    
       char Data[15];      
       int ByteCount;
 
void SerialParser(void) {

ByteCount = -1;
ByteCount =  Serial.readBytesUntil('\n',Buffer,bSize);  
 
  if (ByteCount  > 0) {
       strcpy(Command,strtok(Buffer," "));
                 
       strcpy(Data,strtok(NULL," "));            
  }
  memset(Buffer, 0, sizeof(Buffer));  
  Serial.flush();
}
 
 
void setup() {
   Serial.begin(9600);
   pinMode(dir1PinA,OUTPUT);
   pinMode(dir2PinA,OUTPUT);
   pinMode(speedPinA,OUTPUT);
   pinMode(dir1PinB,OUTPUT);
   pinMode(dir2PinB,OUTPUT);
   pinMode(speedPinB,OUTPUT);
   pinMode(Led,OUTPUT);
   if (DEBUG) {
       Serial.println("Debugging Enabled");
   }
     
}

void loop() {
 
   SerialParser();
        if (ByteCount  > 0) {
         Serial.print("Command     : ");
         Serial.println(Command);
         Serial.print("Data        : ");
         Serial.println(Data);
       
       if (Command == 1) {
           analogWrite(speedPinA, Data);
           digitalWrite(dir1PinA, LOW);
           digitalWrite(dir2PinA, HIGH);
           Serial.println("Motor 1 Forward");
           Serial.println("   ");
         }
}
}

otrzymuje w konsoli ze:

Kod:
Debugging Enabled
Command     : 1
Data        : 255
jednak piny 2 i 3 mają stan niski.. a 3 powinna mieć wysoki....
Proszę podpowiedzSmile dziękuje
 
Odpowiedź
#4
Nie możesz porównywać tablicy typu char z wartością typu int: if (Command == 1). Podobnie ma się sprawa z =e zmienną Data.
Włącz ostrzeżenia kompilatora: Plik->Preferencje->Pokaz szczegółowe informacje podczas kompilacji. Generalnie można to zrobić prościej ale zmierzasz w dobrym kierunku.
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
#5
Czyli muszę przekonwertowac char na int... Rozumie że wpis typu
int ala = char command
nie zadziała?


Wysłane z mojego D6633 przy użyciu Tapatalka
 
Odpowiedź
#6
Jedną żecz podpowiem a resztę czytaj/szukaj/kombinuj:
zamiast
Kod:
if (Command == 1)
daj
Kod:
if (Command[0] == '1')

To co masz w tablicy Command to zmienne typu char - znaki ascii.
Przeczytaj w referencjach:
- char
- string - char array
- array
Nie ograniczaj się tylko do dokumentacji arduino. Jeśli czegoś nie rozumiesz to szukaj tych instrukcji jako instrukcji języka c.
[Edit]
Być może dla Ciebie Byłoby łatwiej zrobić to na zmiennych typu String a nie string - char array(druga opcja z postu #2).
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
#7
Dziękuje za pomoc, 
Data wykombinowałem  tak:

Kod:
if (Command[0] == '1') {
                   int ala = atoi ( Data );
                   analogWrite(speedPinA, ala);
                   digitalWrite(dir1PinA, LOW);
                   digitalWrite(dir2PinA, HIGH);
                   Serial.println("Motor 1 Forward");
niby jest ok, znaczy działa steruje silnikiem, ale mam jedno ale.... po wydaniu komendy np 1 255 silnik nie reaguje odrazu, a raczej po ok 2 sekundach.  Co powoduje takie opóźnienie?


pozdrawiam
 
Odpowiedź
#8
Powodem może być "Brak zakończenia linii" zamiast "Nowa linia" w monitorze portu.
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
#9
dziękuje, brak zakończenia linii był powodem. jak na razie działa, jeszcze parę rzeczy do dopisania zostało Smile . jeszcze raz dziękuje Smile
 
Odpowiedź
#10
Witam, czy ktoś mógłby mi wyjaśnić co oznacza [0] w "if (Command[0] == '1')" ,nie mogę znaleźć nigdzie wyjaśnienia.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości