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.

STM32F103RB + BTM-222, odbieranie danych z kompa do uP, jak odebrać ciąg znaków

damian_hey 23 Kwi 2012 13:43 3151 32
  • #1 23 Kwi 2012 13:43
    damian_hey
    Poziom 9  

    Witam.
    Pozdrawiam szanownych forumowiczów!

    Potrzebuję odebrać przez moduł btm222 do procesora konkretne dane. Dane zapisane są do pliku w postaci ciągu cyfr np. 345675534999888432 ( tu może być ich więcej ale będzie to wielokrotność. 3*6*X ).
    Teraz wysyłam ten plik programem realterm.

    Nie umiem ich odebrać uP w pożądany sposób:

    Aby rozdzielił te dane i zapisał do 6 tablic:
    nr_danej0[ido]; //kolejna zmienna w tablicy
    nr_danej1[ido];
    nr_danej2[ido];
    nr_danej3[ido];
    nr_danej4[ido];
    nr_danej5[ido];

    Przykład dla ciągu:
    000111222333444555666777888999[...]
    nr_danej0[0]; //000
    nr_danej1[0]; //111
    nr_danej2[0]; //222
    nr_danej3[0]; //333
    nr_danej4[0]; /444
    nr_danej5[0]; //555

    nr_danej0[1]; //666
    nr_danej1[1]; //777
    .
    .
    .

    Pracuje na uP STMF103RB na rejestrach.

    Udaje mi się odbierać pojedyncze liczby dwucyfrowe np. 56 za pomocą funkcji:
    //ODBIERANIE byte
    u8 usart_read_byte ()
    {
    u8 data;
    while(USART1->SR&USART_SR_RXNE) //jeśli jest dana do odczytana
    {
    data=USART1->DR; //odczytuje, tym samym wyzeruje RXNE
    }
    return data;
    }

    Nie mam na to dobrego pomysłu a jak już coś mi przyjdzie, to "to" po prostu się nie sprawdza lub nie umiem tego napisać.

    Byłbym wdzięczny za pomoc w rozwiązaniu tego zagania gdyż jest to ostatnia rzecz w projekcie nad którym pracuje (i jest prawie ukończony a bez tego nie obejdzie się).

    0 29
  • #2 23 Kwi 2012 13:47
    Freddie Chopin
    Specjalista - Mikrokontrolery

    A te dane to są jakiegoś typu? Skąd my mamy wiedzieć, czy ta tablica przechowuje liczby czy łańcuchy znakowe?

    4\/3!!

    0
  • #3 23 Kwi 2012 18:40
    damian_hey
    Poziom 9  

    No tak to pominąłem.
    W tablicy są liczby.
    Dokładnie to typ u32. Choć wystarczy informacja o liczbowym typie.

    Może skorzystam i dopiszę coś jeszcze.

    Otóż program realterm nie jest dla mnie dobrze znany więc opisze jakie czynności zamierzam wykonać.

    Wysyłam z uP dane do kompa przez BTM222 i odbieram aplikacja realterm.
    Dane odebrane aplikacja a wysłane w uP wysłałem jako (choć w pamięci były u32) string i otrzymuje przykładowy ciąg po odbiorze na kompie: 000111222333444555 eof 666777888999293042 eof [...]
    Teraz biorę opcje zapisz do pliku. Zapisuje (jako txt). Teraz chcę te dane odesłać z powrotem. Jeżeli trzeba mogę coś wykasować ale najlepiej by było żebym mógł je odesłać w takiej samej postaci jak zostały zapisane. Biorę wyślij plik.
    Następnie chcem te dane które teraz ida do uP przedstawić/zapisać w taki sposób jak podałem wcześniej. Jednakże moja wiedza i poziom zaawansowania nie pozwalają mi tego dokonać bez waszej pomocy.

    0
  • #4 23 Kwi 2012 19:01
    gaskoin
    Poziom 38  

    damian_hey napisał:
    Nie umiem ich odebrać uP w pożądany sposób:

    Aby rozdzielił te dane i zapisał do 6 tablic:
    nr_danej0[ido]; //kolejna zmienna w tablicy
    nr_danej1[ido];
    nr_danej2[ido];
    nr_danej3[ido];
    nr_danej4[ido];
    nr_danej5[ido];

    Przykład dla ciągu:
    000111222333444555666777888999[...]
    nr_danej0[0]; //000
    nr_danej1[0]; //111
    nr_danej2[0]; //222
    nr_danej3[0]; //333
    nr_danej4[0]; /444
    nr_danej5[0]; //555

    nr_danej0[1]; //666
    nr_danej1[1]; //777


    Nie wiem jak inni, ale ja nic ani z opisu ani z przykładu nie rozumiem. Pojedynczy element w tablicy (który jak napisałeś - jest liczbą) jest wg tego co napisałeś trzema elementami. Oczywiście tradycyjnie nie odbiegając od reszty wkleiłeś kod, który nie przedstawia problemu :) Mógłbyś wkleić cały i na spokojnie wyjaśnić o co chodzi w algorytmie wpisywania do tablicy ? Gdyż jak napisałeś projekt jest iście zaawansowany i nie potrafię zrozumieć sposobu wpisywania 3 wartości do komórki tablicy będącej liczbą. Z tematu wynika, że chcesz odebrane dane, tak jak lecą, wrzucić do tablicy ? Nie rozumiem tylko w czym wtedy problem.

    0
  • #5 23 Kwi 2012 20:26
    damian_hey
    Poziom 9  

    Po pierwsze w moim przekonaniu nie napisałem nic co świadczy o IŚCIE zaawansowanym projekcie. A może nawet taki być.
    Projekt to sterowanie ramieniem robota o 6 osiach z a pośrednictwem manipulatora ręcznego. Ruch płynny i szybki.
    Jeżeli być chciał wyśmiać zaawansowanie pracy to fakt nie jest to kosmos. Dlatego ten dział.
    Na razie wykonałem ramie robota, i dwa manipulatory ręczne do jego. Oraz całą część sterowania.
    Ramie jest sterowane z manipulatora ręcznego, który podaje sygnał pozycji do uP sygnały są filtrowane żeby nie było drgań i zakłóceń które by machały ramieniem. Do tego włączam opcje nagrywania i zapamiętuje konkretne pozycje robota pod właśnie tymi zmiennymi co ich nie rozumiesz. Można to później po tych pozycjach odtworzyć w wybranym tempie. Jako, że jest to pętla otwarta i nie mam sygnału zwrotnego to sterowanie ramieniem płynnie w wybranym tempie to nie taka banalna sprawa. Te zapamiętane dane w uP, (zapamiętane położenia) chce wysłać do komputera w celu zapamiętania jako konkretny program sekwencji ruchowej a potem chcę je odesłać z powrotem jako wybrany program. I tego odsyłania nie umiem zrobić. A jest w tym projekcie więcej rzeczy których od ręki nie pamiętam, żeby się tu nimi pysznić bo nie po to tu napisałem. Czy Ty rozumiem, chcesz żebym ten cały kod tutaj wkleił i go wyjaśniał co gdzie chcę zrobić? Fajnie, że chcesz pomóc ale jeśli dobrze to odebrałem to tak nie da rady. Wybrałem fragment który wydawał mi się wystarczający do opisania problemu ale mogłem się mylić.


    Powiem tak, nr_danej0[ido] to tablica.
    masz nr_danej0[0]=000
    nr_danej0[1]=666
    nr_danej0[2]=546 to jest zawartość tej tablicy.
    I teraz chcę wysłać z kompa ciąg liczb/znaków 345345346346254...
    i umieścić je w tych tablicach jako liczby składające sie z 3 cyfr. Jeśli wiec wyjlesz 444555666 jako znaki/liczby to potem bierzesz pierwsze 3 i zamieniasz na liczby tak by odzwierciadlały właśnie tą wartość 444.
    Przepraszam ale nie wiem jak dokładniej to opisać.
    EDIT:
    Teraz wiem, że głupio opisałem problem. Zaraz spróbuję to inaczej opisać.
    na początek:
    Problem polega na tym, że w przesyle danych jestem amator jakich mało.
    Obsługa i znane możliwości programu realterm- b. niska, tak jak i BTM.
    Skracając problem:
    Czy ktoś może mi podać przykład w którym wysyła plik .txt z zawartością np. 342353462. Wysyła ten plik z programu realterm jako wyślij plik. To leci przez BTM222 do uP, który ten plik odczytać ma jako liczby: 342,353,462 pod zmiennymi: a,b,c.

    To mi winno wystarczyć. Ale to nie mało roboty dla kogoś- jak mi się wydaje.

    0
  • #6 23 Kwi 2012 20:32
    sulfur
    Poziom 24  

    gaskoin napisał:
    Nie wiem jak inni, ale ja nic ani z opisu ani z przykładu nie rozumiem.

    Autor tematu przesyła 6 wartości, i chce te 6 powiązanych wartości mieć w 6 osobnych tablicach w taki sposób, że indeks zerowy wszystkich tablic odwołuje się do powiązanych ze sobą danych.

    0
  • #7 23 Kwi 2012 21:35
    gaskoin
    Poziom 38  

    Nie ma się co denerwować i nie wyśmiewam nikogo.
    Tylko napisałeś że ta tablica, np nr_danej0 jest tablicą liczb, z opisu transmisji wynika coś innego. Z kolei wklejona funkcja służy do odbierania, co z kolei działa pewnie dobrze. Pytanie tylko czy chcesz, aby funkcja ta była blokująca (czekała na dane) czy nie blokująca, tzn nie będzie blokowała programu głównego?

    Jeśli blokowanie nie jest problemem, i wysyłasz znacznik końca pliku i masz pewność, że dane są zawsze poukładane tak samo (w grupie po 3), to wystarczy zrobić coś takiego.

    Z tego co zrozumiałem, to w każdej z tych tablic chcesz mieć po 3 liczby. Dane przychodzą jako znaki (char). Wygodniej byłoby zrobić jednak jedną wielowymiarową tablicę.

    Wariant z jedną tablicą będzie wyglądał mniej więcej tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Jest to rozwiązanie dalekie od doskonałości, chociażby dlatego, że jest blokujące, ale mniej więcej tak powinny być układane dane. Zmiana na nieblokujące polegała by jedynie na wystawieniu dodatkowej flagi (zamiast brake'a w whilu), że czas sparsować dane. Zamiast pętli będzie po prostu przerwanie i zamiast funkcji czytającej był by tylko odczyt z rejestru danych.

    Jeśli chcesz mieć te 6 tablic można to zrobić też ładnie na wskaźnikach. Zamiast powyższej paskudnej 3 wymiarowej tablicy też warto zrobić to z użyciem wskaźników. Chciałem tu jedynie przedstawić ideę w sposób w miarę jasny, niekoniecznie elegancki.

    tablica ma 3 wymiary - pierwszy to numer danej, drugi to numer ramki (czyli Twojej pojedynczej grupy danych) a trzeci to numer danej w tej trzyliczbowej paczce.

    Nie używałem realterma, jeśli wysyłasz te znaki jako znaki ascii, to dlatego tam przy odczycie jest 0x03, bo w ascii jest to znak końca tekstu (który musisz jawnie wysłać). EOF nie ma odpowiednika w ASCII. -48 to magiczna konwersja z chara na liczby. zamiast tego 0x03 możesz dać cokolwiek w pliku, np jakąś literę (bo wysyłasz tylko liczby).

    0
  • #8 23 Kwi 2012 21:39
    Freddie Chopin
    Specjalista - Mikrokontrolery

    No i w czym problem? Nikt tutaj nie chce się wyzłośliwiać, ale piszesz o zaawansowanym projekcie, a pytasz generalnie o coś w czym po prostu nie ma problemu... No bo ja go nie widzę... Odbierasz łańcuch znaków, bierzesz pierwsze 3 (np. wydzielając sobie je do innego łańcucha), konwertujesz na liczbę i już. Albo bierzesz po jednym znaku i konwertujesz na liczbę po kolei. Albo... No po prostu gdzie jest problem?

    4\/3!!

    0
  • #9 23 Kwi 2012 22:59
    damian_hey
    Poziom 9  

    dla mnie jest problem w tym: napisz....
    Nie umiem. Mi nie wychodzi odbieranie tego łańcucha. Można nawet źle to wysyłam z kompa bo nie znam programu.
    Projekt nie jest dla was istotny. Dlaczego sie czepiacie tego co nie jest głównym wątkiem? Kolega szanowny zarzucił mi że pisałem coś o iście zaawansowanym projekcie czego nie zrobiłem. A dopiero potem jako opis - bo wydało mi się że chciał, napisałem o tym co robię i przedstawiłem ten projekt. To wy twierdzicie że jest zaawansowany, ja zasugerowałem w tej odpowiedzi, że może a nie musi taki być. Wasze zdanie. To nie istotne pomińmy to. Ja mam problem. Wy chcecie pomóc. No to tak:
    Przedstawiłem konkretny problem. Nie wiem jak to napisać.
    Mam braki wiedzy to wszystko. To chyba nie jest trudno pojąć.
    Ja rozumiem, że wy nie widzicie problemu, a ja tak. Więc proszę o przykład kodu, który:
    na ARMIE realizuje np. to co pogrubiłem w poprzednim pocie, czyli:

    Wysyłam dane z programu realterm opcją wyślij plik.txt. W pliku txt mam zapis przykładowy: 111222333444555[......... iloć tych cyfr to wielokrotność 18] To spokojnie idzie do BTM222. I teraz potrzebuje kodu programu ktory w STM32F103 odbierze te dane z USART1 I przypisze je pod zmienne. Z tym, że w tą zmienna ma być przypisana konkretna ilosc cyfr: to jest 3. Czyli np. a=222, b=333,[..] z=476. I te liczby sa właśnie z tego pliku.
    Juz bardziej łopatologicznie nie umiem tego wytłumaczyć.
    Jeśli to nie zrozumiałe to
    przykład konkretnie mógłby być taki:
    Umieszczę dane w pliku txt 234567333. Wyślę je tak jak wyżej poprzez realterm wyślij plik i arm ma to odebrać pod zmienne:
    u32 a (odebrana wartosc to 234)
    u32 b (odebrana wartosc to 567)
    u32 c (odebrana wartosc to 333)
    to wszystko.
    Jeśli to dla was takie proste to po prostu napiszcie ten kod ktory to zrealizuje i to mi wystarczy.
    Jest jeszcze kwestia programu realterm bo nawet nie znam zasady na której on wysyła ten plik.txt. jako ciąg znaków jako co.. nie wiem.
    Z góry dziękuję za poświęcony czas na napisanie takiego kawałka kodu.

    0
  • #10 23 Kwi 2012 23:20
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Jesteś w stanie odebrać ciąg znaków? Jesteś w stanie odebrać jeden znak? Bo najpierw piszesz o problemie z pakowaniem tego do tablic, a teraz wydaje mi się, że problemem raczej jest odebranie czegokolwiek...

    4\/3!!

    0
  • #11 23 Kwi 2012 23:31
    damian_hey
    Poziom 9  

    ototototo.

    Umiem odebrać 1 znak. W zasadzie liczbę dwu cyfrową nic po za tym.
    Robię to tak:
    //ODBIERANIE byte
    u8 usart_read_byte ()
    {
    u8 data;
    while(USART1->SR&USART_SR_RXNE)
    {
    data=USART1->DR;
    }
    return data;
    }

    edit:
    z tym ze w realterm w zakladce sent wpisuje liczbe 76 i sent number, i to moge odebrac. Jak dam wieksza liczbe (3 cyfrowa) to nic nie wysle. Jak tam 65 76 i zaznacze /n after to odbiore jedna liczba 65.

    0
  • #12 23 Kwi 2012 23:57
    gaskoin
    Poziom 38  

    Chyba nie czytałeś moich wypocin. Gotowca Ci nie damy :) Czyli nie są to jednak 3 znaki a liczba trzyznakowa :) Tobie pewnie chodzi o to, żeby wpisać 8944784378437834 i odebrać to jako trzycyfrowe liczby w uC. Tak się nie da, bo ramka uart ma tylko 8 bitów danych więc maksymalną liczbę jaką możesz wysłać to 255. Musisz tą liczbę albo skleić sobie do kupy w kodzie, albo przyjąć jakąś ramkę danych. Poza tym dalej nie wiemy czy wysyłasz to jako napis, czy jako liczby czy jako co ? I jak to odbierasz ? W pętli czy jak ?

    Przykładowo jednorazowe odbieranie jednego trzycyfrowego numeru, jeśli jest on wysłany jako napis (również w dziwacznej pętli)

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #13 24 Kwi 2012 01:46
    damian_hey
    Poziom 9  

    PS. Mam nadzieję, że nie rażę nikogo zwrotem "kolego".
    Szanowny kolego gaskoin.
    Najwyraźniej my nie czytamy swoich postów na wzajem.
    Szanowni koledzy.
    Problem mam z wysłaniem z kompa i odebraniem w uP. Bo nie wiem jak zrobić poprawnie jedno i drugie.
    Padło pytanie: jak to wysyłam? Łańcuch czy coś.... otóż nie wiem - bo z tym mam też problem.
    Jeżeli w wysyłanie danych z kompa bawię się 1 raz to nie chcę tracić czasu na pisanie programu na kompie do odbioru i wysyłania danych(zresztą to też trzeba umieć).
    Używam poleconego z forum programu: realterm. O czym juz kilkakrotnie pisałem. Ale może macie coś co lepiej się nadaje do mojego zadania.
    Jak też pisałem, wybieram odpowiednią opcje w programie. Wyślij plik. Plik jest zapisany w postaci .txt a w tym pliku jest zapisane cos takiego 111222333445432542. I teraz nie wiem do prawdy jak on to wysyła. Czy string czy co. Mi się wydaje ze chary wysyła.
    W zasadzie zacząłem problem od "dupy" strony. Bo najpierw powinienem sie starać uzyskać tą informację. Czy tym programem jestem w stanie wysłać tego rodzaju dane i w jakiej postaci on mi to wyśle. Następnie martwić się odbiorem. Napisałem od samego początku co próbuje zrobić ale nie dodałem na samym początku że nawet nie wiem jak cos takiego wysłać. Dla mnie dział początkujący w tym zagadnieniu to nawet za wysoko a dla was to podstawy, ot co wysyłanie i odbieranie - dla mnie jeszcze nie odkryte pole.
    To ,ze beznadziejnie opisałem sprawę to fakt, problematyczne ale być może dojdziemy do setna sprawy.

    A więc może zacznę zupełnie inaczej. Wiemy co chcę zrobić. Chyba to jakoś wypociłem wcześniej. Teraz tak na świeżo od nowa:
    Wysłać dane z komputera do uP.
    Jakie dane?
    np ciąg cyfr: 123123333444555666. Z zastrzeżeniem, że ciąg moze być znacznie dłuzszy. A więc prawdopodobnie najlepiej jako plik z takim ciągiem cyfr.
    Mam do dyspozycji STM32f103 i moduł komunikacji BTM222
    1. Jak to zrobić? /Jakiego programu użyć?

    2. Jak juz będziemy wiedzieli czym mogę wysłać taki plik i jak to zrobić, to teraz jak to odebrać te wszystkie dane w uP?

    3. Jeśli odbiorę to w procesorze to w jakiej postaci?
    4. Jak zrobić by uP odczytując kolejne dane mogł łaczyć w liczby 3cyfrowe tak, by owe dane z pliku byly odczytany jako 123,123,333,444,555,666? - wydaje mi sie ze tu kolega gaskolin proponuje kawałek kodu ale mimo implementacji nie uzyskałem pożądanego efektu - być może źle tego użyłem albo źle wysyłam dane z laptopa, no lub ostatecznie jedno i drugie.

    Może odpowiadając na te punkty szybciej się zorientujecie jak mi pomóc. Bo chyba o to chodzi. Mam też nadzieję, że coś się nauczę.
    Pozdrawiam.
    Dziękuję za zainteresowanie i szybki odzew. To doprawdy budujące.

    0
  • #14 24 Kwi 2012 08:02
    Freddie Chopin
    Specjalista - Mikrokontrolery

    W kodzie gaskoina jest pewien błąd:
    1. Tablica bufer powinna mieć rozmiar 4, a nie 3 (3 znaki + '\0')
    2. Przed konwersją trzeba upewnić się, że ostatni element buffer[3] jest równy 0, czyli po prostu przed atoi() trzeba wstawić linijkę buffer[3] = 0;

    Popraw to i powiedz co nie działa. Na razie skup się na wysyłaniu JEDNEGO ciągu trzyznakowego.

    4\/3!!

    0
  • #15 24 Kwi 2012 13:00
    damian_hey
    Poziom 9  

    Przed wysłaniem 3charów z kompa ( bo jeśli dobrze zrozumiałem komentarz w programie to plik wysyła jako chary) wyświetliłem numer_ktory_chcesz_miec i on ma wartość 0 a po wysłaniu charow 842 przyjmuje 8.
    Jeżeli podglądam buffor to wygląda to tak: przed wysłaniem 0 0 0 po wysłaniu: 56 1 2
    Jeśli wysyłam 567 to numer_ktory_chcesz_miec ma wartość 5 a buffor 53 1 2.
    Można zauważyć, że wysyła pierwszy char w asci i otrzymujemy to jako wynik. Kolejne zaś nie występują. Ciekawy fakt to taki, że buffor[1],[2] nie zmienia swojej wartości. Po wysłaniu jakich kolwiek danych ciągle ma wartości 1,2 tylko pierwsza dana się zmienia.
    Dodałem linijkę z buffor[3]=0; choć w sumie nie wiem dlaczego. Efekt ten sam.
    Wydaje mi się, ze wielkość buffor też ma rozmiar:
    char buffer[3];
    W moim mniemaniu jeśli nie używamy 4 tylko 3 cyfry to powinniśmy zrezygnować z buffor[3]=0;
    i zadeklarować go jako
    char buffer[2]; // w efekcie dalej jest to samo.
    Choć po zrobieniu tego na te 3 sposoby, gaskiona, potem z Freddiego poprawkami, a potem tak jak opisałem wyżej rezultat jest ciągle identyczny.
    Pierwsza cyfra dochodzi dobrze i tylko ona jest. A w bufforze 1 cyfra to asci a kolejne dwie to na sztywno 1 i 2.

    0
  • #16 24 Kwi 2012 13:31
    gaskoin
    Poziom 38  

    Freddie Chopin napisał:
    W kodzie gaskoina jest pewien błąd:
    1. Tablica bufer powinna mieć rozmir.


    a nie ma ? :)

    Freddie Chopin napisał:

    2. Przed konwersją trzeba upewnić się, że ostatni element buffer[3] jest równy 0, czyli po prostu przed atoi() trzeba wstawić linijkę buffer[3] = 0;


    Tablica o rozmiarze 3 nie ma elementu z indeksem 3 :)

    Z tego co opisujesz damian to ten realterm jest jakiś lewy, nie używałem go, więc nie mogę za bardzo Ci nic poradzić. Widać, że wysyła on tylko pierwszy znak + jeszcze jakieś znaczniki. Poszukaj na necie czy nie da się wysyłać znaków ciągiem bez tych cudaśnych 1 2. Albo wypróbuj Bray terminal, jest bardzo prosty i można znaki wysyłać ciągiem.

    damian_hey napisał:
    cyfrowe tak, by owe dane z pliku byly odczytany jako 123,123,333,444,555,666? - wydaje mi sie ze tu kolega gaskolin proponuje kawałek kodu ale mimo implementacji nie uzyskałem pożądanego efektu - być może źle tego użyłem albo źle wysyłam dane z laptopa, no lub ostatecznie jedno i drugie.


    Mój kawałek kodu (ten drugi) sklei z trzech przysłanych po kolei znaków jedną liczbę. Sam musisz określić czy chcesz żeby to tak było i dodać część, która będzie odbierała x takich znaków i pakować je w tablicę. Najpierw jednak spróbuj bray terminal i spróbuj wysłać trzy znaki tak, żeby zbudowała się z nich jedna liczba. Nie staraj się zbudować wszystkiego na raz, raczej małymi krokami coś tam dodawaj.

    0
  • #17 24 Kwi 2012 13:52
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Coś mi przycięło posta...

    Tablica ma rozmiar 3, a powinna mieć 4 jeśli chce się używać atoi().

    4\/3!!

    0
  • #18 24 Kwi 2012 14:02
    damian_hey
    Poziom 9  

    program realterm najwyraźniej jest sprawny.
    Ten sam efekt uzyskuje przez Br@y terminal.
    Zaraz sprawdzę z rozmiarem 4 // po sprawdzeniu efekt ten sam.
    bez roznicy czy deklaruje buffer[2]=0 ,buffer[3]=0 ,buffer[4]=0 bo ciągle ten sam efekt.
    Ale przydało by się coś ustalić, bo chyba nie wszyscy sie zgadzamy:
    jeżeli deklaruje buffer[3] to rozmiar jest 4. bo 0,1,2,3. Czy źle to rozumiem?

    Zaciekawił mnie fakt, że danie opóźnienia 1ms lub 20ms w tej pętli for daje w rezultacie zmianę wartości buffer[1] i buffer[2] z 1 , 2 na powiedzmy 60 , 60.
    Z ciekawości zmieniłem później prędkość transmisji w programie na 9600 (z 19200- bo tak ma BTm222) i co ciekawe nie ma to żadnego znaczenia bo uP odbiera ciagle dobrze 1 znak a kolejne tak jak wcześniej. Więc przetestowałem wysyłanie z uP do kompa i co ciekawe również nie ma to żadnego znaczenia. Bo dane przychodzą dokładnie takie jakie wysłał uP. Kompletnie juz tego nie rozumiem. (tak samo jest w realterm i w bray terminal). zamykam port, zmieniam baund rate i otwieram. W ogóle nie ma to wpływu. dane odbieram na lapka dobrze. A wysyłanie jak wspomniałem też idzie ale 1 znak a potem dwa kolejne ktore nie mają wpływu.
    Dziwi mnie też, że :
    skoro niby ta linijka:
    numer_ktory_chcesz_miec = atoi(buffer);
    ma skleić 3 znaki w całość to dlaczego jeśli odbiorę bufferem 52, 60, 60, wyświetla mi się tylko znak z 52 a reszte olewa? Tu jest coś nie tak. Bo by wyświetlił wtedy znak 52 i 60 60 a tak nie robi wiec tego nie skleja.
    Kolejna wskazówka to, że na te dwa kolejne znaki ma wpływ opóźnienie w pętli for.
    Co myślicie?

    0
  • #19 24 Kwi 2012 15:23
    Freddie Chopin
    Specjalista - Mikrokontrolery

    damian_hey napisał:
    Ale przydało by się coś ustalić, bo chyba nie wszyscy sie zgadzamy:
    jeżeli deklaruje buffer[3] to rozmiar jest 4. bo 0,1,2,3. Czy źle to rozumiem?

    Źle to rozumiesz. To są podstawy C.

    damian_hey napisał:
    Dziwi mnie też, że :
    skoro niby ta linijka:
    numer_ktory_chcesz_miec = atoi(buffer);
    ma skleić 3 znaki w całość to dlaczego jeśli odbiorę bufferem 52, 60, 60, wyświetla mi się tylko znak z 52 a reszte olewa? Tu jest coś nie tak. Bo by wyświetlił wtedy znak 52 i 60 60 a tak nie robi wiec tego nie skleja.

    Cyfrom odpowiadają wartości od 48 do 57 (włącznie), więc niby jak ma Ci przekonwertować wartość 60?

    Reasumując - pierwszy odebrany przez Ciebie znak jest prawidłowy ZAWSZE?

    Pozostałe odbierane są źle, bo Twoja funkcja odbierająca jest zupełnie zła - nie czeka na pojawienie się czegoś w buforze, tylko czyści go do skutku. Przy drugim i kolejnym wywołaniu w ogóle funkcja niczego nie robi tylko od razu wychodzi. bo w buforze odbiorczym nic nie ma.

    4\/3!!

    0
  • #20 24 Kwi 2012 15:45
    damian_hey
    Poziom 9  

    Tak pierwszy znak zawsze jest dobry.
    Funkcja odbioru byte przedstawiłem wcześniej.
    Jest tak jak mówisz.
    Jak chcem to odczytac to robie to tak:
    data=USART1->DR; //czyści flage RXNE.
    A jak to odczyta to czyści flage
    To oznacza, że tą funkcją nie moge odebrać zupełnie nic poza 1 bitem.
    W takim razie musze wrócić do noty katalogowej uP bo najwyraźniej nie mogę tego w taki sposób odczytywać.

    0
  • #21 24 Kwi 2012 15:47
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Przed odebraniem czegokolwiek masz poczekać na ustawienie się flagi RXNE. Funkcją tą oczywiście nie możesz odebrać nic poza jednym BAJTEM, bo niby czemu chciałbyś to zrobić? Zupełnie wystarczy, żeby odbierała jeden bajt, byle poprawnie, bo obecnie tak nie jest.

    4\/3!!

    0
  • #22 24 Kwi 2012 16:06
    damian_hey
    Poziom 9  

    Jak nie jest jak jest?

    Code:

    u8 usart_read_byte ()
    {
    u8 data;
        while(USART1->SR&USART_SR_RXNE) // jesli nie ustawi RXNE to nie wejdzie w while
       {
        data=USART1->DR; //tu po odczytaniu kasuje RXNE, a wiec czekam na następny char. Przyjdzie to ustawi RXNE, tak to rozumiem.   
       }
    return data;
    }

    w mainie:
    Code:
    if (USART1->SR&USART_SR_RXNE) // jesli RXNE sie pojawi to zrob if 
    
                {
                
                for(i = 0; i < 3; i++)
                             {
                             buffer[i] = usart_read_byte();
                             numer_ktory_chcesz_miec = atoi(buffer);
                             }
                
                }


    To pozwala mi odebrać jeden znak asci. ZAWSZE dobrze ten jeden więc nie rozumiem co jest według Ciebie źle

    0
  • #23 24 Kwi 2012 16:21
    gaskoin
    Poziom 38  

    Ta funkcja powinna wyglądać tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Widisz drobną różnicę ? Jak bit jest nieustawiony to czeka, w Twoim przypadku jest tak, że jak nie ma nic do odebrania to zwraca losową wartość jaka aktualnie będzie na stosie.

    Kod w mainie zamiast tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Powinien wyglądać tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #24 24 Kwi 2012 18:19
    damian_hey
    Poziom 9  

    Kolego gaskoin. Tak różnica jest rażąca. Dostrzegłem ją.
    Myślę, że to jest pewne rozwiązanie ale nie może tak pozostać.
    Po pierwsze program jeśli tak to zapiszemy w mainie zawsze wejdzie do funkcji odczytu, gdzie będzie czekał i czekał i czekał, aż coś mu nadamy... No to moge wykorzystać tak, że mi będzie pasowało gdyż to już moja broszka jak to przerobić. Jednakże tak napisany kod nie może odebrać 3 znaków wysłanych jednocześnie. Może odebrać 3 znaki ale musze wysyłać je pojedynczo w programie: wpisze 8 wyślij, wpisze 4 wyślij, wpisze 2 wyślij wtedy złoży mi liczbę 842. Jednakże jeśli mu wyślesz 842 za jednym razem to na zaproponowanym rozwiązaniu w while, w funkcj program sie zapętli.
    BO:
    Wchodzi do for
    następnie robi:
    buffer[odebrany_byte] = usart_read_byte();
    wchodzi do funkcji:
    czeka na whilu
    while(!(USART1->SR & USART_SR_RXNE)) {}
    jak mu cos nie wyslesz (3znaki) to zwraca jeden znak.
    nastepnie wraca do for
    wchodzi jeszcze raz do funkcji
    i czeka na whilu..... aż mu nie wyslesz pojedynczego znaku.
    Czyli jesteśmy dalej w tym samym miejscu, bo jeden znak to umiałem odebrać.
    A chcemy przecież odebrać 3. Wysyłamy 546 i odbieramy 546. A ten kod na to nie pozwala.
    No z tym , ze teraz umiem te znaki zamienić z asci na liczbę i przedstawić kolejne 3 jako jedną 3 cyfrową liczbę.
    Dążymy jednak do tego by móc wysłać ciąg znaków i go odebrać. Co więc polecacie dalej?

    PS. co to tej tablicy to fakt. Poprawiam się więc: buffor[4]=0; I wyjdą mi 4 elementy 0. [0],[1],[2],[3]. Gdzie w [3] w tym przypadku trzeba dać zero. Postaram się tego więcej nie zapominać i zapamiętac te 0 w przypadku zamiany chara w atoi

    0
  • #25 24 Kwi 2012 18:30
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Jak gaskoin u Ciebie? Mnie już kolega damian_hey prawie przekonał, że w ogóle się nie znam na tym co piszę i nic nie wiem o mikrokontrolerach...

    Gościu - napiszę to tak - po prostu mnie w tym momencie totalnie osłabiłeś... Ale tak totalnie na maxa. Nie wiem co mam Ci napisać, bo generalnie na 10 Twoich zdań przypada +/- 11 błędów w rozumowaniu, więc po prostu wymiękam chyba.

    Zamiast poprawić, sprawdzić że działa i podziękować za pomoc, Ty nam będziesz wmawiał swoją chorą wizję tego jak działa ten układ... Ale czekaj... Tobie coś nie działa, nam działa, a Ty twierdzisz, że to my źle rozumiemy i będziesz nas poprawiał? Mamy u siebie w projektach poprawić, żeby nam też nie działało? Opanuj się...

    Innymi słowy - nie masz problemu ze zrozumieniem układu STM32. Nie masz problemu ze zrozumieniem mikrokontrolerów. Ty masz problem ze zrozumieniem tekstu...

    Swoją drogą rzeczy które najbardziej lubię na forach:
    1. Osoby które zadają pytanie o opinie innych, a potem wmawiają wszystkim którzy się wypowiedzieli, że ich wybór jest beznadziejny a opinia autora tematu najlepsza.
    2. Osoby które znajdują błędy w kompilatorze.
    3. Osoby którym coś nie działa, ktoś im wytłumaczy co mają źle, a one będą przekonywać piszącego, że mają dobrze i to piszący źle rozumie.

    Chyba oczywiste do której kategorii się zaliczasz? W mojej prywatnej ocenie wybitności w danej kategorii daję Ci na chwilę obecną conajmniej 8 punktów na 10.

    damian_hey napisał:
    Poprawiam się więc: buffor[4]=0;

    Nie wiem naprawdę w którym miejscu znajduje się ta poprawka...

    4\/3!!

    0
  • #26 24 Kwi 2012 18:41
    damian_hey
    Poziom 9  

    Widzę, że nie dojdziemy do porozumienia.
    W takim razie dziękuję za wysiłki i poświęcony czas. Żeby nie poszedł na marne spróbuję rozwiązać to dalej samodzielnie. Być może to co do tej pory sugerowaliście w końcu do mnie przemówi i uda mi się osiągnąć sukces.

    A tak po za tym, nie wiem czym się denerwujesz Freddie. Dział jest dla początkujących. Z tym nie wygrasz. Ja natomiast nigdzie nie napisałem, że coś umiem tylko, że coś robię. Należy czytać ze zrozumieniem. Ja próbuje a mi nie wychodzi. Wam też może.
    Do tego nie pisze, że wasze rozwiązania są lipne, tylko, że nie osiągamy wciąż tego co jest zamierzone.
    Sami sugerowaliście małymi krokami. Więc biorę sprawdzam i opisuje. A Ty się denerwujesz, że nie działa? No ty oczywiście uważasz, że nie tym, tylko tym że do mnie nie dociera. Tak to też możliwe. Nigdzie temu nie zaprzeczałem.
    Zajęliśmy się więc wysłaniem 3 znaków i próbą ich odebrania. To chyba nie oskarżenie jeśli sprawdzam dany kod i mówię jak on u mnie działa.

    Pozdrawiam.
    Dziękuję za cierpliwość i odzew.'


    Freddie Chopin napisał:
    damian_hey napisał:
    Ale przydało by się coś ustalić, bo chyba nie wszyscy sie zgadzamy:
    jeżeli deklaruje buffer[3] to rozmiar jest 4. bo 0,1,2,3. Czy źle to rozumiem?

    Źle to rozumiesz. To są podstawy C.


    poprawka:
    damian_hey napisał:
    buffor[4]=0; I wyjdą mi 4 elementy 0. [0],[1],[2],[3].

    0
  • #27 24 Kwi 2012 18:49
    Freddie Chopin
    Specjalista - Mikrokontrolery

    damian_hey napisał:
    Do tego nie pisze, że wasze rozwiązania są lipne, tylko, że nie osiągamy wciąż tego co jest zamierzone.

    Osięgniemy, jeśli tylko przestaniesz nas przekonywać o tym, że nasze rozwiązanie jest złe a Twoje lepsze, bo tak się składa, że jest zupełnie odwrotnie...

    damian_hey napisał:
    Sami sugerowaliście małymi krokami. Więc biorę sprawdzam i opisuje. A Ty się denerwujesz, że nie działa?

    W którym miejscu napisałeś, że to ostatnie rozwiązanie nie działa? Ja widziałem tylko Twoje całkowicie błędne filozofie o tym, że ono nie zadziała. Czy może jestem zbyt ograniczony, żeby dotrzeć opis typu "co zrobiłeś, co nie działa, jak jest efekt"?

    damian_hey napisał:
    Zajęliśmy się więc wysłaniem 3 znaków i próbą ich odebrania. To chyba nie oskarżenie jeśli sprawdzam dany kod i mówię jak on u mnie działa.

    Linijkę wyżej piszesz, że nie działa... Może się w końcu zdecydujesz?

    4\/3!!

    0
  • #28 24 Kwi 2012 18:55
    damian_hey
    Poziom 9  

    Freddie Chopin napisał:

    damian_hey napisał:
    Sami sugerowaliście małymi krokami. Więc biorę sprawdzam i opisuje. A Ty się denerwujesz, że nie działa?

    W którym miejscu napisałeś, że to ostatnie rozwiązanie nie działa? Ja widziałem tylko Twoje całkowicie błędne filozofie o tym, że ono nie zadziała. Czy może jestem zbyt ograniczony, żeby dotrzeć opis typu "co zrobiłeś, co nie działa, jak jest efekt"?

    damian_hey napisał:
    Zajęliśmy się więc wysłaniem 3 znaków i próbą ich odebrania. To chyba nie oskarżenie jeśli sprawdzam dany kod i mówię jak on u mnie działa.

    Linijkę wyżej piszesz, że nie działa... Może się w końcu zdecydujesz?

    4\/3!!


    Oj. Przeczytaj to jeszcze raz. Zdanie:
    To chyba nie oskarżenie jeśli sprawdzam dany kod i mówię jak on u mnie działa.
    O zdanie nie sugeruje działania tyko wskazuje Ci, że pisałem jak to działa,czyli równie dobrze ,że nie działa tak jak tego chcieliśmy, albo jak ja myślałem ze bedzie działalo.
    Myślę, że sie najprościej w świeci nie dogadujemy. Niepotrzebnie też taka napięta atmosfera, bo mnie nie próbujesz zrozumieć tylko udowodnić, że jestem dno i wodorosty. Bo to właśnie próbujesz teraz zrobić. Udowodnić że sam sobie przeczę, a jak przeczytasz to uważnie to tak nie jest.

    Jeszcze raz apeluje o czytanie ze zrozumieniem a jak nie to proszę o trochę luzu.
    Jeśli jestem zbyt oporny no to bardzo przepraszam.

    0
  • Pomocny post
    #29 24 Kwi 2012 19:03
    gaskoin
    Poziom 38  

    Damian w kwestii wyjaśnienia:

    Miej na uwadze to, że przez terminal na RAZ możesz wysłać tylko 8 bitów. Więc jeśli wysyłasz liczby jako znaki (a tak jak widzę jest) to nie ma znaczenia czy wpiszesz 2357932956793425607456792356735673457375 czy pojedynczo będziesz wysyłał 2 3 5 ... bo terminal i tak każdy znak będzie wysyłał pojedynczo.

    Przeanalizuj mój kod dokładnie. Jest lipny bo musisz się upewnić, że wysyłasz 3 znaki, w przeciwnym wypadku będzie czekał na znak. Jak napisałem w jednym z pierwszych postów - narazie trudno i zrób tak, że będzie program blokowany. "Normalnie", czyli nie blokująco, robi się to tak, że pojedyncze znaki odbiera się w przerwaniu pakując do bufora, a potem na jakiś trigger (czymkolwiek on będzie) się je parsuje. Drugim rozwiązaniem jest użycie DMA, które bezpośrednio z automatu będzie umieszczało dane w tablicy.

    Jako, że rozwiązanie blokujące jest najprostsze, to najpierw je zastosuj, potem się zastanowisz jak to zrobić tak, żeby się nie blokowało.

    A mój kod zapewniam działa.

    0
  • #30 24 Kwi 2012 19:03
    Freddie Chopin
    Specjalista - Mikrokontrolery

    damian_hey napisał:
    O zdanie nie sugeruje działania tyko wskazuje Ci, że pisałem jak to działa,czyli równie dobrze ,że nie działa tak jak tego chcieliśmy, albo jak ja myślałem ze bedzie działalo.

    Tyle że Ty nie sprawdzasz czy działa (bo ja wiem, że działa) tylko opisujesz swoje głębokie dywagacje na temat działania Twojego programu i UARTa, które są całkowicie błędne, a na próby przekonania Cię odpowiadasz tylko:
    damian_hey napisał:
    mnie nie próbujesz zrozumieć tylko udowodnić, że jestem dno i wodorosty

    i brniesz dalej w zaparte, że my nie rozumiemy jak Twój program ma działać i że nasze porady są złe. Ja jednak stawiam na to, że Ty sam nie rozumiesz jak ma ten program działać i zapominasz, że implementacje Twoich pomysłów spełzły na niczym i prosisz ponoć o pomoc/rozwiązanie... Na samym początku przedstawiłeś problem tak jakby tkwił w konwersji, potem okazuje się, że tkwi on w Twojej zupełnie bzdurnej funkcji odbierającej jeden bajt (skąd więc pomysł, że może ona odebrać cokolwiek więcej), no ale teraz będziesz upierał się, że Ty nie chcesz zmieniać tej funkcji, tylko problem jest gdzie indziej, nie o to pytałeś, wiesz lepiej, itd. itp. etc.

    Tak więc to nie my próbujemy Ci udowodnić, że jesteś dno i cośtam, tylko Ty próbujesz nam udowodnić, że wiesz lepiej.

    Zdecyduj się w końcu na coś. Działa? Nie działa? Co nie działa (KONKRETNY KOD, a nie filozofie)?

    4\/3!!

    0