Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

BASCOM DELPHI - jak wysłać liczbę Long w 4 bajtach

01 Maj 2009 23:49 2527 14
  • Poziom 17  
    Witam,

    Mam coś takiego w Delphi

    Code:
    var
    
      Liczba : Longint;
      B1, B2, B3, B4 : Byte;

    begin
       Liczba=1486541
       B1=??
       B2=??
       B3=??
       B4=??
    end;


    chce potem Liczba zamienić na 4 bajty i wysłać po RS'ie,

    teraz BASCOM

    odbiera 4 bajty i
    Code:
    DIM B1 as Byte
    
    DIM B2 as Byte
    DIM B3 as Byte
    DIM B4 as Byte
    dim Licz as long

    Licz = B1 B2 B3 B4 //jak to wykonać
  • Pomocny post
    Poziom 24  
    co do delphi nie mam pojęcia jak to zrobić
    co do bascoma jeżeli to ma odbierac zmienną typu integer to po prostu
    baud =9600
    'DIM B1 as Byte zmienne b1-b4 będą niepotrzebnie zajmować pamięć
    'DIM B2 as Byte
    'DIM B3 as Byte
    'DIM B4 as Byte
    dim Licz as long

    Jeżeli to ma odbierać zmienną LONG to po prostu
    inputbin licz


    co do delphi to radze zajrzeć tutaj
    http://4programmers.net/Delphi/Artyku%C5%82y/...B3w_COM_z_poziomu_Delphi_(wszystkie_windowsy)
  • Poziom 17  
    Chodzi mi o coś takiego że chcę liczbę x typu Long wysłać po RS'ie z delphi do bascoma, lecz potrzebuje rozbicie jej na 4 bajty bo wiem że liczba long jest 32bitowa a w bascomie chce odebrac poprzez Inkey() te 4 bajty i je w jakis sposób złożyć do kupy
  • Pomocny post
    Poziom 24  
    spojrz powyzej odbierasz ją jako LONG
    jeśliby się nie dało to proponuje

    dim Licz as long at 120
    DIM B1 as Byte at 120 overlay
    DIM B2 as Byte at 121 overlay
    DIM B3 as Byte at 122 overlay
    DIM B4 as Byte at 123 overlay

    inputbin b1,b2,b3,b4

    oczywiście adres 120 jest przykładowy- wiadomo ze zmienna licz zajmuje 4 kolejne bajty
  • Pomocny post
    Poziom 42  
    Zamiast wysyłać przez RS232 binarnie - co często przy przesyłaniu większych porcji danych przez początkujących będzie się kończyło samymi problemami - to nie łatwiej ci zamieniać przesyłane liczby na stringi a po odebraniu ze stringów na liczby. Dzięki temu twoja ramka będzie mogła być po ludzku zakończona znakiem ENTER a co za tym idzie wszystko co jest w postaci gotowców w Bascomie tylko ci to ułatwi a i transmisja będzie bezpieczniejsza, pewna i zawsze powtarzalna. Nie patrz na to, że trzeba stracić kilka dodatkowych taktów zegara na konwersje tych liczb.
  • Pomocny post
    Poziom 24  
    mnie akurat nie chodziło o takty na konwersje potrzebne a raczej o niepotrzebnie zajmowane bajty
    Jak wiadomo bascom jest pamięciożerny a program pewnie ma coś więcej do zrobienia niż tylko odbiór jednej liczby

    Poza tym po poleceniu inputbin jakas_zmienna jest odbierane tylko tyle bajtów ile ta zmienna zajmuje
    Ponieważ nie trzeba robić dodatkowych zabiegów typu zamykanie portu lub podobnych to nie widzę żadnego problemu
  • Pomocny post
    Poziom 42  
    B1= liczba and 255
    B2= (liczba shr 8) and 255
    B3= (liczba shr 16) and 255
    B4= (liczba shr 24) and 255
  • Pomocny post
    Poziom 14  
    W delphi można jeszcze tak:
    Code:

    var
      Liczba:LongInt;
      Bajty : array[0..3] of Byte absolute Liczba;
  • Poziom 17  
    A jak zrobić w drugą stronę czyli mam już 4 bajty i chce teraz zamienić na Long

    Code:
    dim B1 as byte, B2 as Byte, B3 as Byte, B4 as Byte
    
    dim Liczba as Long

    B1 = Inkey()
    B2 = Inkey()
    B3 = Inkey()
    B4 = Inkey()
    Liczba= ??????????
  • Pomocny post
    Poziom 22  
    Code:

    liczba=0
    for i=0 to 2
       liczba=liczba+bajt[i]
       shift liczba, left, 8
    next i
    liczba=liczba+bajt[3]
  • Pomocny post
    Poziom 24  
    jak masz już 4 bajty to najłatwiej jest jest użyć poszczególnych bajtów i zadeklarowac je z parametrem overlay
  • Poziom 27  
    Osobiście namawiałbym koloegę na zainteresowanie się C bo wówczas po zadeklarowaniu Unii byłoby to banalnie proste
    Code:

    union zamiana {
       unsigned char bity[4];
       unsigned long int dlugaliczba;
    };


    mając coś takiego zmiennej dlugaliczba przypisujesz swoja wartość a na kolejnych pozycjach tablicy bity[] masz ją porozbijaną na poszczególne bajty.
  • Poziom 24  
    ok czy w delphi jest jakiś odpowiednik bascomowego make int?
    bo własnie też staram sie odebrac dane po RS - u mnie jest to 9 bajtów Odbieram metodą mało elegancką na piechotę -korzystam z comport-u i robię to po prostu
    Code:
    comPort1.Read(dana1,1);
    
    comPort1.Read(dana2,1);
    itd.......   

    Jeśli teraz zmienną typu dana zadeklaruje jako tablicę to będę musiał odczytywać bajty powtarzając pętlę 9 razy czy po prostu samo automatycznie odbierze 9 bajtów ??? w końcu po przecinku w nawiasie podaje ilość zmiennych do odbioru
    kolejna sprawa - korzystając z comport i ustawiając sterowanie przepływem na "none" nie mogę wysłać poprawnie danych - przy sterowaniu hardware jest ok
  • Poziom 34  
    Przecież zmienna jeśli zajmuje 4 bajty, to można ją bezpośrednio załadować:
    Code:
    var 
    
      Liczba:LongInt;

    begin
      [..]
      comPort1.Read(Liczba, 4);
      [..]
    end;

    lub wysłać zmieniając Read na Write. W takim przypadku bajty zostaną wysłane w porządku little-endian, chyba że platforma wykorzystuje inny.
  • Poziom 24  
    już mi ręce opadają - z delphi
    dlaczego jak nie ustawie na hardware tylko zostawię bez kontroli przepływu to comport działa nie tak jak powinien?

    poza tym jak z bascoma wyśle printbin 5;4;3;40; itd (czyli konkretne wartości ) to delphi odczytuje Ok
    jak wyśle jako zmienna to jest do bani - i wszystko sie krzaczy - żeby było śmieszniej to za pomocą programu modbus pool czy jako stałe czy jako zmiene wszystko jest cacy odczytywane





    co do załadowania od razu zmiennej to :
    wole jednak odbierać po bajcie
    mam taki pomysł aby zrobić tak - do zmiennej typu word załadować wartość 0
    czyli będe miał 00000000 00000000
    potem zrobic OR z bajtem który ma być starszy
    przesunąć w prawo o 8
    zrobić OR z bajtem który ma być młodszy


    a moze ktoś wie jak wysłac bajt na coma w ciacomport??