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

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

TomekMus 01 Maj 2009 23:49 2686 14
REKLAMA
  • #1 6480106
    TomekMus
    Poziom 17  
    Witam,

    Mam coś takiego w Delphi

    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
    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ć
  • REKLAMA
  • Pomocny post
    #2 6480207
    rdt
    Poziom 25  
    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)
  • REKLAMA
  • #3 6480215
    TomekMus
    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
    #4 6480232
    rdt
    Poziom 25  
    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
  • REKLAMA
  • Pomocny post
    #5 6480432
    mirekk36
    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
    #6 6480681
    rdt
    Poziom 25  
    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
    #7 6486424
    elektryk
    Poziom 42  
    B1= liczba and 255
    B2= (liczba shr 8) and 255
    B3= (liczba shr 16) and 255
    B4= (liczba shr 24) and 255
  • #9 6488740
    TomekMus
    Poziom 17  
    A jak zrobić w drugą stronę czyli mam już 4 bajty i chce teraz zamienić na Long

    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
    #11 6490590
    rdt
    Poziom 25  
    jak masz już 4 bajty to najłatwiej jest jest użyć poszczególnych bajtów i zadeklarowac je z parametrem overlay
  • #12 6506662
    rpal
    Poziom 27  
    Osobiście namawiałbym koloegę na zainteresowanie się C bo wówczas po zadeklarowaniu Unii byłoby to banalnie proste
    
    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.
  • #13 6512573
    rdt
    Poziom 25  
    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
    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
  • REKLAMA
  • #14 6515838
    BoskiDialer
    Poziom 34  
    Przecież zmienna jeśli zajmuje 4 bajty, to można ją bezpośrednio załadować:
    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.
  • #15 6516349
    rdt
    Poziom 25  
    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??
REKLAMA