Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
madmasm
0 / 0 / 1
Регистрация: 04.07.2012
Сообщений: 3
1

Преобразование числового значения типа Float для передачи по RS-232 (SerialPort)

04.07.2012, 10:55. Просмотров 2103. Ответов 2
Метки нет (Все метки)

Добрый день!
Возникла следующая проблема: необходимо преобразовать число типа Float для передачи по COM-порту следующим методом:

C#
1
Write(Byte[], Int32, Int32)
преобразовать надо в 4 байта (2 до запятой с учетом знакоразряда и 2 после запятой), потом разбить по одному байту и передавать.
Передача выглядит следующим образом: +/-1б 2б (фиксированная точка) 3б 4б.
Есть идея - записывать число в переменную типа string, а потом проводить анализ и разбивать на байты. Причем, для удобства, первый байт сначала конвертировать в тип sbyte (со знаком), а потом в byte.
Но, не хотелось бы так извращаться =( Может имеется более простой способ?

Добавлено через 53 минуты
А всё оказалось еще проще =)
Ниже привел пример кода. Единственное неудобно, что старший разряд не BM[0], а BM[4]...
Но это уже издержки производства)

C#
1
2
3
4
5
6
7
                f = float.Parse(IDD_tb.Text); // string to float
                byte[] BM = BitConverter.GetBytes(f); // create bytes array (float to byte)
                for (i = 0; i < BM.Length; i++)
                {
                    Rez_l.Text += BM[i].ToString() + " "; // check
                }
                Rez_l.Text += BitConverter.ToSingle(BM, 0).ToString(); // BitConverter.ToSingle(BM, 0) - byte to float
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.07.2012, 10:55
Ответы с готовыми решениями:

Преобразование данных для передачи в БД SQL точных значений float
В программе существует окно ввода, где вводится число с запятой, коорая передается в БД. А там оно...

Реализовать класс-оболочку Number для числового типа float
на С#:Реализовать класс-оболочку Number для числового типа float. Реализовать методы сложения и...

Реализовать класс-оболочку Number для числового типа float
Реализовать класс-оболочку Number для числового типа float. Реализовать методы сложения и деления....

Реализовать класс-оболочку Number для числового типа float
Реализовать класс-оболочку Number для числового типа float. Реализовать методы сложения и деления....

Проверка числового значения на float
Собственно вопрос задан в заголовке. Есть необходимость проверить значение, попадает ли оно в...

2
kolorotur
Эксперт .NET
11306 / 9201 / 2335
Регистрация: 17.09.2011
Сообщений: 15,810
Завершенные тесты: 1
04.07.2012, 11:20 2
Только учтите, что таким методом вы получите не "2 до запятой с учетом знакоразряда и 2 после запятой", а просто побайтовое представление числа с плавающей точкой по стандарту IEEE-754.
0
madmasm
0 / 0 / 1
Регистрация: 04.07.2012
Сообщений: 3
04.07.2012, 16:25  [ТС] 3
Спасибо, учту. Думаю, для проверки работоспособности протокола такой вариант подойдет, поскольку анализ производится на уровне application.

Добавлено через 4 часа 30 минут
Вот еще код для преобразования, делал из расчета, что число разбивается на двое: до запятой и после запятой, следом преобразуется для передачи и восстанавливается на приемной стороне.
Набросал на скорую руку, не следя за стилем написания =)

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace test_string_to_float_4_byte
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        char[] delimiterChars = { ',', '.'};
        private void button1_Click(object sender, EventArgs e)
        {
            #region ///////////////////////////Tx
            label1.Text = "";  label3.Text = "";
            string[] str = textBox1.Text.Split(delimiterChars);
            int i=str.Length;
            for(int k=0;k<i;k++)
            {
                label1.Text += str[k] + "  ";
            }
 
            short rez = short.Parse(str[0]);
            ushort rez1 = ushort.Parse(str[1]);
            
            byte[] BM = BitConverter.GetBytes(rez);
            
            //string dd = //BMz[0].ToString() + BMz[0].ToString();
            string inv_BMz = inv_str(str[1]);//);
 
            byte[] BMz = BitConverter.GetBytes(ushort.Parse(inv_BMz));
            #endregion
 
            ////////////////////////////////////////////////////////////////////
            
            i = BM.Length;
            for (int k = 0; k < i; k++)
            {
                label1.Text += BM[k] + "  ";
            }
            /////////check
            i = BMz.Length;
            for (int k = 0; k < i; k++)
            {
                label1.Text += BMz[k] + "  ";
            }
 
 
 
            #region ///////////////////////////Rx
 
            label1.Text += BitConverter.ToInt16(BM, 0).ToString() + "   " + BitConverter.ToInt16(BMz, 0).ToString();
            string istr = inv_str(BitConverter.ToInt16(BMz, 0).ToString());
            string ss =BitConverter.ToInt16(BM, 0).ToString() + ","+istr;
            try
            {
                istr = float.Parse(ss).ToString();
            }
            catch
            {
                MessageBox.Show("Ошибка при переводе типа данных во float");
            }
            
            label3.Text = istr;
            #endregion ////////////////////////////////////////////////////////////////////
 
        }
 
        public static string inv_str(string massA)
        {
            int  sizem = massA.Length;
            string rez="";
            for (int i=0; i < sizem; i++)
            {
                rez += massA[sizem-1-i];
            }
            return rez;
        }
    }
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.07.2012, 16:25

Преобразование массива типа char в массив типа float
Хорош ли следующий способ преобразования массива типа char в массив типа float? #include...

Преобразование строкового типа в переменную типа float
Как в программе С++ Builder6 преобразовать строковый тип числа взятого из компонента...

Подготовка массива данных или строки для передачи в Serialport
Привет ребята! Я не являюсь программистом, чисто любительски пишу для собственных нужд от редкого...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru