Skocz do zawartości

Pomocna odpowiedź

Dzisiaj udało mi się napisać kod odpalający dźwięk z DFPlayera. Wysłałbym filmik ale jest późno i nie chce mi sie na yt wrzucać :x
Malinę tym czasowo wymieniłem na jedyną dostępną przetwornicę na XL, z ograniczeniem prądowym. Wymiary niby takie samie ale paskudnie milimetra brakuje w rozstawie otworów i musiałem przykręcić na ukos. 

Tutaj chciałbym się zapytać, o ile ktoś to czyta, czy mogę bezpiecznie na stmach używać stringów, bo świra idzie dostać z char array i funkcjami typu strcat i itoa.

tak

 

nie no, c++, a tych funkcji to nie używałem, nie wiem co robią, innymi słowy, c++ umiem tyle co trzeba żeby napisać prosty program, nic zaawansowanego, i tutaj myślę leży problem.

To się jak najszybciej dowiedz, bo klasa string ich używa. A string możesz całkiem bezpiecznie używać nawet na małym Arduino - pod warunkiem, że znasz zasady owego bezpieczeństwa.

Ergo: pytanie nie ma sensu bez zdefiniowania "bezpiecznie".

(edytowany)

dla mnie bezpiecznie to żeby nie zapychać pamięci, stosu/sterty. ogólnie nowy kurs stmów mi pokazuje jak małe pojęcie mam o c++. na przykład, jak odkomentuję linijkę, cały mikrokontroler się blokuje, i nie wiem czemu, choć podejrzewam że wkrada mi się gdzieś niewidzialne zero na końcu każdego łańcucha.. (funkcja serialwrite działa normalnie)

 	char msg[] = "DFPlayer send: ";
      for(int x = 0; x < 10; x++)
      {
          char buffer[3] = "";
          itoa(command[x], buffer, 16);
          strcat(buffer, " ");
          //strcat(msg, buffer);
      }
      debug_serialWrite(msg);
  
  HAL_UART_Transmit(&huart2, &command, 10, HAL_MAX_DELAY);

na dzisiaj idę spać. 

 

edit: zostawiam taktycznego githuba https://github.com/Leoneq/headcrab

Edytowano przez Leoneq
9 godzin temu, Leoneq napisał:

ogólnie nowy kurs stmów mi pokazuje jak małe pojęcie mam o c++

Nie wiem czy zauważyłeś, ale w kursie używany jest C a nie C++. Taka mała różnica (jak między kulturą a kulturą fizyczną).

9 godzin temu, Leoneq napisał:

jak odkomentuję linijkę, cały mikrokontroler się blokuje

To chwilę pomyśl.

Rezerwujesz 16 bajtów w pamięci na msg.

Potem chcesz od 15 bajtu zmieścić tam jakiś łańcuch (o raczej niezerowej długości). Procesor nie sprawdza czy to co mu każesz robić ma sens i grzecznie tę doklejkę tam dokleja, zamazując przy okacji jakieś (pewnie ważne) dane które tam siedziały.

Jak chcesz to zrobić?

Obrazowo: robisz koktajl o nazwie "dżin z tonikiem". Do tego celu kupujesz butelkę dżinu 0.25l i dolewasz do niej 0.75l toniku? Nie wyjdzie.

No, ale gdybyś do litrowej butelki zawierającej 0.25l dżinu dolał 0.75l toniku - spokojnie się zmieści, prawda?

Więc zamiast narzekać na te strasznie wredne tablice jakie to one brzydkie i jakieś itoa potrzebne, zacznij ich używać w normalny sposób (np. zapoznając się z jakimiś początkami C/C++). Czyli:
 

char msg[128] = "DFPlayer send: ";
for(int x = 0; x < 10; x++) {
	char buffer[3] = "";
	itoa(command[x], buffer, 16);
  	strcat(buffer, " ");
  	strcat(msg, buffer);
}
debug_serialWrite(msg);

Wielkość 128 wzięta z powietrza, ale na zasadzie że dżin z tonikiem możesz równie dobrze zrobić w dwulitrowej butelce.

A tak przy okazji - w C zacząłem pisać jeszcze w zeszłym tysiącleciu (i to nie w ostatniej dekadzie), a nie przypominam sobie abym gdziekolwiek użył itoa 😉

 

(edytowany)

a) nie zauważyłem
b) nie chciałem definiować wielkości tablicy bo chciałem żeby była możliwie mała bo mikrokontrolery
c) ok

dzisiaj wieczorem dam znać czy coś więcej popełniłem.

Edytowano przez Leoneq
12 minut temu, Leoneq napisał:

b) nie chciałem definiować wielkości tablicy bo chciałem żeby była możliwie mała bo mikrokontrolery

I uważałeś że sama urośnie?

"Możliwie mała" oznacza w tym przypadku "minimalna wielkość aby pomieścić najdłuższy możliwy napis plus kończący NUL". Najlepiej z jakimś niewielkim zapasem.

Poza tym w tym przypadku tablica będzie siedziała grzecznie na stosie i zaraz po wykonaniu bloku zniknie.

Aha, i zmienna "buffer" wcale nie jest tu potrzebna. Możesz przecież pisać bezpośrednio do msg we właściwe miejsce (czyli np. msg+strlen(msg)), poza tym taki np. sprintf zwraca ilość znaków które wypisał, czyli coś w stylu:
 

char *c=msg+strlen(msg);
for (int x=0; x<10; x++) c+=sprintf(c,"%02X ",command[x]); 

 

14 minut temu, Leoneq napisał:

dzisiaj wieczorem dam znać czy coś więcej popełniłem.

Dawaj dawaj, ja co prawda za dżinem z tonikiem nie przepadam ale może coś smacznego wyjdzie 🙂

 

a) tak
b) zaczynam tęsknić za javą
c) nie lubię składni c (to jest "printf" i "sprintf"), choć teraz jak sobie dopisałem kilka funkcji to idzie mi całkiem dobrze bez nich.
Udało mi się zrobić dwustronną komunikację po uarcie z PC, i prostą obsługę komend. Dość topornie, ale przynajmniej (myślę) że mam nad tym kontrolę:

char *ptr = strtok(huart1_buffer, "_");
    if(strcmp(ptr, "dfplayer") == 0)
    {
        ptr = strtok(NULL, "_");
        if(strcmp(ptr, "play") == 0)
        {
            ptr = strtok(NULL, "_");
            wav_play(atoi(ptr));
        }
        else if(strcmp(ptr, "setvolume") == 0)
        {
            ptr = strtok(NULL, "_");
            wav_setvolume(atoi(ptr));
        }
 
//itd...

Pełny kod oczywiście na githubie. Mogę sobie zapalać ledy i sterować odtwarzaniem dźwięków z gry, jutro chcę dopisać funkcje by w pełni wykorzystać DFplayera i być może dać to w osobny plik.

8 godzin temu, Leoneq napisał:

b) zaczynam tęsknić za javą

Czyli źle zacząłeś 😉 Zresztą to taki typowy syndrom javowca, Java jest najlepsza, wszystko inne jest be a w ogóle Java to cud natury i kto wymyślił te inne języki jak jest Java. Po pewnym czasie przechodzi samo bez konieczności zażywania środków farmakologicznych.

8 godzin temu, Leoneq napisał:

nie lubię składni c (to jest "printf" i "sprintf")

Składnia nie jest do lubienia tylko do nauczenia się. A formatowanie pochodzące z *printf możesz spotkać jeszcze w paru innych językach z Pythonem i PHP na czele.

Przy okazji: zapoznaj się z funkcjami typu strtol czy strtod, bo jak patrzę na strtok ożeniony z atoi to muszę oczy zamknąć...

30 minut temu, ethanak napisał:

i PHP na czele

Bałbym się tej abominacji nazywać językiem 😉 (AntiPHP Gang)

A co do reszty wypowiedzi się zgadzam. Zwłaszcza z tym, że syndrom Javowca przechodzi (chociaż u mnie tak było z LUA).

  • Lubię! 1
12 minut temu, H1M4W4R1 napisał:

Bałbym się tej abominacji nazywać językiem

Niestety, niektórzy uparcie trwają w tym błędnym przekonaniu 😉

A poza tym pisząc w PHP można się wielu przydatnych rzeczy dowiedzieć, np. jak jest po hebrajsku dwukropek 🙂

 

  • Lubię! 1

ja narzekałem i narzekam dużo na jave, ale jak zaczynam mówić że java od czegoś lepsza to naprawdę mi coś nie idzie. bo java jednak jak dała nullpointerexception to dało się to jakoś obejść w try/catch, a w c mam wskaźnik do tablicy który mi się nie dodaje, bo zostaje "optimized out", i volatile nie pomógł jakoś. Im dłużej w tym siedze tym coraz bardziej chyba wchodzę w ten dołek, o tutaj:

image.thumb.png.5acb92d1c9268868cb6d0bcf6c14dbb4.png

aaaaleeee jakoś tam coś idzie do przodu to zapoznam się z strotol. Dzisiaj jakoś spróbuję zoptymalizować kod (uart na przerwaniach) oraz, jak mówiłem, ogarnąć DFPlayera do końca. 

7 minut temu, Leoneq napisał:

java jednak jak dała nullpointerexception to dało się to jakoś obejść w try/catch

Zawsze możesz stosować referencje...

Poza tym mikrokontroler nie jest od tego żeby poprawiać błędy programisty.

9 minut temu, Leoneq napisał:

spróbuję zoptymalizować kod (uart na przerwaniach)

Nie zrozum mnie  źle, ale chyba zanim zabierzesz się za optymalizację kodu powinieneś zapoznać się z językiem w którym to piszesz (a przypominam, że funkcje z bibliotek standardowych są częścią języka).

11 minut temu, Leoneq napisał:

w c mam wskaźnik do tablicy który mi się nie dodaje

Możesz coś bliżej na ten temat bo nie rozumiem...

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