Разбейте длинную функцию getTime () на 4 шорта, которые на самом деле не работают Modbus - PullRequest
0 голосов
/ 01 июля 2018

Я новичок и хочу разделить длительное время на 4 протокола для протокола Modbus, но это не всегда работает. Я не знаю почему (возможно из-за кастинга). Я надеюсь, что кто-то может мне помочь:)

Заранее спасибо тем, кто меня просветит!

public void SetUp() {
    long time = new Date().getTime();  // time in ms since epoch
    System.out.println(time);
    int high32 = (int)(time >> 32);
    int low32 = (int)time;
    long l = (((long)high32) << 32) | (low32 & 0xffffffffL);
    short low16_1 = (short) high32;
    short high16_1= (short) (high32 >> 16);
    int complete = low16_1 | (high16_1 << 16);
    short low16_2 = (short) low32;
    short high16_2= (short) (low32 >> 16);
    int complete2 = low16_2 | (high16_2 << 16);
    long d = (((long)complete) << 32) | (complete2 & 0xffffffffL);
    System.out.println(l);      
    System.out.println(d);
    Date e = new Date (time);
    System.out.println(e);
    Date g = new Date (d);
    System.out.println(g);
}

Пример отображения:

1530430114623
1530430114623
1530430114623
Sun Jul 01 09:28:34 CEST 2018
Sun Jul 01 09:28:34 CEST 2018

1530431375214
1530431375214
1533303293806
Sun Jul 01 09:49:35 CEST 2018
Fri Aug 03 15:34:53 CEST 2018

1 Ответ

0 голосов
/ 01 июля 2018

Просто используйте союз

Это как конвертировать из 1 long (32 бита) в 4 uint8 (8bit)

union convertor{
long input;
uint8_t output[4];
}

convertor entry;
entry.input=new Date().getTime()
//the value will be split into 4 unit8_t of entry.output

Вы можете сделать что-то подобное с unit16_t, здесь вам придется использовать 2 unit16_t вместо 4.

Затем вы можете объединить шорты вместе в том же самом регистре, где они принимаются, чтобы получить первоначальное значение времени

for(int i=0;i<4;i++)
entry.output[i]=data[i];
//get the original value from entry.intput as long
...