2015-01-29 4 views
-1

Я знаю, что java byte - это 8-значная переменная, а для получения значений без знака (байта) мне придется делать маскировку с 0xff всюду.Delphi to Java porting issue

В документации на Java также говорится, что я могу использовать int для генерации беззнаковых битов с использованием ранее упомянутой процедуры.

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

Однако, независимо от того, используя маску или нет, он возвращает те же самые результаты.

Я пытаюсь изменить короткий в int, но без успеха.

Delphi Code

procedure TForm1.ReadHoldRegisters(var lst: TList<byte>; deviceaddr: byte; 
    RegisterAddress, RegisterLength: word); 
begin 

    lst.Add(deviceaddr); 
    lst.Add(6); 
    lst.Add(RegisterAddress div 256); 
    lst.Add(RegisterAddress mod 256); 
    lst.Add(RegisterLength div 256); 
    lst.Add(RegisterLength mod 256); 
    Add_CRC16(lst); 
end; 

procedure TForm1.Add_CRC16(var Data: TList<byte>); 
var 
    CRC16Lo, CRC16Hi, CL, CH, SaveHi, SaveLo: byte; 
    Flag: Integer; 
    b: byte; 
begin 
    CRC16Lo := $FF; 
    CRC16Hi := $FF; 
    CL := $1; 
    CH := $A0; 

    for b in Data do 
    begin 
    CRC16Lo := CRC16Lo Xor b; 

    For Flag := 0 To 7 Do 
    Begin 
     SaveHi := CRC16Hi; 
     SaveLo := CRC16Lo; 
     CRC16Hi := CRC16Hi Div 2; 
     CRC16Lo := CRC16Lo Div 2; 

     If ((SaveHi And $1) = $1) Then 
     begin 
      CRC16Lo := CRC16Lo Or $80; 

     end; 


     If ((SaveLo And $1) = $1) Then 
     Begin 
     CRC16Hi := CRC16Hi Xor CH; 
     CRC16Lo := CRC16Lo Xor CL; 

     End; 

    End; 


    end; 

    Data.Add(CRC16Lo); 
    Data.Add(CRC16Hi); 

end; 

Java Code

public void ReadHoldRegisters(List<Short> lst, byte deviceaddr, char RegisterAddress, char RegisterLength) 
{ 
    lst.add((short) (deviceaddr & 0xff)); 
    lst.add((short) ((byte) 6 & 0xff)); 
    lst.add((short) ((RegisterAddress/256 & 0xff))); 
    lst.add((RegisterAddress%256)); 
    lst.add((RegisterLength/256)); 
    lst.add(((RegisterLength%256))); 
    Add_CRC16(lst); 
} 

private void Add_CRC16(List<Short> Data) 
{ 
    //Cyclic Redundancy Check 16 

    short SaveLo, SaveHi; 
    int flag; 

    short CRC16Lo = ((short) 0xFF & 0xff); 
    short CRC16Hi = ((short) 0xFF & 0xff); 
    short CL  = (short) 0x1 & 0xff; 
    short CH  = (short) (0xA0) & 0xff; 

    short andop = ((short) 0x80 & 0xff); 
    short andop2 = (short) 0x1 & 0xff; 

    // início do for in 
    for (Short b : Data) 
    { 
     CRC16Lo ^= b & 0xff; 

     for(flag=0;flag<7;flag++) 
     { 
      SaveHi = (short) ((CRC16Hi) & 0xff); 
      SaveLo = (short) ((CRC16Lo) & 0xff); 

      CRC16Hi = (short) ((CRC16Hi/2) & 0xff); 
      CRC16Lo = (short) ((CRC16Lo/2) & 0xff); 

      if((SaveHi & andop2) == andop2) 
       CRC16Lo |= andop & 0xff; 

       if(((SaveLo) & (andop2)) == (andop2)) 
       { 
        CRC16Hi ^= CH & 0xff; 
        CRC16Lo ^= CL & 0xff; 
       } 
      } 

     } 

     Data.add((short) (CRC16Lo & 0xff)); 
     Data.add((short) (CRC16Hi & 0xff)); 
    } 

Правильный результат, который будет отображаться в данном случае "01 06 00 01 00 0A 58 0D"

Любые мысли? Любая помощь?

+0

Проводите ли вы какую-либо отладку? Я ожидаю, что вам не понравится, что я задаю этот вопрос, но кто-то должен спросить об этом. Все, что вам нужно сделать, это добавить диагностику для обеих программ, чтобы наблюдать за значениями, которые используются на каждом этапе пути. В какой-то момент программы будут расходиться. Выровняйтесь глубже, пока проблема не станет ясной. Я сказал это вам вчера. Если бы вы сделали то, что я сказал, вы бы уже решили это. Я говорю это по опыту делать именно это. –

+0

Ну, Дэвид, на самом деле. Если вы падаете от линии если ((SaveHi & andop2) == andop2) CRC16Lo | = 0x80 & 0xff; в зависимости от входных значений будет работать очень точно так же. Другое дело, что цикл работает 3 или 1 раз, в зависимости от блока кода 1 меньше времени и т. Д. – Machado

+0

Вы регистрировали промежуточные значения, как я уже сказал? Это показало бы несоответствие в счете выполнения цикла флага. 8 раз в Delphi, 7 в вашем Java-коде. –

ответ

2

Наиболее очевидное различие здесь:

for(flag=0;flag<7;flag++) 

Это петли проходит один раз меньше, чем версия Delphi. Вы имеете в виду:

for(flag=0;flag<8;flag++) 

Кроме того, код Java был излишне сложным. Это может быть значительно упрощено. Эта программа дает тот же результат, что и код Delphi:

import java.util.*; 

public class test 
{ 

    public static void ReadHoldRegisters(List<Integer> lst, int deviceaddr, int RegisterAddress, int RegisterLength) 
    { 
     lst.add(deviceaddr & 0xff); 
     lst.add(6); 
      lst.add((RegisterAddress >> 8) & 0xff); 
      lst.add(RegisterAddress & 0xff); 
      lst.add((RegisterLength >> 8) & 0xff); 
      lst.add(RegisterLength & 0xff); 
     Add_CRC16(lst); 
    } 

    private static void Add_CRC16(List<Integer> Data) 
    { 
     int SaveLo, SaveHi; 
     int CRC16Lo = 0xFF; 
     int CRC16Hi = 0xff; 
     int CL  = 0x1; 
     int CH  = 0xA0; 

     for (int b : Data) 
     { 
      CRC16Lo ^= b; 

      for (int flag=0; flag<8; flag++) 
      { 
       SaveHi = CRC16Hi; 
       SaveLo = CRC16Lo; 

       CRC16Hi = CRC16Hi/2; 
       CRC16Lo = CRC16Lo/2; 

       if((SaveHi & 0x01) == 0x01) 
        CRC16Lo |= 0x80; 

       if((SaveLo & 0x01) == 0x01) 
       { 
        CRC16Hi ^= CH; 
        CRC16Lo ^= CL; 
       } 
      } 

     } 

     Data.add(CRC16Lo & 0xff); 
     Data.add(CRC16Hi & 0xff); 
    } 

    public static void main(String[] args) 
    { 
     List<Integer> lst = new ArrayList<Integer>(); 
     ReadHoldRegisters(lst, 1, 1, 10); 
     for (int value: lst) 
     { 
      System.out.print(String.format("%02x", value)); 
      System.out.print(" "); 
     } 
    } 

} 
+0

Ну, я согласен с тем, что это была фиктивная ошибка, и я ценю вашу помощь.Ошибка петли решена, но она по-прежнему не работает – Machado

+0

В чем смысл «12, 8768 и 12434» в ReadHoldRegisters (lst, 12, 8768, 12434)? – Machado

+0

Входные данные. Я должен был подать некоторые данные. Вы не сказали мне, какие входные данные вы использовали. –