Цитата: Konstantin пишет: В руководстве сказано: …при использовании команды без параметра прибор отвечает посылкой, содержащей значения всех доступных параметров…
"Доступных" в данном контексте означает тех, которые доступны прибору (не сказано же просто "всех"). Если у прибора нет датчика температуры T3, так он её и не передаст, сократив структуру на соотвеоствующие 3 байта.
Цитата: Открываю приложение “С” руководства и смотрю на полную информационную часть ответного пакета команды “mon c”, считаю байты, получаю 66 байт информации. Даю команду “mon c” без параметров и собираюсь разобрать пакет, а у меня величина всей ответной посылки для команды “mon c” равна 45 байт. И как же мне теперь его разбирать, что тут есть, а чего нет?
В пакете передаётся маска параметров(4 байта). Первый бит 1 - есть подающий расход (и его точка), второй бит 1 - есть обратный расход (и его точка) итд по структуре: typedef struct { long v1; unsigned char v1point; long v2; unsigned char v2point; long v3; unsigned char v3point; long g1; unsigned char g1point; long g2; unsigned char g2point; long g3; unsigned char g3point; short t1; unsigned char t1point; short t2; unsigned char t2point; short t3; unsigned char t3point; short t4; unsigned char t4point; unsigned char p1; unsigned char p1point; unsigned char p2; unsigned char p2point; unsigned char p3; unsigned char p3point; long q; unsigned char qpoint; unsigned long err32; unsigned char err32point; } HCMONITORCURRENT;
Вот пример в досовской манере (надеюсь не напутал):
void swapper(unsigned char* dest, unsigned char* src, int num) { unsigned char* temp = new unsigned char[num];
memcpy(temp, src, num);
while(num--) { *(dest++) = *(temp+num); }
delete temp; }
void UnpackCPacket(unsigned char* dest, unsigned char* src, unsigned long mask) { const int HcMonCurrSize[] = { sizeof(long) + 1, /* V1 */ sizeof(long) + 1, /* V2 */ sizeof(long) + 1, /* V3 */ sizeof(long) + 1, /* G1 */ sizeof(long) + 1, /* G2 */ sizeof(long) + 1, /* G3 */ sizeof(short) + 1, /* T1 */ sizeof(short) + 1, /* T2 */ sizeof(short) + 1, /* T3 */ sizeof(short) + 1, /* T4 */ sizeof(char) + 1, /* P1 */ sizeof(char) + 1, /* P2 */ sizeof(char) + 1, /* P3 */ sizeof(long) + 1, /* Q */ sizeof(unsigned long) + 1 /* e32*/ }; for(int i = 0; i < (sizeof(HcMonCurrSize)/sizeof(HcMonCurrSize[0])); i++) { if( mask & 0x00000001 ) { // Распаковываем сразу с переворотом swapper(dest, src, HcMonCurrSize[i]-1); dest[HcMonCurrSize[i]-1] = src[HcMonCurrSize[i]-1]; src += HcMonCurrSize[i]; } else memset(dest, 0, HcMonCurrSize[i]);
mask >>= 1;
/* Сдвинуть указатель неупакованной записи */ dest += HcMonCurrSize[i]; } }
//Теперь, dann - инф. часть пакета данных команды /MON C unsigned long mask = *((unsigned long*)((unsigned char*)dann + 1));
swapper((unsigned char*)&mask, (unsigned char*)&mask, sizeof(mask));
HCMONITORCURRENT m;
// Распаковать параметры из пакета в структуру UnpackCPacket((unsigned char*)(&m), dann + 5, mask);
// Что было, распаковано в ПОЛНУЮ структуру m.
Цитата: Действительно, в руководстве ничего не сказано о том, что разным устройствам соответствует свои пакеты данных, и уж тем более не сказано о том какому прибору соответствует какой пакет данных.
Надеюсь, прочтя предыдущий абзац вы поняли, что все необходимые для интерпретации пакета данные присутствуют в самом пакете. Это не SA94, в котором одному богу известно, как интерпретировать его массивы данных.
Цитата: Возможно у Вас все-таки есть руководство, применимое к устройству ВИС.Т? Или примеры работы с разбором данных?
см. выше.
-- Виктор В. Жданов NegaSoft Co. FAE НПО "Тепловизор", Главный инженер-программист |