Skocz do zawartości
NeverGiveUp1995

Serial Zapis do Tablicy

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

Udostępnij ten post


Link to post
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

Udostępnij ten post


Link to post
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;
  }
  
  
}
  }
  

 

Udostępnij ten post


Link to post
Share on other sites

Serial.read może býć wykonany jeśli Serial.available coś zwraca, albo musisz go wykonywać w kółko dopóki nie zwróci -1.

Udostępnij ten post


Link to post
Share on other sites

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;
  }
}
  }

 

Udostępnij ten post


Link to post
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)?

 

Udostępnij ten post


Link to post
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

 

Udostępnij ten post


Link to post
Share on other sites

A co będzie jak wywalisz niepotrzebne printy?

Kiedy Serial.available() zwraca -1?

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

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

Udostępnij ten post


Link to post
Share on other sites

czytam cały czas przeglądam internet ale nie mogę tego zrozumieć są przykłady jak odbierać po jednym bajcie ale jak przepisać do tablicy np wiekszą ilość bajtów to nic nie znalazłem teraz coś próbuje zrobić na serialEvent() 

Udostępnij ten post


Link to post
Share on other sites

To może wreszcie napisz czego nie rozumiesz... mi już ręce opadają.

Udostępnij ten post


Link to post
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;
    }
   }
}

 

Udostępnij ten post


Link to post
Share on other sites

A nie prościej po prostu:
 

jeśli są dane to je zapisz,

a jeśli nie to nie

 

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

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

Udostępnij ten post


Link to post
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!

Gość
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...