实验代码:
using System;
using System.Collections.Generic;
using https://www.wendangku.net/doc/668564962.html,ponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ISO15693DLL;
using System.Threading;
namespace ISO15693_Reader
{
public partial class Main : Form
{
//串口操作类的实例化
ISO15693Reader Reader = new ISO15693Reader();
//IsCommand用来标记当前五个实验中,使用的是那种命令,下面有对应的注释
private Int32 IsCommand = 0;
public Main()
{
InitializeComponent();
}
private void Main_Load(object sender, EventArgs e)
{
//窗体加载时调用
RefreshPort();
cmb_Baud.SelectedIndex = 0;
cmb_Reset.SelectedIndex = 0;
group_Operate.Enabled = false;
group_Paramter.Enabled = false;
btn_Close.Enabled = false;
txt_BlockCount.ReadOnly = true;
}
///
/// 声明一个委托,用于显示窗体上的List_Info控件的信息
///
///
private delegate void AddList(string msg);
///
/// 显示List_Info控件信息的方法
///
///
private void ShowList(string msg)
{
//使用委托显示信息,可避免跨线程调用的问题
if (list_Info.InvokeRequired)
{
AddList d = new AddList(ShowList);
list_Info.Invoke(d, msg);
}
else
{
list_Info.Items.Insert(0, DateTime.Now.ToLongTimeString() + ":" + msg);
}
}
//打开串口
private void btn_Open_Click(object sender, EventArgs e)
{
if (cmb_Port.SelectedIndex < 0)
{
ShowList("打开失败,请选择串口!");
return;
}
Byte value = Reader.OpenSerialPort(cmb_Port.Text, Convert.ToInt32(cmb_Baud.Text));
if (value == 0x00)
{
group_Paramter.Enabled = true;
group_Operate.Enabled = true;
btn_Open.Enabled = false;
btn_Close.Enabled = true;
ShowList(string.Format("Port:[{0}],OpenSucceed!,Baud:[{1}]", cmb_Port.Text, cmb_Baud.Text));
}
else
{
ShowList(string.Format("Port[{0}],OpenFail!", cmb_Port.Text));
}
}
//刷新串口
private void btn_Refresh_Click(object sender, EventArgs e)
{
RefreshPort();
}
///
/// 刷新串口的方法
///
private void RefreshPort()
{
cmb_Port.Items.Clear();
cmb_Port.Text = "";
string[] Ports = System.IO.Ports.SerialPort.GetPortNames();
foreach (var item in Ports)
{
cmb_Port.Items.Add(item);
}
if (Ports.Length >= 0)
{
cmb_Port.SelectedIndex = 0;
}
}
//关闭串口
private void btn_Close_Click(object sender, EventArgs e)
{
Byte value = Reader.CloseSerialPort();
if (value == 0x00)
{
ShowList(string.Format("Port[{0}],CloseSucceed!", cmb_Port.Text));
}
else
{
ShowList(string.Format("Port[{0}],CloseFail!", cmb_Port.Text));
}
}
//寻到的卡片数目
private Int32 TagCount = 0;
//寻到的卡片号
private String[] TagNumber = null;
//声明一个卡片集合用于存放不同卡号的卡片数据
private List
//执行方法,所有指令都通过这个按钮来控制
private void btn_Run_Click(object sender, EventArgs e)
{
Byte value;
Byte[] BlockData = null;
//判断是否打开串口
if (Reader.IsOpen)
{
//调用一个Switch来对每一种选中命令执行相对应的方法
switch (IsCommand)
{
//寻单卡
case 0:
if (rb_ask.Checked)
{
value = Reader.Inventory(ModulateMethod.ASK, InventoryModel.Single, ref TagCount, ref TagNumber);
if (value == 0x00)
{
ShowList(String.Format("Modulate.ASK,TagCount:{0},TagNumber:{1}", TagCount, TagNumber[0]));
if (!_listTag.Contains(TagNumber[0]))
{
_listTag.Add(TagNumber[0]);
cmb_tags.Items.Add(TagNumber[0]);
cmb_tags.SelectedIndex = 0;
}
}
else
{
ShowList("Inventory Lose!No TagNumber");
}
}
else if (rb_fsk.Checked)
{
value = Reader.Inventory(ModulateMethod.FSK, InventoryModel.Single, ref TagCount, ref TagNumber);
if (value == 0x00)
{
if (!_listTag.Contains(TagNumber[0]))
{
_listTag.Add(TagNumber[0]);
cmb_tags.Items.Add(TagNumber[0]);
cmb_tags.SelectedIndex = 0;
}
ShowList(String.Format("Modulate.FSK,TagCount:{0},TagNumber:{1}", TagCount, TagNumber[0]));
}
{
ShowList("Inventory Lose!No TagNumber");
}
}
else
{
}
break;
//读取指定的数据块中的数据
case 1:
if (cmb_tags.Text != "")
{
value = Reader.ReadSingleBlock(cmb_tags.Text, BlockLength.ShortBlock4Byte, Convert.ToByte(txt_StartAdress.Text.Trim(), 16), ref BlockData);
if (value == 0x00)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < BlockData.Length; i++)
{
sb.Append(BlockData[i].ToString("X2"));
}
txt_Resulte.Text = sb.ToString();
txt_WriteData.Text = txt_Resulte.Text;
ShowList(string.Format("Reader:[{0}],Adress:[{1}],ReaderData:{2}", cmb_tags.Text, txt_StartAdress.Text.Trim(), ByteArrayToString(BlockData)));
}
}
else
{
ShowList("请先寻到一张或多张卡片!");
}
break;
//写入数据到卡片中指定的数据块
case 2:
// Byte BlockLength = Byte.Parse(txt);
if (cmb_tags.Text != "")
{
Byte[] DataForWrite = new Byte[Convert.ToInt32(txt_BlockSize.Text.Trim())];
String strForWrite = txt_WriteData.Text.Trim();
try
for (Byte i = 0; i < DataForWrite.Length; i++)
{
DataForWrite[i] = Convert.ToByte(strForWrite.Substring(i * 2, 2), 16);
}
}
catch (System.ArgumentOutOfRangeException ex)
{
ShowList(String.Format("错误:写入的数据长度不够{0}Byte!", Convert.ToInt32(txt_BlockSize.Text.Trim())));
//txt_WriteData_2.SelectAll();
//txt_WriteData_2.Focus();
return;
}
catch (System.Exception ex)
{
ShowList(String.Format("错误:请填写{0}Byte的16进制数据!", Convert.ToInt32(txt_BlockSize.Text.Trim())));
txt_WriteData.SelectAll();
txt_WriteData.Focus();
return;
}
value = Reader.WriteSingleBlock(cmb_tags.Text, BlockLength.ShortBlock4Byte, Convert.ToByte(txt_StartAdress.Text.Trim(), 16), DataForWrite);
if (value == 0x00)
{
ShowList(string.Format("Succeed!,Adress:[{0}],WriteData:{1}", txt_StartAdress.Text, txt_WriteData.Text));
}
else
{
ShowList(string.Format("Lose!Adress:[{0}],WriteData:{1}", txt_StartAdress.Text, txt_WriteData.Text));
}
}
else
{
ShowList("请先寻到一张或多张卡片!");
}
break;
//使卡片静默
case 3:
if (cmb_tags.Text != "")
{
value = Reader.StayQuiet(cmb_tags.Text);
if (value == 0x00)
{
ShowList(string.Format("命令执行成功,卡片[{0}]静默成功!", cmb_tags.Text));
}
else
{
ShowList(string.Format("命令执行失败,卡片[{0}]静默失败!", cmb_tags.Text));
}
}
break;
//重置卡片状态
case 4:
if (cmb_Reset.SelectedIndex != 0)
{
//ResetMode resetMode;
switch (cmb_Reset.SelectedIndex)
{
case 1:
// resetMode=ResetMode.RstAllQuiet;
value = Reader.ResetToReady(ResetMode.RstAllQuiet);
break;
case 2:
//resetMode=ResetMode.RstAllSelected;
value = Reader.ResetToReady(ResetMode.RstAllSelected);
break;
case 3:
// resetMode=ResetMode.RstSpecificQuiet;
value = Reader.ResetToReady(ResetMode.RstSpecificQuiet, cmb_tags.Text);
break;
case 4:
// resetMode=ResetMode.RstSpecificSelected;
value = Reader.ResetToReady(ResetMode.RstSpecificSelected, cmb_tags.Text);
break;
default:
//resetMode=ResetMode.RstSpecificQuiet;
value = Reader.ResetToReady(ResetMode.RstAllQuiet);
break;
}
if (value == 0x00)
{
switch (cmb_Reset.SelectedIndex)
{
case 1:
ShowList("重置所有静默卡片命令执行成功!");
break;
case 2:
ShowList("重置所有选中卡片命令执行成功!");
break;
case 3:
ShowList(string.Format("重置静默卡片[{0}]执行成功!", cmb_tags.Text));
break;
case 4:
ShowList(string.Format("重置选中卡片[{0}]执行成功!", cmb_tags.Text));
break;
default:
//resetMode = ResetMode.RstSpecificQuiet;
break;
}
}
else
{
switch (cmb_Reset.SelectedIndex)
{
case 1:
ShowList("重置所有静默卡片命令执行失败!");
break;
case 2:
ShowList("重置所有选中卡片命令执行失败!");
break;
ShowList(string.Format("重置静默卡片[{0}]执行失败!", cmb_tags.Text));
break;
case 4:
ShowList(string.Format("重置选中卡片[{0}]执行失败!", cmb_tags.Text));
break;
default:
//resetMode = ResetMode.RstSpecificQuiet;
break;
}
}
}
else
{
ShowList("请选择一种静默方式才可执行!");
}
break;
//读取多个数据块
case 5:
if (cmb_tags.Text != "")
{
string str = "";
Byte[] BlockDataMore = null;
int count = 0;
if (int.TryParse(txt_BlockCount.Text.Trim(), out count))
{
int Address = 0;
if (int.TryParse(txt_StartAdress.Text.Trim(), out Address))
{
value = Reader.ReadMultiBlock(cmb_tags.Text, BlockLength.ShortBlock4Byte, (byte)Address, (byte)count, ref BlockDataMore);
if (value == 0x00)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < BlockDataMore.Length; i++)
{
sb.Append(BlockDataMore[i].ToString("X2"));
}
for (int i = 0; i < count; i++)
{
str += sb.ToString().Substring(i * 4, 8)+" ";
txt_Resulte.Text = str;
txt_WriteData.Text = sb.ToString();
ShowList(string.Format("Reader[{0}],Aderess:{1},ReaderCount:{3},Data:{2}", cmb_tags.Text, txt_StartAdress.Text.Trim(), ByteArrayToString(BlockDataMore), count));
}
}
}
else
{
MessageBox.Show("请填写正确的读取数据的大小");
}
}
break;
default:
break;
}
}
else
{
ShowList("串口未打开,请打开串口!");
}
}
private void rb_Inventory_CheckedChanged(object sender, EventArgs e)
{
//寻单卡
if (rb_Inventory.Checked)
{
btn_AutoRun.Enabled = true;
IsCommand = 0;
}
else
{
btn_AutoRun.Enabled = false;
}
}
private void rb_ReadSingle_CheckedChanged(object sender, EventArgs e)
{
//读取指定的数据块中的数据
if (rb_ReadSingle.Checked)
{
IsCommand = 1;
txt_BlockCount.ReadOnly = true;
}
}
private void rb_WriteSingle_CheckedChanged(object sender, EventArgs e) {
//写入数据到卡片中指定的数据块
if (rb_WriteSingle.Checked)
{
IsCommand = 2;
}
}
private void rb_StayQuiet_CheckedChanged(object sender, EventArgs e) {
//使卡片静默
if (rb_StayQuiet.Checked)
{
IsCommand = 3;
}
}
private void rb_ResetReady_CheckedChanged(object sender, EventArgs e) {
//重置卡片状态
if (rb_ResetReady.Checked)
{
IsCommand = 4;
}
}
private void rb_ReadMultiple_CheckedChanged(object sender, EventArgs e) {
//读取多个数据块
if (rb_ReadMultiple.Checked)
{
IsCommand = 5;
txt_BlockCount.ReadOnly = false;
}
}
private void rb_AutoInvertory_CheckedChanged(object sender, EventArgs e) {
//寻多卡
if (rb_AutoInvertory.Checked)
{
btn_AutoRun.Enabled = true;
IsCommand = 6;
}
else
{
btn_AutoRun.Enabled = false;
}
}
///
/// 将字节数组转换为十六进制的字符串
///
/// 字节数组
///
private String ByteArrayToString(Byte[] array)
{
StringBuilder sb = new StringBuilder();
foreach (Byte a in array) { sb = sb.Append(a.ToString("X2")); }
return sb.ToString();
}
private String ByteArrayToString(Byte[] array, Int32 StartPos, Int32 Length) {
StringBuilder sb = new StringBuilder();
for (Int32 index = StartPos; index < StartPos + Length; index++)
{ sb = sb.Append(array[index].ToString("X2")); }
return sb.ToString();
}
///
/// 将十六进制的字符串转换为字节数组
///
/// 字符串
///
private Byte[] StringToByteArray(String str)
{
Byte[] data = new Byte[str.Length / 2];
for (Int32 i = 0; i < data.Length; i++)
{
data[i] = Convert.ToByte(str.Substring(i * 2, 2), 16);
}
return data;
}
//当选择重置方式的值发生更改时,对应的命令也会变为重置模式
private void cmb_Reset_SelectedIndexChanged(object sender, EventArgs e)
{
if (cmb_Reset.SelectedIndex != 0)
{
rb_ResetReady.Checked = true;
}
}
private void btn_CloseSystem_Click(object sender, EventArgs e)
{
if (MessageBox.Show("是否退出系统?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.OK)
{
this.Close();
}
}
//清空文本框
private void btn_Clear_Click(object sender, EventArgs e)
{
txt_Resulte.Text = "";
txt_WriteData.Text = "";
list_Info.Items.Clear();
}
//循环寻多卡
private void btn_AutoRun_Click(object sender, EventArgs e)
{
//开启寻多卡的线程
Thread th = new Thread(AutoRun);
th.IsBackground = true;
if (btn_AutoRun.Text == "AutoRun")
{
IsStop = true;
btn_AutoRun.Text = "StopRun";
th.Start();
}
else
{
IsStop = false;
btn_AutoRun.Text = "AutoRun";
}
}
//添加标签的委托
private delegate void AddItem(string tag);
private void AddCmbTagNumber(string tag)
{
if (cmb_tags.InvokeRequired)
{
AddItem d = new AddItem(AddCmbTagNumber);
cmb_tags.Invoke(d, tag);
}
else
{
cmb_tags.Items.Add(tag);
cmb_tags.SelectedIndex = 0;
}
}
//控制寻多卡循环是否继续进行
private Boolean IsStop = false;
//寻多卡的循环方法
private void AutoRun()
{
Byte value;
while (IsStop)
{
if (rb_ask.Checked)
{
value = Reader.Inventory(ModulateMethod.ASK, InventoryModel.Multiple, ref TagCount, ref TagNumber);
if (value == 0x00)
{
for (int i = 0; i < TagNumber.Length; i++)
{
ShowList(String.Format("Modulate.ASK,TagCount:{0},TagNumber:{1}", TagCount, TagNumber[i]));
if (!_listTag.Contains(TagNumber[i]))
{
_listTag.Add(TagNumber[i]);
AddCmbTagNumber(TagNumber[i]);
}
}
}
else
{
ShowList("Inventory Lose!No TagNumber");
}
}
else if (rb_fsk.Checked)
{
value = Reader.Inventory(ModulateMethod.FSK, InventoryModel.Multiple, ref TagCount, ref TagNumber);
if (value == 0x00)
{
for (int i = 0; i < TagNumber.Length; i++)
{
if (!_listTag.Contains(TagNumber[i]))
{
_listTag.Add(TagNumber[i]);
AddCmbTagNumber(TagNumber[i]);
}
ShowList(String.Format("Modulate.FSK,TagCount:{0},TagNumber:{1}", TagCount, TagNumber[i]));
}
}
else
{
ShowList("Inventory Lose!No TagNumber");
}
}
else
{
}
}
}
private void Main_FormClosing(object sender, FormClosingEventArgs e)
{
if (Reader.IsOpen)
{
if (IsStop)
{
IsStop = false;
}
Reader.CloseSerialPort();
}
}
} }