Search  
Friday, May 25, 2012 ..:: Forum ::.. Register  Login
 Forum Minimize
Pentru a putea posta mesaje trebuie să vă înregistraţi.
Notă: Mesajele cu conţinut jignitor sau ilegal (inclusiv cereri de soft piratat) nu sunt acceptate şi vor fi şterse imediat .

Pentru a primi raspunsuri rapide si corecte, scrieti in mesaj ce intentionati sa faceti, ce mesaj de eroare primiti, in ce context si in urma caror actiuni. De asemenea, mentionati versiunea de FoxPro in care lucrati!
Dacă nu specificați versiunea, se consideră VFP 9.0 SP2.

SearchForum Home
  Visual FoxPro  Cod, sintaxa si comenzi  calcul suma de ...
 calcul suma de control
 
 11/6/2009 12:20:49 PM
User is offlineboby
31 posts


calcul suma de control
 (N/A) Modified By boby  on 11/6/2009 1:21:35 PM)
salut...nu stiu daca ma incadrez in topic...dar incerc
am nevoie de ajutor pentru a calcula o suma de control in VFP 9 dintr-un sir hexa care arata cam asa :

E2 04 01 00 99 E3

E2 -inceput de pachet
E3-sfarsit de pachet
99 - suma de control ( la asta trebuie sa ajung si este alcatuita de la E2 pana la 00 ))
suma de control nu poate fi mai mare de 223 (decimal)

am un exemplu dat in limbaj de asamblare care arata asa :

ADDCHECK: PUSH AX
ADD A,CHECKSUM
RCL AL,1
JC ADCK3
XOR AL,11011101B ;(#0DDh)
ADCK3: MOV CHECKSUM,AL
SUB AL,224
JC ADCK4
MOV CHECKSUM,AL
ADCK4: POP AX
RET

mai am un exemplu care arata asa :

var
CHEKSUM: BYTE;
CHKHLP: BYTE;

//............
//............

procedure ADDCHEK(nxb: byte);
var hlp: word; cary: boolean;
begin
hlp:=nxb+CHEKSUM;
cary:=hlp >$FF; hlp:=hlp and $FF;
hlp:=hlp+hlp;
if cary then inc(hlp);
cary:=hlp >$FF;
hlp:=hlp and $FF;
if (not cary) then hlp:=hlp xor $DD;
if (hlp >= $E0) then hlp:= hlp-$E0;
CHEKSUM:= hlp;
end;

si se apeleaza cu asta :
if (RxLen>6) and (RxBuf[0]=$F2) then begin
CHKHLP:=RxBuf[RxLen-2];
CHEKSUM:=0;
for i:=0 to (RxLen-3) do ADDCHEK(RxBuf[i]);
if (CHEKSUM=CHKHLP) then IN_END else OUT_NAK;
end;

urmatoarele linii sunt corecte si functioneaza dar trebuie sa gasesc algoritmul de calcul si pentru alti parametrii care se pot afla intre E2 si 00

E2 04 00 00 9D E3
E2 04 01 00 99 E3
E2 04 02 00 95 E3
E2 04 03 00 91 E3

E2 05 00 00 95 E3
E2 05 01 00 91 E3
E2 05 02 00 8D E3
E2 05 03 00 89 E3

nu reusesc sub nici o forma sa ajung la cifrele astea de control
poate are cineva timp si rabdare

multumesc
 11/8/2009 4:54:40 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: calcul suma de control
 (N/A) Modified By Daniel Buduru  on 11/8/2009 5:55:43 PM)
 boby wrote
urmatoarele linii sunt corecte si functioneaza dar trebuie sa gasesc algoritmul de calcul si pentru alti parametrii care se pot afla intre E2 si 00

E2 04 00 00 9D E3
E2 04 01 00 99 E3
E2 04 02 00 95 E3
E2 04 03 00 91 E3

E2 05 00 00 95 E3
E2 05 01 00 91 E3
E2 05 02 00 8D E3
E2 05 03 00 89 E3

nu reusesc sub nici o forma sa ajung la cifrele astea de control

S-ar putea sa fi gresit ceva pe undeva, dar nici eu nu am ajuns la aceleasi sume de control, prin nici unul dintre cei doi algoritmi. Am obtinut insa valori identice intre ele prin ambii algoritmi.
Ai un link la sursa?

Daniel Buduru
 11/9/2009 10:42:03 AM
User is offlineboby
31 posts


Re: calcul suma de control
 (N/A)
astea sunt toate informatiile pe care le am.....din pacate nu am pe cine sa intreb...eu am doar controllerul si pot face teste pe el.
am intors si eu problema pe toate fetele...am bagat codul lor in emulator 8086 si evident ca nu am obtinut nenorocita aia de cifra.
parca este cine stie ce calcul savant. exemplele alea cred ca sunt date la misto doar sa te incurce mai mult. nici nu mai stiu cum sa o iau.
am observat ca in exemplul din C intervine si $FF in calcul...in celalalt nu...
ai ajuns la valori identice intre liniile E2 04 si E2 05 ?...poate se mai adauga vreo constanta la final....
multumesc oricum pentru implicare...:)
 11/9/2009 10:57:29 AM
User is offlineDaniel Buduru
2335 posts
1st




Re: calcul suma de control
 (N/A)
Pana la ultima linie, E2 05 03 00, am avut o diferenta constanta 0x0A (10 decimal), la linia asta s-a schimbat, asa ca nu merge cu un delta ...
In ASM, se lucreaza cu AL, deci cu octetul inferior din registrul AX. In C (si in codul pe care l-am scris in VFP), octetul inferior se separa cu (BIT)AND 0xFF.
Am gresit cand am spus ca am obtinut valori identice si cu codul din C. Facusem deja modificari in el, inlocuisem linia hlp=hlp+hlp cu ceva echivalent cu RCL din ASM. Oricum, nici cu codul C nu iese cifra de control din liniile pe care le-ai dat.
Ce controller este? si la ce operatie folosesti suma de control?

Daniel Buduru
 11/11/2009 10:13:08 AM
User is offlineboby
31 posts


Re: calcul suma de control
 (N/A)
scuze de intarziere...
este vorba de un controller de la pompe de combustibili....eu fac o cerere cu o linie de genul E2 04..etc si el imi raspunde cu o linie F2 00..etc..adica parametrii de functionare...care evident ca are si ea cifra de control..nenorocirea este ca varianta E2 04..etc...este cea mai simpla linie de cerere, altfel celelalte cereri sunt mai complexe si evident ca e si mai greu de calculat cu ce am eu ca informatii...
eu am luat ca baza totusi ASM-ul si am vazut ca face acel RCL (rotatia bitilor catre stanga si E2 se transforma in C4 in registrul AL) . ai idee care ar fi motivul? dupa asta flagul CF este 1 si automat face saltul JC (cand CF=1) direct la scaderea cu 224....(ADCK3) si se termina cu AL=E4 ..eu asa am urmarit operatie dupa primul byte...(E2)....tu cum ai gandit treaba?
mersi de ajutor!
 11/11/2009 2:32:57 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: calcul suma de control
 (N/A) Modified By Daniel Buduru  on 11/11/2009 4:13:22 PM)
M-am uitat inca o data cum am transpus RCL si am gasit greseala pe care o facusem: am adunat bitul 7 dupa lshift, si nu era corect.
Uite forma corecta:

UPDATE:
Nu am gresit la transpunerea RCL. Gresit era in codul ASM, instructiunea este RL, nu RCL

? chksum(CHR(0xE2)+CHR(0x04)+CHR(0x00)+CHR(00)), ' 9D'
? chksum(CHR(0xE2)+CHR(0x04)+CHR(0x01)+CHR(00)), ' 99'
? chksum(CHR(0xE2)+CHR(0x04)+CHR(0x02)+CHR(00)), ' 95'
? chksum(CHR(0xE2)+CHR(0x04)+CHR(0x03)+CHR(00)), ' 91'
? chksum(CHR(0xE2)+CHR(0x05)+CHR(0x00)+CHR(00)), ' 95'
? chksum(CHR(0xE2)+CHR(0x05)+CHR(0x01)+CHR(00)), ' 91'
? chksum(CHR(0xE2)+CHR(0x05)+CHR(0x02)+CHR(00)), ' 8D'
? chksum(CHR(0xE2)+CHR(0x05)+CHR(0x03)+CHR(00)), ' 89'

PROCEDURE chksum
LPARAMETERS tcString
LOCAL CHECKSUM, lni, nbx, hlp, Carry
CHECKSUM=0
FOR lni=1 TO LEN(tcString)
    nbx=ASC(SUBSTR(tcString,lni,1))
    hlp=nbx+CHECKSUM
    hlp=BITAND(hlp,0xff)
    llCarry=BITTEST(hlp,7)
    hlp=BITLSHIFT(hlp,1)
    hlp=BITAND(hlp,0xff)
 *   IF llcarry
 *      hlp=BITSET(hlp,0)
 *  ELSE
 *     hlp=BITCLEAR(hlp,0)
 *  endif       
    IF !llcarry
        hlp=BITXOR(hlp,0xDD)
    endif   
    CHECKSUM=hlp
    hlp=hlp-0xe0
    IF hlp>0
        CHECKSUM=hlp
    endif   
NEXT
return TRANSFORM(CHECKSUM,'@0x')
   

Daniel Buduru
 11/12/2009 9:46:23 AM
User is offlineboby
31 posts


Re: calcul suma de control
 (N/A)
Omule esti un geniu....o gramada de oameni s-au chinuit sa-i dea de cap si nu au reusit....iti multumesc foarte mult si sper sa ma revansez odata....
cu respect
robert
 4/1/2010 11:39:10 PM
User is offlineboby
31 posts


Re: calcul suma de control
 (N/A)
Salut!
Pentru Domnul Dan Buduru....
Multumesc pentru ajutorul dat in problema de mai sus si, daca se poate, as mai avea nevoie de un pic de ajutor in aceasta chestie deoarece am gasit de-abia acum o problema in calcul pentru un singur fel de linii :
cele care arata de genul :
E2 01 01 08
E2 01 03 08
E2 01 05 08
nu calculeaza suma corect

pentru cele:
E2 01 00 08
E2 01 02 08
E2 01 04 08
calculeaza suma de control corect
adica la cele impare sunt probleme.....era vorba de acel RL care am inteles ca trebuie sa fie RLC in asamblare

va multumesc
 4/1/2010 11:55:43 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: calcul suma de control
 (N/A)
Nu am cum sa te ajut fara sa am suma de control corecta pentru 2 siruri.
Daca nu ai doua astrfel de siruri, ia 2 siruri dintre cele la care suma nu e corecta si incrementeaza octetul sumei de la 0 pana cand ajungi la suma corecta.
Apoi posteaza sirurile.

Daniel Buduru
 4/2/2010 6:49:24 PM
User is offlineboby
31 posts


Re: calcul suma de control
 (N/A) Modified By boby  on 4/2/2010 6:53:06 PM)
asa m-am gandit sa fac...sper sa gasesc cateva cidre de control bune pentru sirul ala care nu vrea...pana atunci am ales sa folosesc pe teren numai sirurile pare, care functioneaza....
ideea era ca dupa ce facem left shiftul ala cica trebuia testat daca este mai mare ca FF si daca da, bitul 0 trebuia sa aibe valoarea din CF (Carry Flag) asta fiind diferenta "RLC" fata de "RL"
..inca o data multumesc de raspuns
cu respect
Robert
 4/2/2010 7:03:43 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: calcul suma de control
 (N/A)
Daca vrei RCL in loc de RL, scoate * de la incepulul celor 5 linii din codul pe care l-am postat mai inainte

 *   IF llcarry
 *      hlp=BITSET(hlp,0)
 *  ELSE
 *     hlp=BITCLEAR(hlp,0)
 *  endif       
 
devine

   IF llcarry
      hlp=BITSET(hlp,0)
  ELSE
     hlp=BITCLEAR(hlp,0)
  endif       


Dar cifra de control obtinuta asa nu a fost corecta pe sirurile date ...

Daniel Buduru
 4/14/2010 9:07:40 AM
User is offlineboby
31 posts


Re: calcul suma de control
 (N/A)
Salut
Imi cer scuze ca nu am reusit sa mai raspund dar am fost plecat
multumesc foarte mult pentru sugestie..... singura modificare care mai trebuia facuta era asta:

IF hlp+checksum>255
hlp=BITSET(hlp,0)
ELSE
hlp=BITCLEAR(hlp,0)
endif
si acum totul functioneaza perfect

raman in continuare dator vandut domnule Daniel
MULTUMESC
  Visual FoxPro  Cod, sintaxa si comenzi  calcul suma de ...

Search  Forum Home         

 Google Ads Minimize

    

Copyright 2002-2010 Profox   Terms Of Use  Privacy Statement