筆者最近需要上位機與下位機進行資料互動,在廣泛參考大佬的資料后,較為完善地使用Textbox控制元件進行資料輸入的功能,
程式段主要功能:實作輸入資料并轉換成byte陣列再通過串口發送至下位機,
讀取TextBox控制元件中資料并發送
private void Botton_Float_Click(object sender, EventArgs e)
{
if (button1.Text == "關閉串口")
{
if(TextBox_Tem_Cal.Text != String .Empty) //判斷資料輸入框是否為空
{
HexMath CRC = new HexMath();
Byte[] buffer = new Byte[6];
float tem_cal_float = float.Parse(TextBox_Tem_Cal.Text);
Byte[] float_byte_array = new Byte[4];
float_byte_array = FloatToBytes(tem_cal_float);
buffer[0] = float_byte_array[0];
buffer[1] = float_byte_array[1];
buffer[2] = float_byte_array[2];
buffer[3 ] = float_byte_array[3];
CRC.CalculateCrc16(buffer, out buffer[5], out buffer[4]);
serialPort1.Write(buffer, 0, 6);
}
else
{
MessageBox.Show("校準資料不能為空");
}
}
else
{
MessageBox.Show("串口未打開");
}
}
限制TextBox控制元件輸入資料
private void TextBox_Tem_Cal_KeyPress(object sender, KeyPressEventArgs e)//在TextBox中按下按鍵時觸發事件,保證只能輸入數字
{
//判斷按鍵是不是要輸入的型別,
if (((int)e.KeyChar < 48 || (int)e.KeyChar > 57) && (int)e.KeyChar != 8 && (int)e.KeyChar != 46)
e.Handled = true;
//小數點的處理,
if ((int)e.KeyChar == 46) //小數點
{
if (TextBox_Tem_Cal.Text.Length <= 0)
e.Handled = true; //小數點不能在第一位
else
{
float f;
float oldf;
bool b1 = false, b2 = false;
b1 = float.TryParse(TextBox_Tem_Cal.Text, out oldf);
b2 = float.TryParse(TextBox_Tem_Cal.Text + e.KeyChar.ToString(), out f);
if (b2 == false)
{
if (b1 == true)
e.Handled = true;
else
e.Handled = false;
}
}
}
}
Float 與 byte陣列 互轉
private static byte[] FloatToBytes(float data)
{
unsafe
{
byte* pdata = (byte*)&data;
byte[] byteArray = new byte[sizeof(float)];
for (int i = 0; i < sizeof(float); ++i)
byteArray[i] = *pdata++;
return byteArray;
}
}
private static float BytesToFloat(byte[] data)
{
unsafe
{
float a = 0.0F;
byte i;
byte[] x = data;
void* pf;
fixed (byte* px = x)
{
pf = &a;
for (i = 0; i < data.Length; i++)
{
*((byte*)pf + i) = *(px + i);
}
}
return a;
}
}
程式參考:
TextBox輸入限制
C# byte與float轉換
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/266433.html
標籤:其他
上一篇:2021浙江大學軟院學院軟體工程推免生面經(2020年9月面試)
下一篇:Docker學習一《安裝》
