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

Dlaczego buforowanie RS232 w Bascomie przestaje działać po odkomentowaniu?

daniel93 12 Kwi 2008 12:41 1744 9
REKLAMA
  • #1 5021588
    daniel93
    Poziom 29  
    Posty: 1673
    Pomógł: 30
    Ocena: 92
    $crystal = 8000000                                          'częstotliwość kwarcu
    $baud = 38400                                           
    
    Dim Zmienna As Byte , Zmienna2 As Integer                  
    Dim Ignorowane As Byte , Id As Byte , Dane As Byte
    Dim A As Byte , B As Byte
    
    'Config Serialin = Buffered , Size = 20
    
    Zmienna = 5
    Do
    Waitms 500
    Cls
    Lcd Id ; " " ; Dane ; " " ; Zmienna ; " " ; B
    Inputbin Id , Dane , Zmienna , B
    
    Loop
    
    
    End
    


    CO jest z buforownie transmisji w BASCOMIE, że powyższy program działa dopóki nie usunę apostrofa przed linijką z poleceniem włączenia bufora?
  • REKLAMA
  • #2 5023897
    Michał_z1
    Poziom 16  
    Posty: 190
    Pomógł: 13
    Ocena: 2
    do "wyciągania" znaków z bufora służy inkey() lub waitkey() natomiast input stosuje się do wprowadzania ciągu znaków, aż do zakończenia znakiem <CR> wystarczy przeczytać HELP-a
  • REKLAMA
  • #3 5024108
    daniel93
    Poziom 29  
    Posty: 1673
    Pomógł: 30
    Ocena: 92
    Mógłbyś wytłumaczyć, bo nie bardzo zrozumiałem?
    ps>Ja nie przesyłam znaków ASCII tylko zmienne.
  • #4 5024154
    Balu
    Poziom 38  
    Posty: 4397
    Pomógł: 323
    Ocena: 48
    Masz bufor softwareowy w Bascomie, instrukcjami które kolega podał możesz się do niego "dobrać", z drugiej strony masz instrukcję input która stoi w miejscu póki w UDRze nie znajdzie CR.
  • #5 5024386
    daniel93
    Poziom 29  
    Posty: 1673
    Pomógł: 30
    Ocena: 92
    Również nie działa:
    $crystal = 8000000                                          
    $baud = 38400                                               ' 
    
    Dim Zmienna As Byte , Zmienna2 As Integer                   
    Dim Ignorowane As Byte , Id As Byte , Dane As Byte
    Dim A As Byte , B As Byte
    
    Config Serialin = Buffered , Size = 20
    
    Zmienna = 5
    Do
    Waitms 500
    Cls
    Lcd Id ; " " ; Dane ; " " ; Zmienna ; " " ; B
    Id = Inkey()
    Dane = Inkey()
    Zmienna = Inkey()
    B = Inkey()
    
    Loop
    
    
    End

    Natomiast poniższy kod działa bez problemów:
    $crystal = 8000000                                          
    $baud = 38400                                               '
    
    Dim Zmienna As Byte , Zmienna2 As Integer                   
    Dim Ignorowane As Byte , Id As Byte , Dane As Byte
    Dim A As Byte , B As Byte
    
    Zmienna = 5
    Do
    Waitms 500
    Cls
    Lcd Id ; " " ; Dane ; " " ; Zmienna ; " " ; B
    Inputbin Id , Dane , Zmienna , B
    
    Loop
    
    
    End
  • #6 5027718
    Michał_z1
    Poziom 16  
    Posty: 190
    Pomógł: 13
    Ocena: 2
    Fajnie by było gdy byś przykładowo napisał co takiego przesyłasz.........jakie dane?? Mógłbym to przy okazji sprawdzić u siebie. A tak przy okazji z kodu wynika że pomimo tego czy jakiś znak jest czy nie w buforze to co 500ms "czyści" Ci sie wyświetlacz, spróbuj zamiast inkey() użyć waitkay(). Bo waitkay() powoduje zatrzymanie programu na czas napotkania znaku w buforze.
  • REKLAMA
  • #7 5027819
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 51
    daniel93 napisał:
    Również nie działa:

    I działać nie będzie :|
    Jak byś poczytał w Helpie DOKŁADNIE !!! , o buforowaniu UARTA , to byś dopisał Enable Interrupts i zapewne by zadziałało , a tak ... kiszka :D

    Piotrek
  • #8 5031163
    daniel93
    Poziom 29  
    Posty: 1673
    Pomógł: 30
    Ocena: 92
    Przesyłam wartości zmiennych, wyświetlacz sie kasuje, aby podczas testów pokazywał czy uC odbiera dane poprawnie. Zmiana na waitkey nic nie dała.

    Natomiast enable interrupt spowodowało dziwną reakcje: po chwili zamiast wartości 2 ostatnich zmiennych pojawiają sie spacje, a po drugiej chwili dzieje sie to samo z pierwszymi 2 wartościami.
    Kod wyglada tak:
    Dim Zmienna As Byte , Zmienna2 As Integer                   
    Dim Ignorowane As Byte , Id As Byte , Dane As Byte
    Dim A As Byte , B As Byte
    
    Config Serialin = Buffered , Size = 20
    
    Enable Interrupts
    
    Zmienna = 5
    Do
    Waitms 500
    Cls
    Lcd Id ; " " ; Dane ; " " ; Zmienna ; " " ; B
    Id = Waitkey()
    Dane = Waitkey()
    Zmienna = Waitkey()
    B = Waitkey()
    
    Loop
    
    
    End
  • REKLAMA
  • #9 5035007
    Michał_z1
    Poziom 16  
    Posty: 190
    Pomógł: 13
    Ocena: 2
    A czy aby prędkości transmisji masz ustawione tak samo w obu urządzeniach??
  • #10 5053498
    daniel93
    Poziom 29  
    Posty: 1673
    Pomógł: 30
    Ocena: 92
    Tak.

Podsumowanie tematu

✨ Dyskusja dotyczy problemu z buforowaniem transmisji RS232 w Bascomie, gdzie włączenie bufora za pomocą polecenia "Config Serialin = Buffered, Size = 20" powoduje, że program przestaje działać poprawnie. Wskazano, że funkcje takie jak Input oczekują na znak końca linii (CR), co nie jest odpowiednie przy przesyłaniu surowych zmiennych binarnych. Zamiast tego zalecane jest użycie funkcji Inkey() lub Waitkey() do odczytu znaków z bufora. Włączenie przerwań (Enable Interrupts) jest konieczne, aby buforowanie działało poprawnie, jednak w praktyce powoduje to niestabilne zachowanie wyświetlanych danych. Problem może wynikać z niezgodności prędkości transmisji lub niewłaściwego zarządzania buforem i przerwaniami. Użytkownik potwierdził zgodność prędkości transmisji obu urządzeń. Wskazano, że funkcja Waitkey() zatrzymuje program do momentu pojawienia się znaku w buforze, co może pomóc w synchronizacji odczytu danych. Ogólnie, poprawne użycie buforowania w Bascomie wymaga włączenia przerwań i stosowania odpowiednich funkcji do odczytu danych, zwłaszcza przy transmisji binarnej, a nie ASCII.
Wygenerowane przez model językowy.
REKLAMA