Преобразование числового значения типа Float для передачи по RS-232 (SerialPort) - C#
Формулировка задачи:
Добрый день!
Возникла следующая проблема: необходимо преобразовать число типа Float для передачи по COM-порту следующим методом:
преобразовать надо в 4 байта (2 до запятой с учетом знакоразряда и 2 после запятой), потом разбить по одному байту и передавать.
Передача выглядит следующим образом: +/-1б 2б (фиксированная точка) 3б 4б.
Есть идея - записывать число в переменную типа string, а потом проводить анализ и разбивать на байты. Причем, для удобства, первый байт сначала конвертировать в тип sbyte (со знаком), а потом в byte.
Но, не хотелось бы так извращаться =( Может имеется более простой способ?
Write(Byte[], Int32, Int32)
А всё оказалось еще проще =)
Ниже привел пример кода. Единственное неудобно, что старший разряд не BM[0], а BM[4]...
Но это уже издержки производства)
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
Решение задачи: «Преобразование числового значения типа Float для передачи по RS-232 (SerialPort)»
textual
Листинг программы
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; } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д