Skocz do zawartości

Pomocna odpowiedź

Napisano (edytowany)

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

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

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

 

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

 

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)?

 

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

 

(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

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() 

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

 

(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

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...