資源簡介
http://www.cnblogs.com/lxchco95/articles/1235804.html
C#程序開發范例_IC卡讀寫
C#程序開發范例寶典 13.3 IC卡應用
http://book.csdn.net/ 2007-9-7 16:37:00
圖書導讀 當前章節:13.3 IC卡應用·1.14 其他技術·13.1 串口控制·13.2 加密狗·13.4 監控·13.5 語音卡控制·13.6 手機程序開發加拿大·達內專注高端it培訓名企定向委培
為納斯達克上市公司定向委培高級軟件工程師 國內最強大專家團隊組合授課,確保高薪就業
www.tarena.com.cn
管理不可能管理的項目!
要減少失敗的風險 組織必須轉向 IT 開發的治理模型
doc.csdn.net
如何開發智能客戶端應用
離線應用模塊的合理利用
www.intel.com/cd/ids...
13.3 IC卡應用
IC(Integrated Circuit)卡,也被稱作智能卡(Smart Card),具有寫入數據和存儲數據的功能,IC卡內存儲器的內容可以根據需要有條件地供外部讀取,完成信息處理和判定。由于其內部具有集成電路,不但可以存儲大量信息,具有極強的保密性能,并且還具有抗干擾、無磨損、壽命長等特性。因此在各個領域中得到廣泛應用。下面通過兩個實例介紹IC卡的簡單應用。
實例422 向IC卡中寫入數據
實例說明
IC卡是攜帶應用信息和數據的媒體,空白IC卡是不能立即使用的,必須對IC卡應用系統進行初始化,寫入系統IC卡和個人密碼,個人專用信息和應用數據。下面介紹如何向IC卡中寫入數據。運行本例,在“數據”文本框中輸入要存入IC卡中的數據,單擊“寫數據”按鈕,即可將輸入的數據寫入IC卡中。如圖13.6所示。
技術要點
本例使用的是深圳明華生產的明華IC卡讀寫器,用戶在使用時將驅動程序安裝完畢后,即可正常使用本系統。
本例通過調用Mwic_32.dll鏈接庫,進行IC卡的讀寫工作。下面介紹與IC卡寫操作相關的幾個函數。
(1)auto_init函數
該函數用于初始化IC卡讀卡器。語法如下:
public static extern int auto_init(int port, int baud);
參數說明如下。
l port:標識端口號,Com1對應的端口號為0;Com2對應的端口號為1,依此類推。
l baud:標識波特率。
l 返回值:如果初始化成功,返回值是IC卡設備句柄;如果初始化失敗,返回值小于零。
(2)setsc_md函數
該函數用于設置設備密碼模式。語法如下:
public static extern int setsc_md(int icdev, int mode);
參數說明如下。
l icdev:標識設備句柄,通常是auto_init函數的返回值。
l mode:標識設備密碼模式,如果為0,設備密碼有效,設備在加電時必須驗證設備密碼才能對設備進行操作。如果為1,設備密碼無效。
l 返回值:如果函數執行成功返回值為零,否則小于零。
(3)get_status函數
該函數用于獲取設備的當前狀態。語法如下:
public static extern Int16 get_status(int icdev, Int16* state);
參數說明如下。
l icdev:標識設備句柄,通常是auto_init函數的返回值。
l state:用于接收函數返回的結果。如果為0表示讀卡器中無卡,為1表示讀卡器中有卡。
l 返回值:如果函數執行成功返回值為零,否則小于零。
(4)csc_4442函數
該函數用于核對IC卡密碼。語法如下:
public static extern Int16 Csc_4442(int icdev, int len, [MarshalAs(UnmanagedType.LPArray)] byte[] p_string);
參數說明如下。
l icdev:標識設備句柄,通常是auto_init函數的返回值。
l len:標識密碼長度,其值為3。
l p_string:標識設置的密碼。
l 返回值:如果函數執行成功返回值為零,否則小于零。
(5)swr_4442函數
該函數用于向IC卡中寫入數據。語法如下:
public static extern int swr_4442(int icdev, int offset, int len, char* w_string);
參數說明如下。
l icdev:標識設備句柄,通常是auto_init函數的返回值。
l offset:標識地址的偏移量,范圍是0~255。
l len:標識字符串長度。
l w_string:標識寫入的數據。
(6)ic_exit函數
該函數用于關閉設備端口。語法如下:
public static extern int ic_exit(int icdev);
參數說明如下。
l icdev:標識設備句柄,通常是auto_init函數的返回值。
(7)dv_beep函數
該函數使讀卡器嗡鳴。語法如下:
public static extern int dv_beep(int icdev, int time);
參數說明如下。
l icdev:標識設備句柄,通常是auto_init函數的返回值。
l time:標識嗡鳴持續的時間,單位是10毫秒。
實現過程
(1)新建一個項目,命名為Ex13_05,默認窗體為Form1。
(2)在Form1窗體中,主要添加兩個Button控件,用于執行向卡中寫入數據和退出程序的操作,添加一個TextBox控件,將TextBox中數據寫入IC卡中。
(3)主要程序代碼。
將程序所使用的操作IC卡的函數,封裝在類IC中。代碼如下:
[StructLayout(LayoutKind.Sequential)]
public unsafe class IC
{
//對設備進行初始化
[DllImport("Mwic_32.dll", EntryPoint = "auto_init", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern int auto_init(int port, int baud);
//設備密碼格式
[DllImport("Mwic_32.dll", EntryPoint = "setsc_md", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern int setsc_md(int icdev, int mode);
//獲取設備當前狀態
[DllImport("Mwic_32.dll", EntryPoint = "get_status", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern Int16 get_status(int icdev, Int16* state);
//關閉設備通訊接口
[DllImport("Mwic_32.dll", EntryPoint = "ic_exit", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern int ic_exit(int icdev);
//使設備發出蜂鳴聲
[DllImport("Mwic_32.dll", EntryPoint = "dv_beep", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern int dv_beep(int icdev, int time);
//向IC卡中寫數據
[DllImport("Mwic_32.dll", EntryPoint = "swr_4442", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern int swr_4442(int icdev, int offset, int len, char* w_string);
//核對卡密碼
[DllImport("Mwic_32.dll", EntryPoint = "csc_4442", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)]
public static extern Int16 Csc_4442(int icdev, int len, [MarshalAs(UnmanagedType.LPArray)] byte[] p_string);
}
下面代碼主要用于將TextBox中數據寫入到IC卡中。代碼如下:
private void button1_Click(object sender, EventArgs e)
{
//初始化
int icdev = IC.auto_init(0, 9600);
if (icdev < 0)
MessageBox.Show("端口初始化失敗,請檢查接口線是否連接正確。","錯誤提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
int md = IC.setsc_md(icdev, 1); //設備密碼格式
unsafe
{
Int16 status = 0;
Int16 result = 0;
result = IC.get_status(icdev, &status);
if (result != 0)
{
MessageBox.Show("設備當前狀態錯誤!");
int d1 = IC.ic_exit(icdev); //關閉設備
return;
}
if (status != 1)
{
MessageBox.Show("請插入IC卡");
int d2 = IC.ic_exit(icdev); //關閉設備
return;
}
}
unsafe
{
//卡的密碼默認為6個f(密碼為:ffffff),1個f的16進制是15,兩個f的16進制是255
byte[] pwd = new byte[3] { 255, 255, 255 };
//byte[] pwd = new byte[3] { 0xff, 0xff, 0xff };
//char[] pass=new ch{0xff,0xff,0xff};
Int16 checkIC_pwd = IC.Csc_4442(icdev, 3, pwd);
if (checkIC_pwd < 0)
{
MessageBox.Show("IC卡密碼錯誤!");
return;
}
char str = 'a';
int write=-1;
for (int j = 0; j < textBox1.Text.Length; j )
{
str = Convert.ToChar(textBox1.Text.Substring(j, 1));
write = IC.swr_4442(icdev, 33 j, textBox1.Text.Length, &str);
}
if (write == 0)
{
int beep = IC.dv_beep(icdev, 20); //發出蜂鳴聲
MessageBox.Show("數據已成功寫入IC卡中!");
}
else
MessageBox.Show("數據寫入IC卡失敗!");
}
int d = IC.ic_exit(icdev); //關閉設備
}
舉一反三
根據本實例,讀者可以實現以下功能。
在圖書借閱中使用IC卡。
利用IC卡控制上網。
實例423 讀取IC卡中的數據
實例說明
向IC卡寫入數據后,就可以進行讀卡操作了。運行本例,將寫入數據的IC卡插入讀卡器,單擊【讀卡】按鈕,IC卡中的數據將顯示在文本框中。如圖13.7所示。
技術要點
本例中主要調用srd_4442函數讀取IC卡中的數據,相關函數介紹請參考實例“向IC卡中寫入數據”中的“技術要點”部分。這里只介紹讀卡函數。
q srd_4442函數
該函數用于讀取IC卡中的數據。語法如下:
public static extern int srd_4442(int icdev, int offset, int len, char* r_string);
參數說明如下。
l icdev:標識設備句柄,通常是auto_init函數的返回值。
l offset:標識地址的偏移量,范圍是0~255。
l len:標識字符串長度。
l r_string:用于存儲返回的數據。
實現過程
(1)新建一個項目,命名為Ex13_06,默認窗體為Form1。
(2)在Form1窗體中,主要添加兩個Button控件,用于讀取卡中的數據和退出程序,添加一個TextBox控件,顯示卡中的數據。
(3)主要程序代碼。
private void button1_Click(object sender, EventArgs e)
{
//初始化
int icdev = IC.auto_init(0, 9600);
if (icdev < 0)
MessageBox.Show("端口初始化失敗,請檢查接口線是否連接正確。", "錯誤提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
int md = IC.setsc_md(icdev, 1); //設備密碼格式
int i = IC.dv_beep(icdev, 10); //發出蜂鳴聲
unsafe
{
Int16 status = 0;
Int16 result = 0;
result = IC.get_status(icdev, &status);
if (result != 0)
{
MessageBox.Show("設備當前狀態錯誤!");
int d1 = IC.ic_exit(icdev); //關閉設備
return;
}
if (status != 1)
{
MessageBox.Show("請插入IC卡");
int d2 = IC.ic_exit(icdev); //關閉設備
return;
}
}
unsafe
{
char str = 'a';
int read = -1;
for (int j = 0; j < 6; j )
{
read = IC.srd_4442(icdev, 33 j, 1, &str);
textBox1.Text = textBox1.Text Convert.ToString(str);
}
if (read == 0)
MessageBox.Show("IC卡中數據讀取成功!");
}
int d = IC.ic_exit(icdev); //關閉設備
}
舉一反三
根據本實例,讀者可以開發以下程序。
讀取IC卡電話系統。
公交車刷卡系統。
實例424 利用IC卡制作考勤程序
實例說明
IC卡廣泛應用于各行業,包括銀行卡、公交車刷卡系統、讀書卡等。下面介紹使用IC卡制作簡單的公司考勤系統。運行本例,單擊【刷卡】按鈕,即可對員工進行考勤。實現效果如圖13.8所示。
技術要點
有關IC卡的操作函數請參考實例“向IC卡中寫入數據”和“讀取IC卡中的數據”中的“技術要點”部分。
下面主要介紹通過IC卡如何實現員工考勤。主要將寫入IC卡中的卡號讀取出來,然后從數據表中查詢員工信息。具體代碼請參考實現過程。
實現過程
(1)新建一個項目,命名為Ex13_07,默認窗體為Form1。
(2)在Form1窗體中,主要添加5個TextBox控件和6個Label控件,用途如圖13.7所示,添加一個Button控件,執行刷IC卡命令。
(3)主要程序代碼。
private void button1_Click(object sender, EventArgs e)
{
//初始化
int icdev = IC.auto_init(0, 9600);
if (icdev < 0)
label6.Text = "端口初始化失敗,請檢查接口線是否連接正確。";
unsafe
{
Int16 status = -1;
Int16 result = IC.get_status(icdev, &status);
int md = IC.setsc_md(icdev, 1); //設備密碼格式
if (result < 0)
{
int d1 = IC.ic_exit(icdev); //關閉設備
return;
}
else if ((result == 0) && (status == 0))
{
int d2 = IC.ic_exit(icdev); //關閉設備
label6.Text = "請插入IC卡";
return;
}
}
unsafe
{
char str = 'a';
int read = -1;
string ic = "";
for (int j = 0; j < 6; j )
{
read = IC.srd_4442(icdev, 33 j, 1, &str);
ic = ic Convert.ToString(str);
}
textBox1.Text = ic;
if (read == 0)
label6.Text = "刷卡成功!";
int beep = IC.dv_beep(icdev, 20); //發出蜂鳴聲
int d3 = IC.ic_exit(icdev); //關閉設備
}
int d = IC.ic_exit(icdev); //關閉設備
//根據卡號,查找相應數據
OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" "price.mdb" ";Persist Security Info=False");
OleDbDataAdapter dap = new OleDbDataAdapter("select * from worker where ICID='" textBox1.Text "'", con);
DataSet ds = new DataSet();
dap.Fill(ds, "table");
if (ds.Tables.Count > 0)
{
textBox2.Text = ds.Tables[0].Rows[0][0].ToString();
textBox3.Text = ds.Tables[0].Rows[0][1].ToString();
textBox4.Text = ds.Tables[0].Rows[0][2].ToString();
textBox5.Text = ds.Tables[0].Rows[0][3].ToString();
}
else
{
label6.Text = "不存在該用戶!";
}
}
C#程序開發范例_IC卡讀寫
C#程序開發范例寶典 13.3 IC卡應用
http://book.csdn.net/ 2007-9-7 16:37:00
圖書導讀 當前章節:13.3 IC卡應用·1.14 其他技術·13.1 串口控制·13.2 加密狗·13.4 監控·13.5 語音卡控制·13.6 手機程序開發加拿大·達內專注高端it培訓名企定向委培
為納斯達克上市公司定向委培高級軟件工程師 國內最強大專家團隊組合授課,確保高薪就業
www.tarena.com.cn
管理不可能管理的項目!
要減少失敗的風險 組織必須轉向 IT 開發的治理模型
doc.csdn.net
如何開發智能客戶端應用
離線應用模塊的合理利用
www.intel.com/cd/ids...
13.3 IC卡應用
IC(Integrated Circuit)卡,也被稱作智能卡(Smart Card),具有寫入數據和存儲數據的功能,IC卡內存儲器的內容可以根據需要有條件地供外部讀取,完成信息處理和判定。由于其內部具有集成電路,不但可以存儲大量信息,具有極強的保密性能,并且還具有抗干擾、無磨損、壽命長等特性。因此在各個領域中得到廣泛應用。下面通過兩個實例介紹IC卡的簡單應用。
實例422 向IC卡中寫入數據
實例說明
IC卡是攜帶應用信息和數據的媒體,空白IC卡是不能立即使用的,必須對IC卡應用系統進行初始化,寫入系統IC卡和個人密碼,個人專用信息和應用數據。下面介紹如何向IC卡中寫入數據。運行本例,在“數據”文本框中輸入要存入IC卡中的數據,單擊“寫數據”按鈕,即可將輸入的數據寫入IC卡中。如圖13.6所示。
技術要點
本例使用的是深圳明華生產的明華IC卡讀寫器,用戶在使用時將驅動程序安裝完畢后,即可正常使用本系統。
本例通過調用Mwic_32.dll鏈接庫,進行IC卡的讀寫工作。下面介紹與IC卡寫操作相關的幾個函數。
(1)auto_init函數
該函數用于初始化IC卡讀卡器。語法如下:
public static extern int auto_init(int port, int baud);
參數說明如下。
l port:標識端口號,Com1對應的端口號為0;Com2對應的端口號為1,依此類推。
l baud:標識波特率。
l 返回值:如果初始化成功,返回值是IC卡設備句柄;如果初始化失敗,返回值小于零。
(2)setsc_md函數
該函數用于設置設備密碼模式。語法如下:
public static extern int setsc_md(int icdev, int mode);
參數說明如下。
l icdev:標識設備句柄,通常是auto_init函數的返回值。
l mode:標識設備密碼模式,如果為0,設備密碼有效,設備在加電時必須驗證設備密碼才能對設備進行操作。如果為1,設備密碼無效。
l 返回值:如果函數執行成功返回值為零,否則小于零。
(3)get_status函數
該函數用于獲取設備的當前狀態。語法如下:
public static extern Int16 get_status(int icdev, Int16* state);
參數說明如下。
l icdev:標識設備句柄,通常是auto_init函數的返回值。
l state:用于接收函數返回的結果。如果為0表示讀卡器中無卡,為1表示讀卡器中有卡。
l 返回值:如果函數執行成功返回值為零,否則小于零。
(4)csc_4442函數
該函數用于核對IC卡密碼。語法如下:
public static extern Int16 Csc_4442(int icdev, int len, [MarshalAs(UnmanagedType.LPArray)] byte[] p_string);
參數說明如下。
l icdev:標識設備句柄,通常是auto_init函數的返回值。
l len:標識密碼長度,其值為3。
l p_string:標識設置的密碼。
l 返回值:如果函數執行成功返回值為零,否則小于零。
(5)swr_4442函數
該函數用于向IC卡中寫入數據。語法如下:
public static extern int swr_4442(int icdev, int offset, int len, char* w_string);
參數說明如下。
l icdev:標識設備句柄,通常是auto_init函數的返回值。
l offset:標識地址的偏移量,范圍是0~255。
l len:標識字符串長度。
l w_string:標識寫入的數據。
(6)ic_exit函數
該函數用于關閉設備端口。語法如下:
public static extern int ic_exit(int icdev);
參數說明如下。
l icdev:標識設備句柄,通常是auto_init函數的返回值。
(7)dv_beep函數
該函數使讀卡器嗡鳴。語法如下:
public static extern int dv_beep(int icdev, int time);
參數說明如下。
l icdev:標識設備句柄,通常是auto_init函數的返回值。
l time:標識嗡鳴持續的時間,單位是10毫秒。
實現過程
(1)新建一個項目,命名為Ex13_05,默認窗體為Form1。
(2)在Form1窗體中,主要添加兩個Button控件,用于執行向卡中寫入數據和退出程序的操作,添加一個TextBox控件,將TextBox中數據寫入IC卡中。
(3)主要程序代碼。
將程序所使用的操作IC卡的函數,封裝在類IC中。代碼如下:
[StructLayout(LayoutKind.Sequential)]
public unsafe class IC
{
//對設備進行初始化
[DllImport("Mwic_32.dll", EntryPoint = "auto_init", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern int auto_init(int port, int baud);
//設備密碼格式
[DllImport("Mwic_32.dll", EntryPoint = "setsc_md", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern int setsc_md(int icdev, int mode);
//獲取設備當前狀態
[DllImport("Mwic_32.dll", EntryPoint = "get_status", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern Int16 get_status(int icdev, Int16* state);
//關閉設備通訊接口
[DllImport("Mwic_32.dll", EntryPoint = "ic_exit", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern int ic_exit(int icdev);
//使設備發出蜂鳴聲
[DllImport("Mwic_32.dll", EntryPoint = "dv_beep", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern int dv_beep(int icdev, int time);
//向IC卡中寫數據
[DllImport("Mwic_32.dll", EntryPoint = "swr_4442", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern int swr_4442(int icdev, int offset, int len, char* w_string);
//核對卡密碼
[DllImport("Mwic_32.dll", EntryPoint = "csc_4442", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)]
public static extern Int16 Csc_4442(int icdev, int len, [MarshalAs(UnmanagedType.LPArray)] byte[] p_string);
}
下面代碼主要用于將TextBox中數據寫入到IC卡中。代碼如下:
private void button1_Click(object sender, EventArgs e)
{
//初始化
int icdev = IC.auto_init(0, 9600);
if (icdev < 0)
MessageBox.Show("端口初始化失敗,請檢查接口線是否連接正確。","錯誤提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
int md = IC.setsc_md(icdev, 1); //設備密碼格式
unsafe
{
Int16 status = 0;
Int16 result = 0;
result = IC.get_status(icdev, &status);
if (result != 0)
{
MessageBox.Show("設備當前狀態錯誤!");
int d1 = IC.ic_exit(icdev); //關閉設備
return;
}
if (status != 1)
{
MessageBox.Show("請插入IC卡");
int d2 = IC.ic_exit(icdev); //關閉設備
return;
}
}
unsafe
{
//卡的密碼默認為6個f(密碼為:ffffff),1個f的16進制是15,兩個f的16進制是255
byte[] pwd = new byte[3] { 255, 255, 255 };
//byte[] pwd = new byte[3] { 0xff, 0xff, 0xff };
//char[] pass=new ch{0xff,0xff,0xff};
Int16 checkIC_pwd = IC.Csc_4442(icdev, 3, pwd);
if (checkIC_pwd < 0)
{
MessageBox.Show("IC卡密碼錯誤!");
return;
}
char str = 'a';
int write=-1;
for (int j = 0; j < textBox1.Text.Length; j )
{
str = Convert.ToChar(textBox1.Text.Substring(j, 1));
write = IC.swr_4442(icdev, 33 j, textBox1.Text.Length, &str);
}
if (write == 0)
{
int beep = IC.dv_beep(icdev, 20); //發出蜂鳴聲
MessageBox.Show("數據已成功寫入IC卡中!");
}
else
MessageBox.Show("數據寫入IC卡失敗!");
}
int d = IC.ic_exit(icdev); //關閉設備
}
舉一反三
根據本實例,讀者可以實現以下功能。
在圖書借閱中使用IC卡。
利用IC卡控制上網。
實例423 讀取IC卡中的數據
實例說明
向IC卡寫入數據后,就可以進行讀卡操作了。運行本例,將寫入數據的IC卡插入讀卡器,單擊【讀卡】按鈕,IC卡中的數據將顯示在文本框中。如圖13.7所示。
技術要點
本例中主要調用srd_4442函數讀取IC卡中的數據,相關函數介紹請參考實例“向IC卡中寫入數據”中的“技術要點”部分。這里只介紹讀卡函數。
q srd_4442函數
該函數用于讀取IC卡中的數據。語法如下:
public static extern int srd_4442(int icdev, int offset, int len, char* r_string);
參數說明如下。
l icdev:標識設備句柄,通常是auto_init函數的返回值。
l offset:標識地址的偏移量,范圍是0~255。
l len:標識字符串長度。
l r_string:用于存儲返回的數據。
實現過程
(1)新建一個項目,命名為Ex13_06,默認窗體為Form1。
(2)在Form1窗體中,主要添加兩個Button控件,用于讀取卡中的數據和退出程序,添加一個TextBox控件,顯示卡中的數據。
(3)主要程序代碼。
private void button1_Click(object sender, EventArgs e)
{
//初始化
int icdev = IC.auto_init(0, 9600);
if (icdev < 0)
MessageBox.Show("端口初始化失敗,請檢查接口線是否連接正確。", "錯誤提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
int md = IC.setsc_md(icdev, 1); //設備密碼格式
int i = IC.dv_beep(icdev, 10); //發出蜂鳴聲
unsafe
{
Int16 status = 0;
Int16 result = 0;
result = IC.get_status(icdev, &status);
if (result != 0)
{
MessageBox.Show("設備當前狀態錯誤!");
int d1 = IC.ic_exit(icdev); //關閉設備
return;
}
if (status != 1)
{
MessageBox.Show("請插入IC卡");
int d2 = IC.ic_exit(icdev); //關閉設備
return;
}
}
unsafe
{
char str = 'a';
int read = -1;
for (int j = 0; j < 6; j )
{
read = IC.srd_4442(icdev, 33 j, 1, &str);
textBox1.Text = textBox1.Text Convert.ToString(str);
}
if (read == 0)
MessageBox.Show("IC卡中數據讀取成功!");
}
int d = IC.ic_exit(icdev); //關閉設備
}
舉一反三
根據本實例,讀者可以開發以下程序。
讀取IC卡電話系統。
公交車刷卡系統。
實例424 利用IC卡制作考勤程序
實例說明
IC卡廣泛應用于各行業,包括銀行卡、公交車刷卡系統、讀書卡等。下面介紹使用IC卡制作簡單的公司考勤系統。運行本例,單擊【刷卡】按鈕,即可對員工進行考勤。實現效果如圖13.8所示。
技術要點
有關IC卡的操作函數請參考實例“向IC卡中寫入數據”和“讀取IC卡中的數據”中的“技術要點”部分。
下面主要介紹通過IC卡如何實現員工考勤。主要將寫入IC卡中的卡號讀取出來,然后從數據表中查詢員工信息。具體代碼請參考實現過程。
實現過程
(1)新建一個項目,命名為Ex13_07,默認窗體為Form1。
(2)在Form1窗體中,主要添加5個TextBox控件和6個Label控件,用途如圖13.7所示,添加一個Button控件,執行刷IC卡命令。
(3)主要程序代碼。
private void button1_Click(object sender, EventArgs e)
{
//初始化
int icdev = IC.auto_init(0, 9600);
if (icdev < 0)
label6.Text = "端口初始化失敗,請檢查接口線是否連接正確。";
unsafe
{
Int16 status = -1;
Int16 result = IC.get_status(icdev, &status);
int md = IC.setsc_md(icdev, 1); //設備密碼格式
if (result < 0)
{
int d1 = IC.ic_exit(icdev); //關閉設備
return;
}
else if ((result == 0) && (status == 0))
{
int d2 = IC.ic_exit(icdev); //關閉設備
label6.Text = "請插入IC卡";
return;
}
}
unsafe
{
char str = 'a';
int read = -1;
string ic = "";
for (int j = 0; j < 6; j )
{
read = IC.srd_4442(icdev, 33 j, 1, &str);
ic = ic Convert.ToString(str);
}
textBox1.Text = ic;
if (read == 0)
label6.Text = "刷卡成功!";
int beep = IC.dv_beep(icdev, 20); //發出蜂鳴聲
int d3 = IC.ic_exit(icdev); //關閉設備
}
int d = IC.ic_exit(icdev); //關閉設備
//根據卡號,查找相應數據
OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" "price.mdb" ";Persist Security Info=False");
OleDbDataAdapter dap = new OleDbDataAdapter("select * from worker where ICID='" textBox1.Text "'", con);
DataSet ds = new DataSet();
dap.Fill(ds, "table");
if (ds.Tables.Count > 0)
{
textBox2.Text = ds.Tables[0].Rows[0][0].ToString();
textBox3.Text = ds.Tables[0].Rows[0][1].ToString();
textBox4.Text = ds.Tables[0].Rows[0][2].ToString();
textBox5.Text = ds.Tables[0].Rows[0][3].ToString();
}
else
{
label6.Text = "不存在該用戶!";
}
}
代碼片段和文件信息
- 上一篇:計算器的實現
- 下一篇:窗體傳值FormToValue
評論
共有 條評論