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

Jak wykryć że wystąpił $timeout

TomekMus 27 Gru 2009 00:35 1628 9
REKLAMA
  • #1 7440179
    TomekMus
    Poziom 17  
    Mam taki problem a mianowicie jak wykryć że wystąpił $timeout w Bascom'ie?

    dim B(100) as Byte
    
    do
      $timeout = 30000
      Inputbin B(1) , 100
      
      'Ideowo pokazuje co chcę uzyskać
      If $timeout = True Then
             Print "Wystapil timeout"
         Else
             Print "Transmisja OK"
      End If
    loop
  • REKLAMA
  • Pomocny post
    #3 7440335
    PiotrEtenM500
    Poziom 19  
    
    Do
    
      $timeout = 1000000
      Input "Czekam 100000 Cykli jesli bedzie ich własnie tyle no chyba że wcześniej będzie chr(13):" , zmienna
      Print "To bede tu :) " ; zmienna
    
       $timeout = 0
    
      Input "Tu będę czekał wieczność jeśli nie bedzie chr(13): " , zmienna
      Print "I tego napisu już nie zobaczysz:(" ; zmienna
    
    Loop
    
    właśnie tak to działa zwalnia input jeśli minie czas
    jesli byś tego nie zastosowal program by wisiał na INPUT do czasu znaku enter lub crtl+z
    
    Sądzę że prościej jest użyć INKEY() niż INPUT
  • REKLAMA
  • #4 7440348
    TomekMus
    Poziom 17  
    Formę odbioru danych muszę zosatwić bez zmian - jedyny sprawdzony sposób w mojej aplikacje reszte funkcji jakie daje Bascom przetestowałem i nie sprawdziły się.

    Wyczytałem w helpie że timeout działa w mojej formie zapisu na każdy bajt tak więc ilość cykli * 100 (bajtów jakie odbieram) bo każdemu bajtowi jest przypisany timeout, i problem jest tego typu że jak timeout wystąpi gdzieś wśrodku - skąd moge wiedzieć czy 0 to nie jest bajt jaki potrzebuje odebrać.

    Idealnie by było jak timeout zmieniał by jakąś zmienną "wewnątrz bascomową" którą można odczytać, następnie zresetować
  • REKLAMA
  • Pomocny post
    #5 7440355
    PiotrEtenM500
    Poziom 19  
    Sądzę że prościej jest użyć INKEY() niż INPUT
    Dim pełnyciąg As String * 100
    Dim zmienna As Byte

    
    do
    
     zmienna=inkey()
     pełnyciąg=pełnyciąg+zmienna
     
    incr a
      if a>100000 then 
       a=0
       exit do
      end if 
     
    if zmienna>0 then a=0
    
    loop until zmienna= 13
  • REKLAMA
  • #6 7440368
    TomekMus
    Poziom 17  
    Dzięki lecz - NIE ZDA TO EGZAMINU

    Ja odbieram dane z przedziału 0..255

    Jak zastosuje twoje rozwiązanie to jak wystąpi mi w ramce danych znak 13 to program wykryje że jest koniec transmisji - przerabiałem to Bascom jedynym sprawdzonym i profesjonalnym odbiorem danych jest mój zapis reszta to dla amatorów "zapal zgaś diodę" - Bez obrazy! Lecz to doświadczenie
  • #7 7440372
    PiotrEtenM500
    Poziom 19  
    przesadzasz
    mozna wszytko
    mozesz ustalic własny sposb zakonczenia

    moze to być 2x255 na koncu

    napisz cos wiecej jakie to dane
    ile ich idzie


    
    
    do 
    
     zmienna=inkey() 
     pełnyciąg=pełnyciąg+zmienna 
    
        incr a 
         if a>100000 then 
         a=0 
         exit do 
        end if 
    
           if zmienna>0 then 
              a=0 
              incr b
                if b=100 then      ' po 100 zanku wyjdzie z pętli
                b=0
                exit do
                end if
            
                
            end if
    loop
    
    


    Teraz czyta wszystkie zanki od 0-255, zrobiłem jak to nazywasz w jezyku włącz wyłącz diodę ale działa ;) Musisz się jeszcze duuuuuuuużo doświadczyć
  • #8 7440512
    mirekk36
    Poziom 42  
    TomekMus napisał:
    ....- przerabiałem to Bascom jedynym sprawdzonym i profesjonalnym odbiorem danych jest mój zapis reszta to dla amatorów "zapal zgaś diodę" - Bez obrazy! Lecz to doświadczenie


    oooj bardzo małe to doświadczenie, każdy początkujący amator nie umiejąc sobie poradzić z transmisją w RS232 na początku zwykle dobiera się do transmisji binarnej, która sprawia mu jeszcze więcej problemów. No ale za to wydaje się wtedy, że jest profesjonalnie.

    To spójrz sobie na zawartość np pliku *.HEX czyli wsadu jakim programujesz procesor. Nie ważne czy to RS232 czy inne łącze - ale jak myślisz - dlaczego najczęściej wykorzystuje się tryb znakowy (ASCII) do takich transmisji ???? Uważasz, że firma Intel, która wymyśliła ten np standard jest mało profesjonalna? ;)

    Nie chodzi mi o to żeby się nad tobą tu pastwić za wypowiedziane słowa - ale żeby ci pokazać drogę - jak łatwo można sobie poradzić z transmisją w RS232 jednak stosując tryb znakowy zamiast binarnego. Sam już wiesz i czujesz, że wtedy będziesz mógł po ludzku kończyć ramkę znakiem np 13 [ENTER] a to mocno - a szczególnie jak ktoś programuje w Bascomie ułatwia sprawę. Praktycznie dzięki Config Serialin - oraz Bytematch - (konfiguracja i wykorzystanie sprzętowej obsługi UARTA'a na przerwaniach dodatkowo ze sprzętowym cyklicznym buforem danych, gdzie Bascom wszystko odwala za ciebie - a ty jedynie musisz kilka linijek kodu wstawić żeby to obsłużyć) I już możesz napisać profesjonalny program

    Pomyśl sobie co by się stało gdybyś wszystkie znaki które przesyłasz - a piszesz, że muszą one być z przedziału 0-255 - gdybyś je zamienił na zwykłe tekstowe reprezentacje liczb, które oddzielone byłyby przecinkami. Chyba łatwo byłoby ci w Bascomie odbierać taki String, później go dzielić i odkodować każdą liczbę ???

    wiem wiem, to wprowadza sporą nadmiarowość i zaraz się okaże, że przesyłasz tak wielkie ilości danych, że to nie do przyjęcia

    Ale weź wtedy pomyśl tak jak pracownik firmy Intel, który wymyślał format IntelHEX ;) ... i zamień wszystkie swoje przesyłane znaki na dwubajtowe wartości HEX - nie będzie trzeba ich separować przecinkami - a jedyna robota po stronie odbiorczej do branie po dwa bajty i dekodowanie HEX'a do postaci binarnej.

    Można tak - można jeszcze na milion innych sposobów - ale zapewniam cię, że jak już przyjdzie doświadczenie to na pewno - wrócisz do tych porad zamiast walczyć z przesyłaniem binarnym w jakichś prostych transmisjach czy konstrukcjach
  • #9 7442936
    xury
    Specjalista automatyka domowa
    TomekMus napisał:
    skąd moge wiedzieć czy 0 to nie jest bajt jaki potrzebuje odebrać.

    Idealnie by było jak timeout zmieniał by jakąś zmienną "wewnątrz bascomową" którą można odczytać, następnie zresetować


    1.Poczytaj o Ischarwaiting.
    2. Zobacz czy przypadkiem zmienna ERR nie załatwi sprawy. Sam nie jestem pewien, bo jako takiego opisu jakie funkcje ją generują to nie ma.

    Chyba wiem o co Ci chodzi. Ja rozumiem to tak:
    1.Nie masz wpływu na nadawane - w przeciwnym razie skonfiguruj sobie jakąś ramkę.
    2.Punkt1 = prawda. Nadawane dane nie maja ramki i stałej długości.
    3.Nadawane dane mogą mieć obok siebie kilka bajtów zerowych i (lub) znaków końca linii (13) i nie są kończone znakiem końca linii.
    4. Czas pomiędzy odbieraniem znaków jest stały i badasz to poprzez $timeout.
  • #10 7445021
    Fredy
    Poziom 27  
    Spróbuj tak:

    
    
    const absolut_max=1000000        ' to trzeba dobrać
    liczba_znakow=0
    
    do 
    
     if ischarwaitning()=1 then                'jeśli jest znak w buforze
        znak=inkey()                            'to ją odczytaj
         incr liczba_znakow
         dane(liczba_znakow)=znak         'tu są dane
        time_maks=0
     end if
    incr time_maks
    
    loop until time_maks>absolut_max or liczba_znakow>=100
    
    if time_maks>absolut_max then print "Byl blad transmisji"
    
    
       
REKLAMA