Преобразование числового значения типа 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;
}
}
}