РЕДАКТИРАНО И ПРОВЕДЕНО (по-долу)
Използвам Java за Android, опитвайки се да изпратя байта 255 (0xFF във функцията WriteSingleCoil) към ModBUS сървърно устройство.
Устройството не работи, не знам дали защото не мога да интерпретира подписания байт -1 или защото греша при изчисляването на CRC. Не знам как да изчисля CRC за отрицателни байтове.
Обобщаване: Не знам как да изпратя функция 05 Write Single Coil със стойност 0xFF за включване на бобината за от Java към ModBUS сървър.
Може ли някой да ми помогне, моля?
РЕШЕНИЕ:
" iIndex = ucCRCLo ^ b: операции като тази трябва да бъдат записани като iIndex = (ucCRCLo ^ b)&0xff, тъй като & ще прехвърли ucCRCLo, b и резултата към int, което е 32 бита, докато short е 16, така че ще имате много допълнителни битове, зададени на 1 "
Този отговор ми помогна. Благодаря много на TheDayOfcondor
Но също така моят огромен проблем беше обичайният проблем в Java със подписани байтове. Моята функция за изчисляване на CRC го прави правилно за неподписани байтове, но дава грешки, ако премина вътре в подписани байтове. Номерът за работа с байтове за ModBUS комуникация е работата в цялото приложение с шорти като байтове, за да има диапазон 0-255, дори изчисляване на трамвай и CRC. И само в последната стъпка, когато изпращате трамвай към ModBUS сървъра, отново ги преобразувайте в байтове. Това работи.
Надяваме се, че ще помогне на някого в бъдеще.
ОБЯСНЕНИЕ НА ПРОБЛЕМА:
Опитвам се да настроя бобина на ModBUS с функция 05, това е обяснение на функцията:
Заявка
Опитвам се да настроя бобината на адрес 1:
Този шестнадесетичен: 0A 05 00 01 ff 00 DC 81
Този масив от байтове: 10 5 0 1 255 0 220 129
10: Адресът на подчинения (10 = 0A шестнадесетичен)
05: Функционалният код (принудителна единична намотка)
0001: Адресът на данните на бобината. (бобина № 1 = 01 шестнадесетичен)
FF00: Състоянието за запис (FF00 = ВКЛ., 0000 = ИЗКЛ.)
DC81: CRC (циклична проверка на излишък) за проверка на грешки.
Работата е там, че Java използва байтове със знак, така че не мога да сложа 255 в моя масив от байтове. Разбирам, че трябва да поставя -1, но тогава не мога да изчисля CRC правилно, защото имам няколко предварително изчислени масива от байтове за получаване на CRC, но функцията изпраща отрицателен индекс.
И така: не знам дали се справям правилно, опитвайки се да изпратя -1, дали имам алтернатива за изпращане на 255, нито как да изчисля CRC за -1.
Това е функция за изчисляване на CRC:
public short[] GenerateCRC (byte[] pMsg) {
short ucCRCHi = 0xFF;
short ucCRCLo = 0xFF;
int iIndex;
for (byte b : pMsg)
{
iIndex = ucCRCLo ^ b;
try {
ucCRCLo = (short)(ucCRCHi ^ aucCRCHi[ ( iIndex ) ]);
ucCRCHi = aucCRCLo[ ( iIndex ) ];
} catch (Exception e) {
Log.e(LOGTAG, "GenerateCRC: " + e.toString(), e);
e.printStackTrace();
}
}
short[]result= new short[2];
result0]= ucCRCHi;
result1]= ucCRCLo;
return result;
}