Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

C - Dereferencja wskaźnika typu void, modyfikacja danych.

dawid.barracuda 05 Lis 2016 17:37 549 6
  • #1 05 Lis 2016 17:37
    dawid.barracuda
    Poziom 13  

    Szanowni Forumowicze,
    odbieram pewne dane z nRF'a (24l01+). Gdy program wykryje zdarzenie, to przechodzi do funkcji reagującej na zdarzenie i dającej dostęp do odebranych danych. Funkcja jak poniżej:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Pod *nRF_RX_buff znajdują się dane, a zmienna len mówi o ilości odebranych danych (ile bajtów odebrano).
    Dane docelowo idą po rs232 do PC. Jednak przed wysyłką do PC muszę zwiększyć rozmiar przesyłanego bufora o 1 i na ostatnim miejscu wpisać 0.
    Moją próbę przedstawiłem powyżej. Problem jest taki, że co prawda widzę na terminalu dane, ale dalej są w postaci pierwotnej, bez zera na ostatnim miejscu.
    Tak więc to co napisałem wyżej jest niepoprawne. Gdzie popełniam błąd?

    Kod jest pisany dla AVR, ale uznałem, że dotyczy to podstaw języka C i nadaje się na ogólniejszy dział. Jeśli się pomyliłem to proszę Moderatora o wybaczenie i przeniesienie tematu :)

    Proszę uprzejmie o wskazówki i pozdrawiam.

    0 6
  • #2 05 Lis 2016 19:34
    Krzysztof Gustaw
    Poziom 23  

    Witam!
    A to nie jest tak, że funkcje operujące na tekstach, również z rodziny puts, bajt zerowy traktują jako koniec tekstu i po natrafieniu na niego (zero) automatycznie kończą działanie? Dotyczy to również standardowych funkcyj wypisujących teksty.
    Pozdrawiam
    KG

    0
  • #3 06 Lis 2016 09:37
    mi14chal
    Poziom 28  

    Krzysztof Gustaw napisał:
    A to nie jest tak, że funkcje operujące na tekstach, również z rodziny puts, bajt zerowy traktują jako koniec tekstu i po natrafieniu na niego (zero) automatycznie kończą działanie?


    Dokładnie tak jest, z dokumentacji: http://www.cplusplus.com/reference/cstdio/puts/
    Cytat:
    The function begins copying from the address specified (str) until it reaches the terminating null character ('\0').

    0
  • #4 06 Lis 2016 16:12
    dawid.barracuda
    Poziom 13  

    No tak, rzeczywiście. Czyli jedyną opcją wysłania zera do PC to wysłanie liczb w postaci kodów ASCII i potem ich dekodowanie z powrotem na liczby?

    I jeszcze jedno - zmieniłem:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    na:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Żeby sprawdzić, czy działa prawidłowo. No i nie działa, program wariuje i wysyła jakieś przypadkowe wartości. Czy ten kod powyżej, który napisałem jest poprawny? To operacje na wskaźnikach (a to materia delikatna) i z tego mocny nie jestem, stąd moja prośba o wskazówki. Chcę to w końcu opanować :)

    0
  • Pomocny post
    #5 06 Lis 2016 20:34
    krru
    Poziom 32  

    1. Po co kopiować dane? Można po prostu wysłać oryginalne dane a potem dosłać to zero. Transmisja RS232 nie rozróżnia pakietów idą po prostu kolejne znaki, bez znaczenia czy zostały wysłane razem czy pojedynczo.

    2. Pewnie masz też funkcje typu _write (uart_write?), która dostaje adres i długość. Wtedy taka funkcja nie patrzy na zera, tylko śle tyle, ile jej podano. Zapewne jest też funkcja wysłania pojedynczego bajtu o dowolnej wartości (putc?).

    0
  • Pomocny post
    #6 07 Lis 2016 00:37
    Krzysztof Gustaw
    Poziom 23  

    Jeśli chodzi o funkcje ignorujące '\0' to można wykorzystać rodzinę memcośtam a nie strcośtam. Rodzina memcośtam operuje na ciągach bajtów a nie tekstach w związku z tym muszą mieć podane ilość bajtów bo '\0' jest traktowane jako normalny bajt.

    0
  • #7 07 Lis 2016 18:28
    dawid.barracuda
    Poziom 13  

    Rzeczywiście, użyłem uart_putc(0) i działa bez problemu.
    Tak więc ten temat można zamknąć, nie ma po co sobie utrudniać, zero dodam sobie na końcu, po odbiorze paczki z nrf'a :)
    Dziękuję wszystkim za pomoc i pozdrawiam.

    0