一,窗体界面展示
二,完成这个系统所需要的控件
1、label文本 需要修改它的text
2、button 同样需要修改它的text
3、comboBox
4、textBox
5、groupBox
6、serialPort
7、timer
本次系统所要用到的控件就这些,具体还要进行一些属性修改
三,代码展示和内容讲解
本人自己弄的,只能说大概有那么一个雏形不是很完善,大家有需要可以看看
本系统要用的自定义变量
byte sys;
byte timerState;
string str;
string num;
int balance;
int a;
1、系统运行界面程序代码
private void Form1_Load(object sender, EventArgs e)
{
CheckForIllegalCrossThreadCalls = false;
String[] port = SerialPort.GetPortNames();//通过应用系统方法,获取当前用户客户端口数
for (int i = 0; i < port.Length; i++)
{
comboBox1.Items.Add(port[i]);
}
}
2、打开串口按键的代码
private void btOpenserialport_Click(object sender, EventArgs e)
{
if (!com1.IsOpen) //如果串口已经关闭,则打开
{
com1.PortName = comboBox1.Text;//先获取串口号,串口号的选中,有组合框1提供赋值
com1.Open(); //打开串口
btOpenserialport.Text = "关闭串口";
btOpenserialport.BackColor = Color.Green;//按钮的背景颜色
timer1.Enabled = true;
com1.DataReceived += new SerialDataReceivedEventHandler(ReceiveData); //添加数据接收事件处理函数
}
else if (com1.IsOpen) //如果串口已经打开,则关闭
{
com1.Close();
btOpenserialport.Text = "打开串口";
btOpenserialport.BackColor = Color.Red;
timer1.Enabled = false;
}
}
3、查询卡号按键的代码
private void button4_Click(object sender, EventArgs e)
{
if (com1.IsOpen) //如果串口已经打开,则可以发送数据
{
try
{
byte[] buffer = new byte[] { 0xff, 0x55, 0x00, 0x00, 0x01, 0x03, 0x00, 0x30, 0x75 };
com1.Write(buffer, 0, buffer.Length); //将字节数组发送到串口
}
catch (Exception ex) //如果发生异常,则显示错误信息并关闭串口
{
MessageBox.Show("错误:" + ex.Message);
com1.Close();
}
}
else
{
MessageBox.Show("串口未打开!");
}
}
4、打开天线按键的代码
private void button5_Click(object sender, EventArgs e)
{
if (com1.IsOpen) //如果串口已经打开,则可以发送数据
{
try
{
byte[] buffer = new byte[] { 0xff, 0x55, 0x00, 0x00, 0x02, 0x03, 0x00, 0x30, 0x85 };//发送代码高频打开高频天线
com1.Write(buffer, 0, buffer.Length); //将字节数组发送到串口
}
catch (Exception ex) //如果发生异常,则显示错误信息并关闭串口
{
MessageBox.Show("错误:" + ex.Message);
com1.Close();
}
}
else
{
MessageBox.Show("串口未打开!");
}
}
5、寻卡按键的代码
private void button6_Click(object sender, EventArgs e)
{
if (com1.IsOpen) //如果串口已经打开,则可以发送数据
{
try
{
byte[] buffer = new byte[] { 0xff, 0x55, 0x00, 0x00, 0x01, 0x06, 0x00, 0x60, 0x76 };//发送代码高频M1寻卡
com1.Write(buffer, 0, buffer.Length); //将字节数组发送到串口
}
catch (Exception ex) //如果发生异常,则显示错误信息并关闭串口
{
MessageBox.Show("错误:" + ex.Message);
com1.Close();
}
}
else
{
MessageBox.Show("串口未打开!");
}
}
6、放冲突按键的代码
这里说明一些目前这个系统只是一个半成品,所以这个还没有完善上去。
7、激活M1卡按键的代码
private void button9_Click(object sender, EventArgs e)
{
if (com1.IsOpen) //如果串口已经打开,则可以发送数据
{
try
{
byte[] buffer = new byte[] { 0xff, 0x55, 0x00, 0x00, 0x02, 0x00, 0x00, 0xC0, 0x85 };//发送代码激活M1卡
com1.Write(buffer, 0, buffer.Length); //将字节数组发送到串口
}
catch (Exception ex) //如果发生异常,则显示错误信息并关闭串口
{
MessageBox.Show("错误:" + ex.Message);
com1.Close();
}
}
else
{
MessageBox.Show("串口未打开!");
}
}
8、密码验证按键的代码
private void button8_Click(object sender, EventArgs e)
{
if (com1.IsOpen) //如果串口已经打开,则可以发送数据
{
try
{
//byte[] buffer = new byte[] { 0xff, 0x55, 0x00, 0x00, 0x05, 0x02, 0x08, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xed, 0x9a };//发送代码高频M1卡密码认证
// byte[] buffer = new byte[] { 0xff, 0x55, 0x00, 0x00, 0x05, 0x02, 0x08, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x04, 0x2E, 0x9B };//发送代码高频M1卡密码认证
byte[] buffer = new byte[] { 0xff, 0x55, 0x00, 0x00, 0x05, 0x02, 0x08, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1c, 0x24, 0x9B };//发送代码高频M1卡密码认证
com1.Write(buffer, 0, buffer.Length); //将字节数组发送到串口
}
catch (Exception ex) //如果发生异常,则显示错误信息并关闭串口
{
MessageBox.Show("错误:" + ex.Message);
com1.Close();
}
}
else
{
MessageBox.Show("串口未打开!");
}
}
9、读块2按键的代码
private void button3_Click(object sender, EventArgs e)
{
if (com1.IsOpen) //如果串口已经打开,则可以发送数据
{
try
{
byte[] buffer = new byte[] { 0xff, 0x55, 0x00, 0x00, 0x03, 0x01, 0x01, 0x1e, 0x07, 0xd0 };//发送代码高频M1卡块数据块读取
//byte[] buffer = new byte[] { 0xff, 0x55, 0x00, 0x00, 0x03, 0x01, 0x01, 0x06, 0x0d, 0xd0 };//发送代码高频M1卡块数据块读取
//byte[] buffer = new byte[] { 0xff, 0x55, 0x00, 0x00, 0x03, 0x01, 0x01,0x01, 0xcf, 0x91 };//发送代码高频M1卡块数据块读取
com1.Write(buffer, 0, buffer.Length); //将字节数组发送到串口
}
catch (Exception ex) //如果发生异常,则显示错误信息并关闭串口
{
MessageBox.Show("错误:" + ex.Message);
com1.Close();
}
}
else
{
MessageBox.Show("串口未打开!");
}
}
10、发送按键的代码
private void button1_Click(object sender, EventArgs e)
{
if (button1.Text == "关闭串口")
{
if (textBox6.Text != string.Empty) //判断发送框是否为空
{
string[] str = textBox6.Text.Split();
byte[] bytes = new byte[str.Length];
for (int i = 0; i < str.Length; i++)
bytes[i] = Convert.ToByte(Convert.ToInt32(str[i], 16));
com1.Write(bytes, 0, bytes.Length);
}
else
{
MessageBox.Show("数据不能为空");
}
}
else
{
MessageBox.Show("串口未打开");
}
}
11、清空按键的代码
private void button2_Click(object sender, EventArgs e)
{
textBox5.Text = "";
textBox6.Text = "";
textBox7.Text = "";
}
12、充值按键的代码
本按键的代码只能完成一次充值并没有完全完善,大致上只能实现一下功能无法保存好数据
private void button10_Click(object sender, EventArgs e)
{
if (com1.IsOpen) //如果串口已经打开,则可以发送数据
{
try
{
switch (sys)
{
case 0:
{
byte[] buffer = new byte[] { 0xff, 0x55, 0x00, 0x00, 0x03, 0x02, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x1e, 0x71, 0x99 };
com1.Write(buffer, 0, buffer.Length); //将字节数组发送到串口
num = buffer[21].ToString().PadLeft(2, '0') + buffer[22].ToString().PadLeft(2, '0');
balance = Convert.ToInt32(num);
textBox3.Text = balance.ToString();
//com1.Write(buffer, 0, buffer.Length); //将字节数组发送到串口
sys = 1;
}
break;
case 1:
{
textBox3.Text+= balance.ToString();
sys = 2;
}
break;
case 2:
{
textBox3.Text += balance.ToString();
}
break;
default: break;
/*byte[] buffer = new byte[] { 0xff, 0x55, 0x00, 0x00, 0x03, 0x02, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x1e, 0x71, 0x99 };
com1.Write(buffer, 0, buffer.Length); //将字节数组发送到串口
num = buffer[21].ToString().PadLeft(2, '0') + buffer[22].ToString().PadLeft(2, '0') ;
balance = Convert.ToInt32(num);
textBox3.Text = balance.ToString();
//com1.Write(buffer, 0, buffer.Length); //将字节数组发送到串口 */
}
}
catch (Exception ex) //如果发生异常,则显示错误信息并关闭串口
{
MessageBox.Show("错误:" + ex.Message);
com1.Close();
}
}
else
{
MessageBox.Show("串口未打开!");
}
}
13、入场按键的代码
private void btAdmission_Click(object sender, EventArgs e)
{
if (com1.IsOpen) //如果串口已经打开,则可以发送数据
{
try
{
textBox2.Text = "";
textBox4.Text = "";
a = 0;
byte[] buffer = new byte[] { 0xff, 0x55, 0x00, 0x00, 0x03, 0x01, 0x01, 0x1e, 0x07, 0xd0 };//发送代码高频M1卡块数据块读取
//byte[] buffer = new byte[] { 0xff, 0x55, 0x00, 0x00, 0x03, 0x01, 0x01, 0x06, 0x0d, 0xd0 };//发送代码高频M1卡块数据块读取
//byte[] buffer = new byte[] { 0xff, 0x55, 0x00, 0x00, 0x03, 0x01, 0x01,0x01, 0xcf, 0x91 };//发送代码高频M1卡块数据块读取
balance = Convert.ToInt32(num);
textBox3.Text = balance.ToString();
com1.Write(buffer, 0, buffer.Length); //将字节数组发送到串口
textBox1.Text = System.DateTime.Now.ToString();//开处方时间
timer2.Interval = 1000;//开处方时间控件的时间
timer2.Start();
}
catch (Exception ex) //如果发生异常,则显示错误信息并关闭串口
{
MessageBox.Show("错误:" + ex.Message);
com1.Close();
}
}
else
{
MessageBox.Show("串口未打开!");
}
}
14、出场按键的代码
在这里我其实更推荐那么用注释掉的那些来用,因为这里我也没有完善好,没办法,后期如果有时间有兴趣可能会去完善
private void btAppearances_Click(object sender, EventArgs e)
{
if (com1.IsOpen) //如果串口已经打开,则可以发送数据
{
try
{
switch (timerState)
{
case 0:
{
byte[] buffer = new byte[] { 0xff, 0x55, 0x00, 0x00, 0x03, 0x02, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5A, 0x1e, 0x71, 0x99 };
com1.Write(buffer, 0, buffer.Length); //将字节数组发送到串口
num = buffer[21].ToString().PadLeft(2, '0') + buffer[22].ToString().PadLeft(2, '0');
balance = Convert.ToInt32(num);
textBox3.Text = balance.ToString();
//com1.Write(buffer, 0, buffer.Length); //将字节数组发送到串口
textBox2.Text = System.DateTime.Now.ToString();//开处方时间
timer2.Interval = 1000;//开处方时间控件的时间
timer2.Stop();
textBox4.Text = a + "秒";
a = 0;
timerState = 1;
}
break;
case 1:
{
byte[] buffer = new byte[] { 0xff, 0x55, 0x00, 0x00, 0x03, 0x02, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x1e, 0xb1, 0x8f };
com1.Write(buffer, 0, buffer.Length); //将字节数组发送到串口
num = buffer[21].ToString().PadLeft(2, '0') + buffer[22].ToString().PadLeft(2, '0');
balance = Convert.ToInt32(num);
textBox3.Text = balance.ToString();
//com1.Write(buffer, 0, buffer.Length); //将字节数组发送到串口
textBox2.Text = System.DateTime.Now.ToString();//开处方时间
timer2.Interval = 1000;//开处方时间控件的时间
timer2.Stop();
textBox4.Text = a + "秒";
a = 0;
timerState = 2;
}
break;
default: break;
}
}
/* byte[] buffer = new byte[] { 0xff, 0x55, 0x00, 0x00, 0x03, 0x02, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5A, 0x1e, 0x71, 0x99 };
com1.Write(buffer, 0, buffer.Length); //将字节数组发送到串口
num = buffer[21].ToString().PadLeft(2, '0') + buffer[22].ToString().PadLeft(2, '0');
balance = Convert.ToInt32(num);
textBox3.Text = balance.ToString();
//com1.Write(buffer, 0, buffer.Length); //将字节数组发送到串口
textBox2.Text = System.DateTime.Now.ToString();//开处方时间
timer2.Interval = 1000;//开处方时间控件的时间
timer2.Stop();
textBox4.Text = a + "秒";
a = 0;
}*/
catch (Exception ex) //如果发生异常,则显示错误信息并关闭串口
{
MessageBox.Show("错误:" + ex.Message);
com1.Close();
}
}
else
{
MessageBox.Show("串口未打开!");
}
}
15、timer2里面的代码
private void timer2_Tick(object sender, EventArgs e)
{
a++;
}
三、在做这个系统的时候我的心得和感受
在做这系统的时候我一开始也是迷迷糊糊的,不知道该从哪里下手,但是在经过老师的一两次讲解后我也逐渐明白了该系统的原理,其实该系统的原理很简单,就是高频卡的读写保存,只要你掌握了高频卡的基本读写指令,然后再加以修饰就能够完善本系统了,只能说本人靠这个已经足够度过本课程考核了,所以就不想加以完善了,同学可以借鉴但是还得靠自己啊,只能说我的版本很垃圾。
其实如果你是那种跟着老师同学们一起学的话完完全全可以多问问老师同学,不要害羞,有不懂就问,虽然不一定能懂的,但是至少我们有了敢去询问的勇气,真的有时候问了可能就懂了呢,好过自己一个人在那里抓瞎,也可以不问老师自己上网查,但是你总要去主动学习,天上不会掉下完整的代码的。
学习的方法很重要,经过本次学习我突然对c#有了一些不一样的思绪,这是我之前没有的,就像是突然被打开了任督二脉的样子一样,当然这样子说是夸张了一点,总之,学习还是要先去理解它的基本原理,这样子才能更好的去完善底层代码。