Skocz do zawartości

Komunikacja UART i ćwiartowanie Stringów lub jak wysłać tablice Stringów


Wrona

Pomocna odpowiedź

Mam pomiary z 10 czujników temperatury i kilka zmiennych typu String. Wszystko to scaliłem w jeden String i wysłałem za pośrednictwem UART z jednego Arduino UNO do drugiego. Po stronie odbiornika chciałem powyciągać z tego Stringa kilka informacji. Dla takiego szczawika programowania, najprostszym rozwiązaniem było użycie string.substring(x,y). Działa, ale działać będzie jedynie do czasu gdy całość prototypu stoi na biurku i wskazuje temperatury dwucyfrowe. W praktyce pewne czujniki temperatury mogą mieć odczyty jednocyfrowe a wtedy ustawione na sztywno pozycje x i y przestaną mieć sens. Wolałbym uniknąć kombinowania polegającego na tym że gdy temperatura jest jednocyfrowa to dodaje przed nią "0". W efekcie dostałbym stringa o stałej "długości", ale to ostateczność. Uwagę mą zwróciła możliwość zapisywania wyników w postaci jednowymiarowej tablicy stringów bo wtedy odwołuje się do kolejnego numeru i nie trzeba się martwić tym czy są tam dwie czy jedna cyfry i jakie długie są dane tekstowe. Teraz konkretny problem na którym utknąłem, czyli jak przepchnąć taką tablice przez UART by po stronie odbiornika wesolutko odwoływać się do zmiennych po ich indeksach? Jeśli jednak "to se nedá" to może powinienem kombinować z dwuwymiarową tablicą char'ów? Poradźcie coś.

Link do komentarza
Share on other sites

@ethanak 

7 godzin temu, ethanak napisał:

A czemu String a nie float albo int?

Bo tam są również wysyłane komunikaty tekstowe a nie tylko wyniki pomiarów. Gdybym miał najpierw zakodować te teksty na liczby a potem odpowiednio je rozkodować na powrót w teksty to by było trochę karkołomne. Oczywiste dla zmiennych dychotomicznych lub o wąskim zakresie możliwych wyników byłoby to rozsądne rozwiązanie. Gorzej z wynikami daty i czasu bo trzeba by je porozkładać na czynniki pierwsze a data i czas mają stałą szerokość i doskonale można je "ekstrahować" string.substring(x,y). 

Generalnie jest tak że te cały długi string jest wysyłany w innym celu i do innego urządzenia. Dlatego kombinuje by w niego jak najmniej ingerować, tak by nadal służył temu do czego został zaprojektowany przez innego "wynalazcę". Ja go tylko po drodze przechwytuje i chce podzielić na części składowe. Korzystanie z substrinów pozwala mi całkowicie pozostawić oryginalny projekt takim jakim jest a ja jedynie podsłuchuję transmisje i rozwijam poboczny projekt. No ale skoro to się nie sprawdzi w praktycznym zastosowaniu to szukam innego rozwiązania. 

Link do komentarza
Share on other sites

 

1 godzinę temu, Wrona napisał:

cały długi string jest wysyłany w innym celu i do innego urządzenia

A to urządzenie docelowe musi to w jakiś sposób zrozumieć. Czyli jakiś sposób istnieje, a żądasz od nas, abyśmy nie mając dostępu do przesyłanych danych określili protokół...

Tyle, że jeśli wysyłane są napisy to nie maja one nic wspólnego z klasą String (bo ta służy do operacji na napisach wewnątrz programu), a przypisywanie konkretnych fragmentów konkretnym celom nie odbywa się za pomocą funkcji/metody "substring". Kilka możliwości:

  • Styl C - przestyłane są po kolei znaki napisu, a po nich NUL (znak o kodzie zero, nie myliść z NULL). Zaleta: możesz przesłać dowolnej długości napis. Wada: napis nie może zawierać znaku NUL.
  • Styl Pascal - przesyłana jest binarnie długość napisu, a potem po kolei znaki napisu. Zalety: napis może zawierać dowolny znak (w tym NUL_). Wada: długość napisu jest ograniczona szerokością pola "długość".

Przy przesyłaniu tablicy po prostu przesyłasz kolejne napisy, a odbiornik tworzy z tego np. kolejne wartości.

Proste, prawda?

 

Edytowano przez ethanak
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

@ethanak Jakiś nadajnik wysyła do odbiornika poprzez UART stringa z wynikami. Nie ma dla nas znaczenia czy tamten odbiornik go rozumie i jak go rozumie. Nie wnikamy w to. Ktoś tak to zaprogramował i to działa i jest sprawne i to nie nasza sprawa. Nie to jest rozpatrywana kwestią i o tym nie ma sensu dyskutować. Ja natomiast na drodze stawiam "podsłuch" z Arduino i mam dostęp do tego stringa. Widzę go np. jako

2020-11-02 10:05:24 24.54 24.55 25.84 25 23 24 28 21 24 25 Tak UwagaNaKota Nie WezParasol

na końcu jest '\n' bo docelowy odbiornik czyta przekaz do tego znaku

Teraz potrzebuje go rozebrać na części by każdą z nich przypisać do moich nowych zmiennych. Bez ingerencji w oryginalny projekt zrobiłem to substringami ale to działa tylko w przypadku liczb do czasu aż temperatury są zawsze powyżej 10oC.

Testuje więc możliwość że oryginalny projekt będzie miał dodatkowo (pierwotny string zostanie taki jaki jest i poleci sobie tam gdzie ma docelowa polecieć) możliwość wysłania tablicy stringów zawierającej te same informacje co pierwotny string zbiorczy. Dzięki temu mogę odwoływać się do poszczególnych "szufladek" zamiast określać bezwzględną pozycje początku i końca każdego wyniku. Poszczególne elementy tablicy wysyłam bez problemu np. Serial.println(Tablica[0]) czy Serial.println(Tablica[0]+Tablica[1]) Ja bym chciał wysłać całą tablice w całości by po stronie podsłuchu mieć odebraną jedną konkretną tablicę i korzystać z "szufladek" tablicy. Pierwszy raz podchodzę do tematu tablic więc szukam konkretnej informacji na zasadzie "nie da się i musisz to zrobić inaczej" lub "da się i obczaj sobie komendę taką a taką".

 

 

 

Link do komentarza
Share on other sites

4 minuty temu, Wrona napisał:

Ja bym chciał wysłać całą tablice w całości

Ale wiesz o tym, że String zawiera w sobie wskaźnik, a tego się nie da wysłać? Możęsz wysłać napis jako ciąg znaków i na miejscu utworzyć sobie z tego String, tablicę, wektor czy cokolwiek sobie wymarzysz.

 

6 minut temu, Wrona napisał:

Nie ma dla nas znaczenia czy tamten odbiornik go rozumie i jak go rozumie

Wbrew pozorom ma znaczenie, bo musimy go zrozumieć tak samo jak odbiornik.

Link do komentarza
Share on other sites

(edytowany)

@ethanak 

2 godziny temu, ethanak napisał:

Ale wiesz o tym, że String zawiera w sobie wskaźnik, a tego się nie da wysłać? Możęsz wysłać napis jako ciąg znaków i na miejscu utworzyć sobie z tego String, tablicę, wektor czy cokolwiek sobie wymarzysz.

 

Wbrew pozorom ma znaczenie, bo musimy go zrozumieć tak samo jak odbiornik.

Nie ma znaczenia. Nie potrafisz skupić się na konkretnym problemie. Już ci napisałem że jest sobie nadajnik i odbiornik. Nie ma dla nas znaczenia jako one się komunikują i czy się rozumieją. Zapewne się rozumieją skoro całość działa bez zarzutu. Dane przekazywane przez nadajnik są prawidłowo odczytywane i przetwarzane przez odbiornik. Cokolwiek się dzieje w pierwotnej wersji tego urządzenia to dzieje się tak jak ma się dziać. Teraz na scenę wchodzę ja "Janusz Hakerstwa". Dzięki sile i godności osobistej rozkręcam obudowę i podpinam swoje Arduino Uno jako "podsłuch" czyli mamy pierwotny odbiornik ale jest też dodatkowy czyli mój. Stworzyliśmy nową linie komunikacji jednostronnej i to na tym trzeba się skupić. Mam więc dostęp do tego stringa i go widzę swymi "paczałkami". Znamy więc jako strukturę i nic nie jest tutaj tajemnicze.

Mimo że starasz się pisać tak by nic nie napisać, to moja skromna osoba (która więcej nie wie, niż wie bo nadal raczkuje przed komputerem) wywnioskowała że ma pokombinować tak by:

1. Do pierwotnego nadajnika musze się dobrać i dopisać tam fragment który będzie dodatkowo wysyłał "ciąg znaków"

2. Muszę przekopać internety za jakaś konkretna funkcją która już w odbiorniku/podsłuchu zamieni mi ten ciąg znaków tablicę czy vektor automatycznie rozpoznając gdzie zaczynają się i kończą kolejne zmienne np. rozpoznając kolejne '\t'

 

Dziękuje za poświęcony czas ale widzę że nic z tego nie będzie więc w poszanowaniu tego czasu zakończę w tym miejscu. 

Raz jeszcze dziękuje i pozdrawiam

 

EDIT:

Gdyby tu trafiła przypadkiem, taka jak ja "programistyczna sierota" to pragnę zakomunikować że cały problem rozwiązuje odpowiedz zawierająca się w krótkim - "sprawdź se string.indexOf()" 🙂

 

Edytowano przez Wrona
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

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