Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.14.86] |
|
Сообщ.
#1
,
|
|
|
Вот никогда с этим не сталкивался, и не найду инфы никак. Как преобразовывать такие данные. Данные приходят с прибора по Modbas RTU в виде старший байт мантиссы и младший байт мантиссы и порядок. Как это дело преобразовать в число не пойму. В руководстве написано что числа передаются в формате PIC с плавающей запятой, что это за формат и как с ним быть ?
|
Сообщ.
#2
,
|
|
|
нашел код на Борланд С++, может кто силен и поможет перевести код на C#
float PICtoIARfloat(unsigned char *PICfloat) { union { float i; unsigned char Byte[4]; } Number; //Первый байт float IAR Number.Byte[0] = 0x00; //Второй байт Number.Byte[1] = *(PICfloat+0); //Третий байт Number.Byte[2] = *(PICfloat+1); Number.Byte[2] &= 0x7F; //Сброс знака if (*(PICfloat+2) & 0x01) { //Если мл.бит установлен Number.Byte[2] |= 0x80; } //Четвертый байт Number.Byte[3] = *(PICfloat+2); Number.Byte[3] >>= 1; if (*(PICfloat+1) & 0x80) { //Если знак отрицательный Number.Byte[3] |= 0x80; } else { Number.Byte[3] &= 0x7F; } return Number.i; } Добавлено у меня получилось вот что static void Main(string[] args) { byte[] send = new byte[3] {0x65, 0x29, 0x8A}; Console.WriteLine(PICtoIARfloat(send)); Console.ReadLine(); } static float PICtoIARfloat(byte[] PICfloat) { byte[] bt = new byte[4]; //Первый байт float IAR bt[0] = 0x00; //Второй байт bt[1] = PICfloat[0]; //Третий байт bt[2] = PICfloat[1]; bt[2] &= 0x7f; //Сброс знака if ((PICfloat[2] & 0x01) == 1) { //Если мл.бит установлен bt[2] |= 0x80; } //Четвертый байт bt[3] = PICfloat[2]; bt[3] >>= 1; if ((PICfloat[1] & 0x80)==1) { //Если знак отрицательный bt[3] |= 0x80; } else { bt[3] &= 0x7F; } return ToFloat(bt); } static float ToFloat(byte[] input) { byte[] newArray = new[] { input[2], input[3], input[0], input[1] }; return BitConverter.ToSingle(newArray, 0); } } но выдает не то что надо, результат должен быть 2710,313 ((( Добавлено и еще, результат почему то в экспотенциальном виде выдает Добавлено Вопрос решен, кому интересно вот код ))) class Program { static void Main(string[] args) { byte[] send = new byte[3] {0x65, 0x29, 0x8A}; Console.WriteLine(PICtoIARfloat(send)); Console.ReadLine(); } static float PICtoIARfloat(byte[] PICfloat) { byte[] bt = new byte[4]; //Первый байт float IAR bt[0] = 0x00; //Второй байт bt[1] = PICfloat[0]; //Третий байт bt[2] = PICfloat[1]; bt[2] &= 0x7f; //Сброс знака if ((PICfloat[2] & 0x01) > 0) { //Если мл.бит установлен bt[2] |= 0x80; } //Четвертый байт bt[3] = PICfloat[2]; bt[3] >>= 1; if ((PICfloat[1] & 0x80)>0) { //Если знак отрицательный bt[3] |= 0x80; } else { bt[3] &= 0x7F; } return ToFloat(bt); } static float ToFloat(byte[] input) { return BitConverter.ToSingle(input, 0); } } |
Сообщ.
#3
,
|
|
|
ндааа, не совсем решен оказался вопрос, в боевом режиме почему то все значения идут с минусом, по величине значения похоже на правду, но вот откуда минус лезет не пойму
|
Сообщ.
#4
,
|
|
|
Тип byte по определению не может быть отрицательным. Переполнение?
|
Сообщ.
#5
,
|
|
|
тип byte не может, но в массиве храниться знак, который сбрасывается в 20й строчке, но почему опять вылазит не понятно
|
Сообщ.
#6
,
|
|
|
проблема крылась не в алгоритме преобразования а в том что пакет модбаза почему то у татар задом наперед идет )))
|