上位机程序帧数据处理最终内容是控制码和数据。由于帧数据通过二进制传输、字节缓冲进行接收和发送。所以编程的核心就是对字节中二进制的读写运算。这里通过一个最小的演示程序来讲解。对一个字节中的8个位进行置位(设置为1)和恢复(置0)操作。程序基本界面如下所示:
1.程序说明
numericUpDown1.Enable=false,不能修改数据,主要显示1个字节的十进制值。lbl1 中以绿色前景色显示字节的二进制显示方式,8个按钮用于切换所在位的0或者是1。
2.类的成员变量
#region 字段
bool b1 = false;
bool b2 = false;
bool b3 = false;
bool b4 = false;
bool b5 = false;
bool b6 = false;
bool b7 = false;
bool b8 = false;
byte b;
#endregion
3.Form1_Load事件代码
private void Form1_Load(object sender, EventArgs e)
{
if (b1) btn1.Text = "0"; else btn1.Text = "1";
if (b2) btn2.Text = "0"; else btn2.Text = "1";
if (b3) btn3.Text = "0"; else btn3.Text = "1";
if (b4) btn4.Text = "0"; else btn4.Text = "1";
if (b5) btn5.Text = "0"; else btn5.Text = "1";
if (b6) btn6.Text = "0"; else btn6.Text = "1";
if (b7) btn7.Text = "0"; else btn7.Text = "1";
if (b8) btn8.Text = "0"; else btn8.Text = "1";
numericUpDown1.Enabled = false;
}
4.置位方法把位数切换成位值
按二进制从右至左:1,2,4,8,16,32,64,128进行转化,调用setByte方法。
private void bittoint (bool bb,int shift)
{
int a = bb ? 1 : 0;
switch (shift)
{
case 0:
setByte(bb, 1);
break;
case 1:
setByte(bb, 2);
break;
case 2:
setByte(bb, 4);
break;
case 3:
setByte(bb, 8);
break;
case 4:
setByte(bb, 16);
break;
case 5:
setByte(bb, 32);
break;
case 6:
setByte(bb, 64);
break;
case 7:
setByte(bb, 128);
break;
}
numericUpDown1.Value = b;
lbl1.Text = ConvertBinaryString();
}
5.置位操作方法
private void setByte( bool bb, int shiftValue)
{
if (bb)
b = (byte)(b | shiftValue);
else
b= (byte)(b & (shiftValue^0xff));
}
6.把一个字节转化成二进制字符串
private string ConvertBinaryString()
{
byte bTmp = b;
string str="";
for(int i=7;i>=0;i--)
{
if ((1 << i & bTmp) > 0)
str += "1";
else str += "0";
}
return str;
}
7.八个置位按钮代码
private void btn1_Click(object sender, EventArgs e)
{
btn1.Text = (Convert.ToInt16(b1).ToString());
b1 =!b1;
bittoint(b1,0);
}
private void btn2_Click(object sender, EventArgs e)
{
btn2.Text = (Convert.ToInt16(b2).ToString());
b2 = !b2;
bittoint(b2,1);
}
private void btn3_Click(object sender, EventArgs e)
{
btn3.Text = (Convert.ToInt16(b3).ToString());
b3 = !b3;
bittoint(b3,2);
}
private void btn4_Click(object sender, EventArgs e)
{
btn4.Text = (Convert.ToInt16(b4).ToString());
b4 = !b4;
bittoint(b4,3);
}
private void btn5_Click(object sender, EventArgs e)
{
btn5.Text = (Convert.ToInt16(b5).ToString());
b5 = !b5;
bittoint(b5,4);
}
private void btn6_Click(object sender, EventArgs e)
{
btn6.Text = (Convert.ToInt16(b6).ToString());
b6 = !b6;
bittoint(b6,5);
}
private void btn7_Click(object sender, EventArgs e)
{
btn7.Text = (Convert.ToInt16(b7).ToString());
b7 = !b7;
bittoint(b7,6);
}
private void btn8_Click(object sender, EventArgs e)
{
btn8.Text = (Convert.ToInt16(b8).ToString());
b8 = !b8;
bittoint(b8,7);
}
写在最后
时间关系,程序代码不够紧凑,是在连思考边设计的过程中完成的。喜欢C#编程和上位机开发的朋友正好可以拿来练手。
可以改进的地方:
①一个字节的八个二进制位,可以使用枚举来做,更适合程序的模块化设计。
②八个置位按钮事件代码可以共用一个事件完成。