Skocz do zawartości

Serial Zapis do Tablicy


NeverGiveUp1995

Pomocna odpowiedź

witam potrzebuje zapisać 108 bajtów hex do tablicy co robię źle ? wysyłem przez real term 0x11,0x22,0x33,0x44,0x55,0x66 a otrzymuje taki wynik jeszcze podzielony 
image.thumb.png.0f69d2127275b48279d1f2658b5c2fa5.png

char odebrane;
uint16_t Buffor[120];
uint8_t a,
        flaga;
void setup()
  {
   pinMode( 3, INPUT_PULLUP);
   Serial.begin(9600);

   Serial.println("Serial Gotowy \p");
  }
void loop()
  {
   while(Serial.available() > 0 && a < 119)
      {
        odebrane = Serial.read();
        Buffor[a] = odebrane;
        a++;
        flaga = 1;
        if(a == 119){
          return;
          a = 0;
        }
      }

  if(Serial.available() == 0 && flaga == 1)
{
    for (int i = 0; i < 119; i++)
    {
    Serial.print(Buffor[i], HEX);
    }
    Serial.println("----------");
    flaga = 0;
    for (int i = 0; i < 119; i++)
  {
  Buffor[i] = 0;
  }
  
  
}
  }

 

Edytowano przez NeverGiveUp1995
Link do komentarza
Share on other sites

Przecież znaki nie pojawiają się wszystkie w jednym momencie, tylko napływają stopniowo. Twoje pierwsze while nigdy się nie wykona, bo żadnego znaku jeszcze nie ma a wystarczy jedna skucha (procesor był szybszy niż UART) i dajesz za wygraną. Drugie oczywiście wypisze wtedy głupoty. Skąd wracasz tym "return"? Wychodzisz z loop()? Funkcja Serial.available() bardzo rzadko oddaje coś pozytywnego. Musisz napisać pętlę która bezwarunkowo wykona się ileśtam razy a dopiero w niej wisieć na Serial.available() w oczekiwaniu na każdy kolejny znak. Dopiero po zapełnieniu całego bufora (ostatni użyteczny index to 119 - nie wychodź za wcześnie, pomyśl na różnicą między operatorem ">" a ">=") możesz zacząć wypisywać.

  • Lubię! 1
Link do komentarza
Share on other sites

coś takiego masz na myśli 

char odebrane;
uint16_t Buffor[120];
uint8_t a,
        flaga;
void setup()
  {
   pinMode( 3, INPUT_PULLUP);
   Serial.begin(9600);

   Serial.println("Serial Gotowy \p");
  }
void loop()
  {
    if(Serial.available() > 0 ){
     for (int u = 0; u < 119; u++){
      odebrane = Serial.read();
        Buffor[u] = odebrane;
     }
    flaga = 1;
    }
   

  if(Serial.available() == 0 && flaga == 1)
{
    for (int i = 0; i < 119; i++)
    {
    Serial.print(Buffor[i], HEX);
    }
    Serial.println("----------");
    flaga = 0;
    for (int i = 0; i < 119; i++)
  {
  Buffor[i] = 0;
  }
  
  
}
  }
  

 

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

tak też nie działa za bardzo nie mogę ogarnąć działania tego seriala w internecie też kiepsko coś znaleść by wytłumaczone było jak działa na stm32f103 działa mi od strzała tylko nie mam jak tego wysłać do domoticza myślałem że to ogarnę na samym esp ale kiepsko to idzie .

char odebrane;
char Buffor[120];
uint8_t a,
        flaga,
        flaga2;
void setup()
  {
   pinMode( 3, INPUT_PULLUP);
   Serial.begin(9600);

   Serial.println("Serial Gotowy \p");
  }
void loop()
  {
    while(Serial.available() > 0 && flaga2 > 0 ){
     
     Serial.print(Serial.available());
        odebrane = Serial.read();
        Buffor[a] = odebrane;
        a++;
     if (Serial.available() == -1) flaga2 = 0;
    flaga = 1;
    
    }
   
if(Serial.available() == 0 && flaga == 1)
{
    for (int i = 0; i < 119; i++)
    {
    Serial.print(Buffor[i], HEX);
    }
    Serial.println("----------");
    flaga = 0;
    flaga2 = 1;
    for (int i = 0; i < 119; i++)
  {
  Buffor[i] = 0;
  }
}
  }

 

Link do komentarza
Share on other sites

Tak z ciekawości: jaką wartość ma flaga2 przy pierwszym wejściu do loop?

Jesteś pewien, że Serial.read zwraca char a nie int? Jak odróżnisz EOF od prawidłowego wyniku?

Czytasz czasami to co kompilator wypisuje czy po prostu wyłączyłeś ostrzeżenia kompilatora (albo ich nie nie włączałeś bo długie, nudne i czerwone)?

 

Link do komentarza
Share on other sites

wiem z tą flagą poprawiłem czytam jak jakieś ostrzeżenia wywali a praktycznie to potrzebuje z urządzenia odczytać taki ciąg 
zapisać do tablicy i przeszukać jego tylko dalej nie mogę odczytać tego do tablicy  ciąg jest w hex 
0226FFF4169E502D169F4B23157C0050157D0212157E0035166E00001616002D1681F83015CD0000162013281621000315890001158B000016B6000016B0000416AE000115AB00001587000015880000159B000001F60000028E0000029800000299000002450000021804CC

 

Link do komentarza
Share on other sites

Chyba to się - za przeproszeniem - wesz na grzebieniu.

Zajrzyj do dokumentacji Stream i Serial, poczytaj sobie, jeśli czegoś nie zrozumiesz to zapytaj, ale nie zawracaj głowy nikomu na forum tylko dlatego, że Ci się czytać nie chce.

Edytowano przez ethanak
Link do komentarza
Share on other sites

dobra to zacznijmy od nowa jak mam ten program i wg tego co znalazłem w opisach funkcji arduino to serialEvent powinien się wykonać jak będą jakieś dane i powinno to zapisać do tablicy i zwracam flagę  że dane zostały odebrane?

 


bool OdebranoDane = false;

uint8_t IloscDanychDoOdebrania;

uint16_t buffor[120];
void setup() {
  {
   pinMode( 3, INPUT_PULLUP);
   Serial.begin(9600);
   Serial.println("Serial Gotowy ");
  }

}

void loop() {
  
  if(OdebranoDane){
    for (int i = 0; i < IloscDanychDoOdebrania; i++)
    {
    Serial.print(buffor[i], HEX);
    }
    Serial.println("----------");
  }

}
void serialEvent(){
  IloscDanychDoOdebrania = Serial.available();\
  uint8_t idx = 0;
   while (Serial.available()){

    buffor[idx] = Serial.read();
    idx++;

    if(idx == IloscDanychDoOdebrania){
      bool OdebranoDane = true;
    }
   }
}

 

Link do komentarza
Share on other sites

Albo nawet tak 🙂 

Powtarzaj do zapełnienia bufora:
  jeśli są dane to je zapisz

Serial.write() nie czeka na nic i oddaje -1 gdy nie było znaku lub oczywiście jego kod gdy coś zostało odebranea. Musisz zatem przed odczytem umieścić Serial.available() i dopiero gdy dostaniesz sygnał, że coś jest, robisz odczyt, pakujesz do bufora, zwiększasz indeks/licznik i znów wisisz na Serial.available(). I tak 120, czy ile tam potrzebujesz, razy...

Nie wiem po co błądzisz po internecie, przecież jest jedno standardowe miejsce dla Arduino:

https://www.arduino.cc/reference/en/language/functions/communication/serial/

Wyboerasz metodę i o niej czytasz, np:

https://www.arduino.cc/reference/en/language/functions/communication/serial/read/

Wszystko masz na tacy.

Edytowano przez marek1707
  • Lubię! 1
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.