Tablica char na tablicę int.

Tablica char na tablicę int.
CE
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 6 lat
  • Postów:7
0

Dzień dobry,
wysyłam na mikrokontroler przez UART wartości z zakresu 0-4000. Każda cyfra zapisywana jest na mikrokontrolerze w odpowiednim buforze.

Kopiuj
char buffor[buffor_size];

Następnie te wartości chciałabym przekazać na przetwornik mikrokontrolera, który przyjmuje jedynie wartości Uint32_t. Jednak nie potrafię przekonwertować tablicy charakterów na tablicę intów. Wiem, że zmienna char jest 8 bitowa, to oznaczało by, że musze wziąć po 4 symbole(cyfry) z bufora char, by otrzymać zmienną 32 bitową. Jednak nie potrafię w Internecie znaleźć odpowiednich funkcji.

Czyli tablica char wyglądałaby na przykład tak:

Kopiuj
char buffor[12] = '4', '0', '0', '0', '0', '0', '0', '2', '0', '4' ,'5' , '7';

A tablica int:

Kopiuj
int buffor1[3] = {4000, 2, 456};

W przykładach w Internecie znalazłam głównie przykłady z char *buffor. Dlatego nie pasowałyby do przesyłanych informacji. Z góry dziękuję.

edytowany 1x, ostatnio: flowCRANE
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 8 godzin
  • Lokalizacja:Szczecin
1

Oj nie, takich wartości by nie było w tej tablicy charów, aby otrzymać takie wartości intów.

Ogólnie od takich rzeczy jest memcpy, ale skoro piszesz na mikrokontrolery to może sie okazać, że masz słaby kompilator/bibliotekę standardową i trzeba będzie rozwiązać to w brzydki sposób.

W każdym razie, zakładając little-endian i 32-bitowy int:

Kopiuj
char x[4] = { 0x01, 0x02, 0x03, 0x04 };
unsigned y;
memcpy(&y, x, sizeof(y));
assert(y == 0x04030201);

Jak widzisz podobieństwo widać w w wartościach heksadecymalnych; porównanie wartości dziesiętnych do wartości złożonych ze znaków nie ma sensu.


edytowany 1x, ostatnio: kq
CE
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 6 lat
  • Postów:7
0

Tak wygląda mój buffor z wartościami przesłanymi na mikrokontroler.
Korzystam z STM32f303k8 i środowiska Keil v5.
Edytowałam załącznik: Jednak to przez błąd w transmisji, tak wygląda to poprawnie:

Capture.PNG

edytowany 3x, ostatnio: flowCRANE
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 8 godzin
  • Lokalizacja:Szczecin
0

No spoko, zobacz jak wyjdzie z użyciem memcpy. Nie znam tego środowiska - zwróć uwagę czy przypadkiem wygenerowany kod maszynowy nie będzie okropny.


CE
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 6 lat
  • Postów:7
0

Gdy dochodzi do tej konwersji zmienne wyglądają jak w załączonych plikach.
W wejściowym 1 7 7 0 w y=3618609.

Jeszcze nadmienię, że tablica przyjmująca wartości nie będzie miała tylko 4 wartości, ale więcej, więc powinno się ją podzielić zawsze w równych odstępach po 4 symbole.

edytowany 2x, ostatnio: Cebulciax
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 8 godzin
  • Lokalizacja:Szczecin
1

Czekaj, źle Cię zrozumiałem chyba i namieszałem.

Czy ty przesyłasz to jako 12-znakowy tekst? Wtedy faktycznie pierwszy przykład masz poprawnie-ish, a zamiany dokonuj po prostu jako odpowiednie mnożenia.

Kopiuj
int char_buf_to_int(static char buf[4])
{
    int result = 0;
    result += (buf[0] - '0') * 1000;
    result += (buf[1] - '0') *  100;
    result += (buf[2] - '0') *   10;
    result += (buf[3] - '0') *    1;
    return result;
}

// ...

char input[4] = { '1', '2', '3', '4' };
int val = char_buf_to_int(input);

Powyższe zakłada, że zawsze są 4 znaki i że nie ma sensu robić z tego pętli, a tak być nie musi.


edytowany 1x, ostatnio: kq
CE
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 6 lat
  • Postów:7
0

To może od początku.
Z pliku WAVE pobieram wartości chwilowe amplitudy, które później wysyłam na mikrokontroler, nie są to stałe wartości. To dałam w pierwszym załączniku.
Następnie przesyłam je na mikrokontroler do tablicy char mającej 200 indeksów. Chciałabym podzielić tę tablice char tak by każdy int składał się z 4 indeksów tablicy char. Ponieważ przesyłając wartość 2000, zapisywana jest ona w 4 kolejnych indeksach.
buffor[0]='2';
buffor[1] = '0';
buffor[2] = '0';
buffor[3] = '0';
A w dalszych indeksach też zapisywane są wartości.
.
.
.
buffor[197] = '0';
buffor[198] = '1';
buffor[199]='1';
buffor[200]='2';
Co chciałabym by dało tablicę intów. tab[]={2000,...,112};

06
Jaki jest sens wysyłania wartości próbek w formie tekstowej?
MasterBLB
  • Rejestracja:około 19 lat
  • Ostatnio:2 dni
  • Lokalizacja:Warszawa
  • Postów:1454
1

Skoro bufor ma mieć 200 char-ów, to aby przemielić cały potrzebujesz:

Kopiuj
for (int cnt = 0; cnt < 200; cnt += 4)//tutaj pułapka - wielkość int zależy od maszyny, na 64bitowych ma rozmiar 8 bajtów.
{
    int converted = (charBuffer[cnt] - '0') * 1000
    converted += (charBuffer[cnt + 1] - '0') * 100;
    converted += (charBuffer[cnt + 2] - '0') * 10;
    converted += charBuffer[cnt + 3] - '0';
    //i teraz tego skonwertowanego inta wsadzasz sobie do tablicy intów    
}

"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]
edytowany 3x, ostatnio: MasterBLB
06
To, czy int jest 64-bitowy, nie zależy tylko od platformy sprzętowej/systemowej, ale też od kompilatora. Jeśli się nie mylę, w VC++ i g++ int ma 32-bity pomimo kompilacji w 64-bitach.
vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
0
Cebulciax napisał(a):

Następnie przesyłam je na mikrokontroler do tablicy char mającej 200 indeksów. Chciałabym podzielić tę tablice char tak by każdy int składał się z 4 indeksów tablicy char. Ponieważ przesyłając wartość 2000, zapisywana jest ona w 4 kolejnych indeksach.

A w ilu indeksach jest zapisywana wartość 200? W jaki sposób?
Jeśli zapis pojedynczej liczby nie jest zawsze 4-cyfrowy to strona wysyłająca jest do przeróbki.

MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:minuta
1
Cebulciax napisał(a):

To może od początku.
Z pliku WAVE pobieram wartości chwilowe amplitudy, które później wysyłam na mikrokontroler, nie są to stałe wartości. To dałam w pierwszym załączniku.
Następnie przesyłam je na mikrokontroler do tablicy char mającej 200 indeksów. Chciałabym podzielić tę tablice char tak by każdy int składał się z 4 indeksów tablicy char. Ponieważ przesyłając wartość 2000, zapisywana jest ona w 4 kolejnych indeksach.
buffor[0]='2';
buffor[1] = '0';
buffor[2] = '0';
buffor[3] = '0';
A w dalszych indeksach też zapisywane są wartości.
.
.
.
buffor[197] = '0';
buffor[198] = '1';
buffor[199]='1';
buffor[200]='2';
Co chciałabym by dało tablicę intów. tab[]={2000,...,112};

Jako, że nie wiadomo po co to robisz trudno zrozumieć o co chodzi, szczególnie, że opis wskazuje na jakieś bardzo dziwne zachowanie (nie brzmi ono znajomo i sensownie).
Możesz na chwilę zapomnieć jak chcesz to oprogramować i opisać funkcjonalność jaką ma wykonywać ten mikrokontroler?
Będzie łatwiej zrozumieć co zamierzasz i czy twoje zamiary są właściwe.
Np: "chcę mrugać diodami zależnie od natężenia dźwięku."

Czemu mnie niepokoi twój opis?

  • piszesz o dźwięku WAVE
  • grupujesz 4 znaki ASCII i chcesz zinterpretować je jako liczby dziesiętne co nijak się

Te dwie rzeczy zupełnie do siebie nie pasują i wskazują na to, że rozwiązanie jakiegoś problemu jest nieprawidłowe, albo opis niekompletny.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 3x, ostatnio: MarekR22
CE
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 6 lat
  • Postów:7
0
MasterBLB napisał(a):

Skoro bufor ma mieć 200 char-ów, to aby przemielić cały potrzebujesz:

Kopiuj
for (int cnt = 0; cnt < 200; cnt += 4)//tutaj pułapka - wielkość int zależy od maszyny, na 64bitowych ma rozmiar 8 bajtów.
{
    int converted = (charBuffer[cnt] - '0') * 1000
    converted += (charBuffer[cnt + 1] - '0') * 100;
    converted += (charBuffer[cnt + 2] - '0') * 10;
    converted += charBuffer[cnt + 3] - '0';
    //i teraz tego skonwertowanego inta wsadzasz sobie do tablicy intów    
}

Dziękuję, właśnie o takie coś chodziło.

Jeśli chodzi o przyczynę takiego pytania to śpieszę z odpowiedzią.
Chcę zrobić wzmacniacz audio, który będzie komunikował się z komputerem przez Bluetooth, jako, że przez UART można przesłać tylko 8-bit char, a do przetwornika cyfrowo-analogowego 32bit uint, po przesłaniu musze zrobić konwersję jednego z typów na drugi. Chciałam pominąć, przez moją małą wiedzę z zakresu programowania, odczytywanie wartości pliku WAVE. Dlatego najpierw konwertuję go na komputerze na chwilowe wartości amplitudy, a następnie wysyłam te wartości na mikrokontroler. Może niezbyt elegancka praktyka, ale z moja wiedzą, jedyna możliwa do zrealizowana.
Dziękuję wszystkim za odpowiedzi.

Liczba 200 zapisywana jest w sposób '0', '2' ,'0','0'. Więc zawsze z 4 elementów char, chciałam robić jedną wartość int.

edytowany 1x, ostatnio: Cebulciax
MasterBLB
To pyknij ptaszka pod postem.
06
To nie tłumaczy, dlaczego wysyłasz próbki w formie tekstowej. To totalnie nie efektywne. 16-bitowe próbki możesz przecież zapakować do bufora int16_t[] i wysłać jako ciąg bajtów.
CE
Przez program LabView, z tego co się orientuję można wysyłać jedynie stringi.
CE
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 6 lat
  • Postów:7
0

Dzień dobry,
Próbowałam poradzić sobie z problemem włożenia tych danych do tablicy jednak chyba sobie nie radzę.

Stworzyłam tablicę intów, a nastęnie chciałam je zapisać za pomocą pętli.

Kopiuj
for(int i=0; t<buffor_size;i++){
convertedTab[i]=converted;}

Czy jest to słuszny sposób? Wartości w ten sposób cały czas się nadpisują.

edytowany 2x, ostatnio: flowCRANE
MasterBLB
Załóż nowy wątek, i daj w nim cały kod dotyczący obu buforów.
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 8 godzin
  • Lokalizacja:Szczecin
0

Przydałoby się trochę więcej kontekstu.


CE
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 6 lat
  • Postów:7
0

Gdy wysyłam dane do mikrokontrolera odbieram je w przerwaniu, a gdy transmisja się skończy zapisuję w danej tablicy char. Następnie wartości są konwertowane na tablicę int. Niestety ta wartość się nadpisuje, co powoduje, że i tablica się nadpisuje, a chciałabym, by była statyczna.
Jeśli wyzerowałabym tablicę char, która przychodzi do mikrokontrolera zmienna converted przyjmuje minusową wartość -53328 i wypełnia nią całą tablicę intów. A chciałabym, by ta tablica została zapisana tylko raz.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)