logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Bas : dzielenie długiego stringu a dane sa zmiennej długości ( odbior UART)

Wr841nd 03 Maj 2022 19:10 645 6
REKLAMA
  • #1 20005120
    Wr841nd
    Poziom 15  
    Cześć !
    Siedze od rana i udało mi się dojść do "ściany"

    W nadajniku wysyłam :
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod

    Czyli string po uarcie wyglada nt tak : ABCDE12345 ( i chyba 11 znak konca)

    Odbiornik :
    Obiór bezpośredni odpada i trzeba dane podzielić ( wyswietla calosc na raz)
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    I wszystko działa wyswietla się dobrze:
    ABCDE(V) 12345(A)

    Ale jak A2 zmieni się w Stringu *5 na *4 to mam "ducha"

    ABCDE(V) E2345(A) ( powiela mi w 2 stringu koniec 1 stringu czyli E)

    Czegoś nie widzę i nie wiem jak to ugryźć ..głowa po 10h wojny z 1 raz uartem to pęka ale i tak nieźle mi idzie ( a może dane po uart idzie jakoś nazwać ?)

    Próbowałem
    IF A =6 then cls
    Print "dana"
    Ale zauważylem że cokolwiek robie ( próba maskowania "znacznika" )
    To i tak na LCD (6)12345 i zrozumiałem że tak się nie da to podzieliłem string i
    kolejna "zagadka".
  • REKLAMA
  • Pomocny post
    #2 20005141
    bart-projects
    Poziom 29  
    Tak prymitywnie to wyślij to sobie ze spacją i potem podziel otrzymany string szukajac spacji

    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    Radzę też napisać u góry w kodzie :
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    Bascom w instrukcji Input domyślnie czeka tylko na znak CR bo to było do współpracy z klawiaturą. Natomiast funkcja Print dodaje jeszcze LF. Potem ten znak zostaje w buforze i zaburza następny Input.
  • REKLAMA
  • #3 20006569
    Wr841nd
    Poziom 15  
    Bart : Dziękuję za podpowiedz z Config input.
    Faktycznie teraz nie ma że widze w prawym stringu gdy jego wartość jest wysyłana jako 4 miejscowa.

    Inkey niepotrzebny nie widać LF czy CR ( te 3 poziome kreseczki).

    Ale odbiornik potrafi zamienić lewo na prawo i tak wyświetla ( czasami 4 krotny reset trzeba wykonać aż załapie odpowiednio ramke)-- nie znam przyczyny.
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    Co do kodu : SPLIT poległem przy próbach / przeszukałem helpa bascoma i niewiele mi rozjaśnił a twój wzór dla mmie jest nieczytelny ( google też milczy ) a angielski to tłumacze słowinikiem..
    Zasade zrozumiałem ( jak dobrze przetłumaczyłem to nawet ram oszczędza a mało go jest bo jak wbije że string wejsciowy ma 22 znaki = koniec pamięci..

    EDIT : Walcze bo źle napisałem komendy.. próby ida ale na ekranie cisza
    W nadajniku :
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #4 20006634
    bart-projects
    Poziom 29  
    Najłatwiejszy "słownik" komend Bascoma jest tutaj -> https://wiki.mcselec.com/bavr/BASCOM-AVR_Help -> bo widać je wszystkie na raz alfabetycznie i szybko można kliknąć.

    Tłumaczyć można oczywiście całe bloki teksu, albo w GoogleTranslator, albo DeepL

    Ja korzystam z wbudowanej pomocy czyli wciskam w Bascom F1 i szukam sobie w Index. Dla mnie działa szybciej i nawet bez Internetu. Ciekawe tylko na której wersji Bascom piszesz bo moze na jakiejś starej Split nie było.

    Sprawa ze Split jest prosta. Dzieli podany string na nowe stringi w miejscu ktore wskazujesz a to u nas spacja. Czyli potrzebujesz tablicy stringów na nowe stringi.
    Tak to musi być tablica, ale to nieskomplikowane. MyArray(4) As String * 5 to tablica czterech stringów o długości pięciu znaków. Funkcja Split ma też licznik tych nowych stringów i tu go sobie ładuję do zmiennej M.
    Mój kod był najprostszym skrotem myślowym i myślałem, że "mądrej głowie dość po słowie" :D i to sobie rozwiniesz.

    Otóż można wykorzystać ten licznik do sprawdzenia poprawności wysyłanych danych.
    W naszym przypadku, jesli nadejda prawidłowe dane Split powinien podzielić to na dwa - co nie? Możemy więc sprawdzić "If M = 2 Then.." albo "M > 1" itp.

    Do synchronizacji możesz też użyć jakiegos innego znacznika typu hash #

    Jeśli wyślesz dane tak: #ABCDE 12345 ... funkcja Input czeka na CRLF.

    Odbierasz sobie tak:
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    Trzeba nadmienić że funkcja Input jest funkcją blokującą czyli uC tam stoi i czeka na dane nie mogac nic innego w tym czasie zrobić, a mógłby :D
  • #5 20007978
    Wr841nd
    Poziom 15  
    Ok wracam z placu boju.
    1 program jak go przepisałem i wpisałem to mam :
    1 linia (array1) pojawia sie wartość 2 połowy stringu ( do tego migajaca w takt odbierania danych ) np 8.500
    2 linia wyświetla dane poprawenie 8.50 i nie miga.
    Jak dopisałem
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod

    To po którymś resecie odczytał prawidłowo ramkę i miałem np
    12.00
    2.00
    Oczywiście program stanie bo tylko raz odczyta ( przed wykonaniem do loop)


    Przepisałem 2 program ( masz wielką wiedzę nt. programowania )
    I zapalił od kopa mimo że w nadajniku nie mam wyślij # za to dzieli string doskonale i przy próbie podziału stringu na 3 zaczeły dane wyświetlane się krzaczyć a to jest jak widzę brakiem dostępnej pamięci ram ( attiny 2313 )
    i zaczynają dane wyświetlane "nachodzić" na siebie ( zwłaszcza jako String ma po 5 znaków a ustawiłem odbior stringu na 12 ( 14 max póżniej out of ram)

    Teraz zostaje kupić mi procek z większym ram ( M8 wystarczy ) i próbować dalej.

    Ciekawostka to 3 część stringu która wyświetla przy braku ram nie od początku a od konca . ile to człowiek się dowie nawet na tak prostym ( i wyłoży)..

    Tematu nie zamykam bo będą doświadczenia / próby i zagadki.
    1 koty za płoty.A głowa naprawde boli jak się siedzi czyta kombinuje i pisze.
    To już nie ten umysł jak wiele lat temu.
  • REKLAMA
  • #6 20010820
    bart-projects
    Poziom 29  
    Jakoś mi ten post umknął pewnie przez to że to weekend :P

    W Attiny2313 SRAM`u jest dość bo 128 B tylko pewnie zderzyłeś się z czymś o czym ludzie, albo nie wiedzą, albo zapominają.

    Otóż chodzi o stosy. Nie wgłębiając się w zagadnienie stosów podpowiem, że operacje na stringach Bascom przetwarza w tak zwanej ramce. Kiedy ma podzielić string to robi jego kopię własnie w ramce. Wielkość ramki określa parametr $framesize
    Domyślnie ten poziom jest ustawiony w IDE na skrajnie małą wartość 24 bo chyba dla Tiny13 (nie pamiętam). Ta wartość jest zdecydowanie za mała do takich operacji jakich potrzebujesz. Gdy ramka jest za mała to program zaczyna "jeździć" po stosie programowym a to sie nie może dobrze skończyć.
    Poniżej przykład jak to wygląda u mnie, ale z tym zastrzezeniem, że ja u siebie już dawno zmieniłem na inny uC i inne wartości. Tam gdzie było 24 to u mnie domyślnie już 64.

    Bas : dzielenie długiego stringu a dane sa zmiennej długości ( odbior UART)

    Nigdy jednak na tym wpisie nie polegam. Jest to tylko dla mnie ułatwienie na "szybki start" z jakimś nowym kodem. Wciskam "Add to code" i wszystko się samo wpisuje a niektóre wartości sobie na bieżąco modyfikuję.

    Przechodząc do meritum - wpis w kodzie jest ważniejszy niż ten ustawiony w IDE.
    Dlatego proponuję Tobie dokonac takiego :

    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    To, jak widzisz, z domyślnych 24 zwiększy na 32. Bez takiego lub podobnego wpisu nie uda się nawet z Atmegą1284 która ma 16 KB SRAM :D
  • #7 20011654
    Wr841nd
    Poziom 15  
    No i z $framesize trafiles w sedno...
    Dopoki nie mialem tej linii to max odbierany string mógl wynosic 18 znaków a pózniej znany komunikat koniec ramu.
    Na poczatek ustawilem size32 i odebralem 15 znaków na lcd( realnie 17 bo jeszcze spacje tez sie liczy wiec string *¹⁷)

    Pozniej zrobilem Sframe =2 dalej wszystko odbiera ciag max już do 37 znakow..

    Ustawilem 0 i moge odebrac 44..

    Masz racje to sa wlasnie sprawy na ktorych wywala sie początkujacy ( ty też kiedys pewnie dlatego to już wiesz )

    Teraz gdy bede miał zaczynać inny program z UART to juz widze jak to ustawić by sie na minę nie wbic.. ale kwiatków pewnie jest wiecej..

    A mialem kupować Atmege48 by miec wiecej ram.. i pewnie to by skonczylo sie takim samym komunikatem..

    Faktycznie funkcja : split oszczedza ram tylko umiejetność pisania odpowiednio programu daje efekt..
REKLAMA