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.

Jak odebrać wartość hex00 z bufora RS ?

kennyg100 16 Maj 2014 16:35 978 15
  • #1 16 Maj 2014 16:35
    kennyg100
    Poziom 8  

    Witam Kolegów.

    Natrafiłem na "ścianę" przy moim nowym projekcie. Realizuję układ który bezprzewodowo steruje steruję urządzeniem , ale też "odpytuje" to urządzenie
    i wysyła dane. Urządzenie "gada" w HEXACH bez znaków końca linii.
    Napisałem program w którym używam dwóch portów rs - softwarowego i hardwarowego - dane z urządzenia odczytuje przerwaniem URXC . I tu zaczyna się problem. Wystarczy żeby w odbieranym stringu pojawiłą się wartość HEX 00 - kończy się odbiór znaków z uart - jeśli nie ma tej wartości w stringu - wszystko działa idealnie. Na pewno coś trzeba ustawić w rejestrach ale już siły nie mam szukać i BARDZO proszę o pomoc. Oto listing :

    Spoiler:
    $crystal = 14745600
    $eeprom
    $hwstack = 32
    $swstack = 10
    $framesize = 40
    $baud = 38400

    config portd.7 = output
    config portd.6 = input
    config PORTB.1 = output

    dim comm as String * 30
    dim cm_pos as byte
    dim command as string * 5
    dim tc as string * 8
    dim tmp as byte
    dim vtr_data as string * 16
    dim a as byte
    dim r as byte
    dim t as byte


    Config com1 = Synchrone = 0 , Parity = odd , Stopbits = 1 , Databits = 8 , Clockpol = 0
    Open "comd.7:38400,8,n,1" For Output As #5
    Open "comd.6:38400,8,n,1" For INPUT As #4
    enable interrupts
    enable urxc


    on urxc czytaj:
    main:


    Input #4 , Comm Noecho
    cm_pos = Instr(comm , "AA")
    cm_pos = cm_pos + 2
    command = mid(comm,cm_pos,3)

    select case command

    case "STA"

    print chr(32) ; chr(1) ; chr(33)

    case "STO"

    print chr(32);chr(0);chr(32)

    case "TCR"
    waitms 20
    vtr_data = ""
    print chr(97);chr(12);chr(00);chr(109)

    end select

    goto main



    czytaj:
    tmp = inkey()
    vtr_data = vtr_data + chr(tmp)
    if len(vtr_data) = 7 then
    print #5, vtr_data
    endif

    return






    End


    Pozdrawiam Robert.

    0 15
  • #3 16 Maj 2014 18:51
    kennyg100
    Poziom 8  

    Spróbowałem przed chwilą , niestety rezultat ten sam , strasznie mnie dziwi że to hex 0 na dowolnej pozycjii blokuje odczyt całego bufora. Jak używałem INKEY() i kontroli ischarwaiting() to znowu mi wczytywał tylko trzy znaki bez względu na dane. Teraz jest trochę lepiej bo czyta wszystko ale pod warunkiem że nie ma wartosci HEX00

    0
  • #4 16 Maj 2014 19:20
    Jaca
    Poziom 28  

    A tu:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    nie powinno być:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    ?

    0
  • #5 16 Maj 2014 19:34
    kennyg100
    Poziom 8  

    Zmieniłem , ale niestey znowu nic. Zaczynam się zastanawiać czy użycie procka z dwoma hardwarowymi comami coś by zmieniło. Chociaż z drugiej strony to właśnie jest com hardwarowy i działa idealnie do chwili pojawienia sie wartości 0x00 (0) w streamie

    0
  • #6 16 Maj 2014 19:59
    Jaca
    Poziom 28  

    Aaaaa, Chr(0) to domyślny znak końca string'a w BASCOM'ie !

    0
  • #7 16 Maj 2014 20:07
    kennyg100
    Poziom 8  

    To nie ma możliwośći odebrania takiej wartości ?
    Niestety nie mogę nic zmienić w urządzeniu nadającym , a w nim kody 0x00 są wysyłane co chwile i są danymi pozycji odtwarzanego nagrania.

    0
  • #8 16 Maj 2014 20:31
    Jaca
    Poziom 28  

    Parsuj dane w locie, zmień tymczasowo znak Chr(0) na inny (nieużywany) lub umieszczaj odebrane znaki w tablicy. ZAWSZE jest jakaś możliwość !

    0
  • #9 16 Maj 2014 20:38
    kennyg100
    Poziom 8  

    Z tablica już próbowałem . Rezultat ten sam jak jest 0x00 to nie wypełnia tablicy niczym. Niestety nie moge nic zmienić w nadawaniu - zamknięty format. Po prostu niknie wszystko z bufora jak jest ten null.

    0
  • #10 16 Maj 2014 20:45
    zumek
    Poziom 39  

    kennyg100 napisał:
    Urządzenie "gada" w HEXACH bez znaków końca linii.

    To ciekawe jakim cudem wysyła zero :?:
    Napisałbyś coś więcej o tej transmisji, jak i co wysyła Twoje urządzenie, bo tak w ciemno, to sobie możemy co najwyżej w nosie podłubać ... :D

    0
  • #11 16 Maj 2014 21:02
    kennyg100
    Poziom 8  

    No tak to wygląda -
    Jak odebrać wartość hex00 z bufora RS ?

    dwa pierwsze hexy - stały nagłowek 0x74 0x14
    cztery następne - wartość kodu czasowego - ramka , sekunda , minuta, godzina
    ostatni 0xCB - suma kontrolna - suma wszystkich hexów.

    Dodano po 3 [minuty]:

    a tu jeszcze to samo tylko decimal
    Jak odebrać wartość hex00 z bufora RS ?

    0
  • #12 16 Maj 2014 21:32
    Jaca
    Poziom 28  

    Podaj rezultat dla poniższego kodu (dla ramki zawierającej Chr(0)):

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #13 16 Maj 2014 21:53
    kennyg100
    Poziom 8  

    nic - czyli po wystąpieniu przerwania nie odczytał wartosci
    i jeszcze skasował wszystko z bufora

    Dodano po 17 [minuty]:

    Dostałem podpowiedz z innego forum i działa !
    Wydawało mi się że już tak robiłem , a jednak... może za długo przy kompie.
    Bardzo dziękuje za posty.
    Robert

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod
    [/code]

    0
  • #14 16 Maj 2014 21:59
    Jaca
    Poziom 28  

    Masz jakiś podgląd danych na PC ? Myślałem, że przez #5 odsyłasz odebrane dane do PC.

    Edit:
    Zapomniało się o ustawieniu początku tablicy przy nowym odczycie ?

    0
  • #15 16 Maj 2014 23:22
    kennyg100
    Poziom 8  

    nie wiem głowę bym dał że wpisywałem w tablicę , ale od wczoraj ćwiczę i może już czas odpocząć trochę. Jeszcze raz wielkie dzięki

    0
  • #16 19 Maj 2014 10:42
    szel
    Poziom 20  

    Wartość HEX 00 reprezentuje wartość NUL, czyli znak końca tekstu. Dlatego kończy się odczytywanie . Prawdopodobnie ty podglądasz tylko znaki jako wartości HEX, ale już po przesłaniu ich za pomocą bufora lub wskaźnika jako char. I tu jest błąd przerywania odczytywania przez NULL.
    Pewnym sposobem jest stosowanie tablicy zamiast bufora.
    Chcąc przesłać wszystko bez przerywania odczytu znakiem NULL, należy konwertować od razu odczytany pojedynczy znak na wartość HEX i dopiero dopisać do stringu jako HEX. Ciąg wartości hex '4142004544' wpisany do tablicy zostanie w całości z niej odczytany i reprezentuje ciąg char 'AB\0ED'.
    Chcąc potem wpisać je do czegoś jako znaki char trzeba je przekonwertować ponownie z HEX na char i dopiero wpisywać do celu.
    Potrzebne są do tego funkcje konwertujące ciąg char na ciąg HEX i odwrotnie.

    Prawdopodobnie Twoje urządzenie nie gada w hexach tylko w char-ach a ty tylko podglądasz je jako hexy ale już po fakcie.

    0