Skocz do zawartości

Headcrab


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.

Link do komentarza
Share on other sites

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.

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

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

Link do komentarza
Share on other sites

(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
Link do komentarza
Share on other sites

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 😉

 

Link do komentarza
Share on other sites

(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
Link do komentarza
Share on other sites

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 🙂

 

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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. 

Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

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

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.