Skocz do zawartości

Kurs Arduino - #3 - UART (komunikacja z PC), zmienne


Pomocna odpowiedź

(edytowany)

Witam,

mam pytanie, jak wysłać/odbierać zera bitowe, np wartość 0x00 ?

np. dla : Serial.print(0x04.HEX);  otrzymuję 4 a nie 04 (BIN 100 a powinno być 0000 0100)

Problem w tym że nie otrzymuję pełnej informacji. Z góry dzięki

 

Edytowano przez 1991piotrek

Dzięki za szybką odpowiedz, próbowałem tej funkcji i nie działa w moim przypadku albo coś robię źle.

#include <SoftwareSerial.h>

uint8_t test[2]  = {0x00,0x44};
char bufforDanych[8] {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

void setup() 
{
  Serial.begin(57600);
  Serial1.begin(10400);
}

void loop() 
{ 
  // WYSYŁA
  if(Serial.available())
  {
    for(int i=0; i<sizeof(test); i++)
     {
      Serial1.println(test[i],BIN);
      delay(20);
      Serial.read();   
    }
  }

  // ODBIERA
  while(Serial1.available())
  {
    sprintf(bufforDanych,Serial1.read());
    Serial.println(bufforDanych);
  }
}

 

44 minuty temu, 1991piotrek napisał:

albo coś robię źle.

Owszem. Poczytaj dokumentację - wpisywanie na pałę funkcji bez sprawdzenia jak się je w ogóle wywołuje i potem jojczenie że nie działa to takie trochę wstydliwe jest... nie uważasz?

  • Nie zgadzam się! 1

ethanak jak masz zły dzień to idź pobiegać a nie wyładuj swojej agresji na mnie, zwyczajnie napisałem ze nie potrafię z niej właściwie korzystać a nie "jojcze". To pytanie nie było skierowanie konkretnie do ciebie,  jeżeli w niczym nie pomożesz to poco się udzielasz?

  • Nie zgadzam się! 1
2 minuty temu, 1991piotrek napisał:

zwyczajnie napisałem ze nie potrafię z niej właściwie korzystać

Podałem link do dokumentacji? Podałem. Więc może zamiast obrażać się i tupać nóżkami bo się odezwał ktoś inny niż sobie wymarzyłeś (tak działa forum) to usiądziesz i poczytasz.

 

4 minuty temu, 1991piotrek napisał:

jeżeli w niczym nie pomożesz

No, tu już przesadziłeś. Podanie linku do opisu konkretnej funkcji to za mało? Co jeszcze chcesz? Mam to przeczytać za ciebie? Dziękuję, ja już czytałem.

 

  • Nie zgadzam się! 1
(edytowany)

ethanak potrafię korzystać w wyszukiwarki, poza tym Gieneq wcześniej wysłał link do opisu, może problem wynika z mojej interpretacji lub braków w programowaniu ( jestem początkującym) ty "pomagasz" w stylu kopiuj i wklej, jak dla mnie to nie pomoc. Nie wnikam w to kto odpowiada ale co odpowiada ( nie podoba mi się sposób twoich odpowiedzi skierowanych do mnie. Ethanak może byłeś dotkliwie karany przez całe swoje zycie jeżeli czegoś nie umiałeś lub nie rozumiałeś, pewnie stąd ta agresja w twoich wypowiedziach )

Edytowano przez 1991piotrek
  • Nie zgadzam się! 1

Czego nie zrozumiałeś z dokumentacji? Napisz konkretnie, ktoś na pewno pomoże. I nie doszukuj się jakiejś agresji tam, gdzie jej nie ma.

Każdy z nas był kiedyś początkujący i nie ma co się tego wstydzić. Ale zadanie konkretnego pytania może pomóc szybciej, niż stwierdzenie "nie działa". Kompilator też pewnie jakieś ostrzeżenue wypisał, też warto podać...

(edytowany)

Problem opisałem na początku

Dnia 31.08.2020 o 09:30, 1991piotrek napisał:

Witam,

mam pytanie, jak wysłać/odbierać zera bitowe, np wartość 0x00 ?

np. dla : Serial.print(0x04.HEX);  otrzymuję 4 a nie 04 (BIN 100 a powinno być 0000 0100)

Problem w tym że nie otrzymuję pełnej informacji. Z góry dzięki

 

Po prostu męczę ten problem chyba od dwóch tygodni i już tracę chęci(zdecydowałem się poprosić o pomoc na forum, a w odpowiedzi między innymi dostaję ze "jojcze"😡). Więc jeszcze raz od początku.

Jeżeli wysyłam szesnastkowo liczbę to funkcja print ucina początkowe zera i dostaję nie pełną informację (zer nie ma też gdy sprawdzam to w putty, może muszę je inaczej skonfigurować? ),dlatego mam problem z sprawdzeniem echa ( komunikacja jedno przewodowa KWP200),  mogę zrobić własną funkcję która je uzupełni (chyba już zapętliłem się w rozumowaniu przy niej i muszę odpocząć😄) . Miałem nadzieje ze jest jakaś gotowa funkcja o której zwyczajnie nie wiem a działała by dla mnie tak jak chce. Podczas kompilacji tego powyższego programu nie dostaje żadnych błędów

Edytowano przez 1991piotrek
(edytowany)

Gotową funkcją jest właśnie sprintf. Coś w stylu:

sprintf(bufor, "%02x", zmienna);

Najważniejszy jest tu drugi argument (format), który informuje funkcję w jaki sposób ma wypisać wartość (wartości) - w tym przypadku oznacza to "dwie cyfry szesnastkowe z wiodącym zerem".

Więcej informacji w dokumentacji, ew. wpisz w przeglądarkę "man sprintf" (funkcja z avr-libc różni się co prawda w szczegółach od standartu, ale na początek powinno wystarczyć).

Ogólnie - istnieje cała rodzina funkcji *printf, różnią się sposobem traktowania parametrów i umieszczaniem wyników, ale format traktują wszystkie tak samo; jeśli poznasz jedną z nich to tak jakbyś poznał wszystkie.

Aha, musiałeś dostać ostrzeżenie od kompilatora o niezgodności typu drugiego parametru - czy przypadkiem nie masz w preferencjach wyłączonego wyświetlania wszystkich komunikatów?

Edytowano przez ethanak
  • Lubię! 1
  • Pomogłeś! 1

@1991piotrek fajnie, że udało się rozwiązać temat, jakbyś mógł wrzucić ostateczny kod, może komuś się przyda, a sam jestem ciekaw co z tego wyszło.

Poza tym jak zawsze zachęcamy do bycia przyjaznym na forum. Może problemu nie rozwiąże ani bieganie, ani jojczenie, ale pomoże ich uniknąć lakoniczność we wpisach i podawanie samych konkretów, tak by nie było o jedno zdanie za dużo 🙂 Miłego popołudnia

  • Lubię! 1

@Gieneqtu nie chodzi o przyjazność czy lakoniczność. Droga powinna być taka:

Nie wiem jak to zrobić, zapytam.

Masz link do dokumentacji.

Czytam, czytam, i nie rozumiem co znaczy X.

X znaczy to a to.

Aha, rozumiem.

Nigdy taka:

Mnie nie działa.

A czytałeś dokumentację?

Nie bądź agresywny, masz minusa, a zaraz napiszę do admina to będziesz miał bana!

(niestety, przypadek autentyczny).

Przy okazji - dlaczego na wersji mobile nie mogę wstawić listy?

Świat nie jest czarno biały i każdy go widzi po swojemu. Przepraszam jeżeli ktoś poczuł się urażony moimi postami.

Co do kodu to użyłem w końcu poprawie funkcji sprintf dzięki ethanak,

#include <SoftwareSerial.h>

byte test[2]  = {0,255}; // wysyłam dziesiętnie
char bufforDanych[8] {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

void setup() 
{
  Serial.begin(57600);
  Serial1.begin(10400);
}

void loop() 
{ 
  // WYSYŁA
  if(Serial.available()){
        Serial1.write(test,2);
        delay(20);
        Serial.read();    
  }

  // ODBIERA
  if(Serial1.available()){
    sprintf(bufforDanych,"%01d",Serial1.read());
    Serial.println(bufforDanych);
  }
}

 

2 godziny temu, 1991piotrek napisał:

sprintf(bufforDanych,"%01d",Serial1.read());

 

Czy nie uważasz, że jest to absolutnie bez sensu?

%01d oznacza "jednocyfrowa liczba dziesiętna, a jeśli będzie mniejsza niż jednocyfrowa uzupełnij ją po lewej stronie zerami".

Teraz przeczytaj to co napisałem.

Teraz jeszcze raz.

I jeszcze raz.

I już nic nie pisz, tylko pomyśl, czy naprawdę o to ci chodziło?

Aha, tu nie ma żadnej agresji.

 

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...