C#实现ID卡刷卡 非接触式的ID卡刷卡 在VB中有一个控件可以实现 但用到C#里面 有一点不方便 还要注册那个控件 想单纯的用C#来实现 用C#封装的类库 希望大家给点建议和资料 刷卡的时候把读到的数字放到一个textbox里面 是winform程序 相关的就是往ID卡里面写数据了 先谢过了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 没有手册 看了看VB 的MSCOMM32.OCX这个控件 只是得注册 想找找别的办法 请大虾指教 MSCOMM32.OCX这个控件 在C#中就是SerialPort控件,也就是串口通信,如果你用的是VS2005或VS2008,你会在控件列表中找到它,直接拖到界面上,具体使用方法请搂主自己查看MSDN,有问题可以给我发邮件:[email protected]. using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.IO.Ports;using System.Windows.Forms;namespace num{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } SerialPort sp = new SerialPort("com1", 9600, Parity.None, 8,StopBits.One); private void button4_Click(object sender, EventArgs e) { sp.Open(); if (this.textBox3.Text != "")//开始是this.textBox3.Text=="" 这又是为什么呢? { MessageBox.Show("请检查输入:"); } else { sp.WriteLine(this.textBox1.Text); //textBox2.Text = sp.ReadLine();啥意思? } } private void button5_Click(object sender, EventArgs e) { sp.Close(); } }}使用这些代码 有一点的小疑问 请大虾帮下忙解释一下 问题在上面的代码上注明了 还有就是 刷卡的时候必须有textBox有焦点 才能刷上去 看代码: sp.WriteLine(this.textBox1.Text); //textBox2.Text = sp.ReadLine();这里 我在窗体上放了 三个textbox 只要其中的任何一个有焦点都可以输入sp.WriteLine(this.textBox1.Text);中的textbox1没用?sp.readline()去掉也是一个效果 怎么解释? sp.WriteLine(this.textBox1.Text);这一句 如果运行后 光标在textBox1上 那么刷卡没有问题能刷上去 可是我点一下别的地方 当textBox1没有焦点的时候 刷卡就出错了 刷不上去不说 刷卡器一直响着 不一会儿程序就报错了 怎么才能在没有焦点的时候刷卡也能把卡上的ID号弄到textbox1里面啊 我是这样修改的using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.IO.Ports;using System.Windows.Forms;namespace num{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } private string str; SerialPort sp = new SerialPort("com1", 9600, Parity.None, 8,StopBits.One); private void button4_Click(object sender, EventArgs e) { sp.Open(); if (this.textBox3.Text != "")//开始是this.textBox3.Text=="" 这又是为什么呢? { MessageBox.Show("请检查输入:"); } else { sp.WriteLine(str); this.textBox1.Text=str; } } private void button5_Click(object sender, EventArgs e) { sp.Close(); } }}这样也不行 期待大虾指点,,.... 思路完全反了,首先你要明白你的程序是用来读ID卡里的资料的,比如是ID号码,姑且你把ID卡读卡器看做是一个下位机,你现在要做的就是上位机和下位机的串口通讯。个人理解这个流程是这样的。在用户使用ID卡刷卡时下位机会开始动作(我们不知道它是怎样工作的,也不需要知道),读卡器在读出ID号码后会向上位机通过串口发出指令,上位机监视串口缓冲区中是否有数据进来,如果有则读进来,读多少个字节你要看读卡器的通许协议,在C#中你可以使用SerialPort的DataReceiving事件来监控是否有数据进来,然后使用SerialPort的ReadLine方法来读取缓冲区里的数据,读回来的数据怎么处理就看你自己的需要了。另外TextBox有一个Focurs的方法可以用来让控件获得焦点,请楼主仔细查看MSDN文档。 sp.WriteLine(this.textBox1.Text); textBox2.Text = sp.ReadLine();sp.WriteLine(this.textBox1.Text);这句不是把读取的数据流放到textBox1.Text里面了吗然后我调用ReadLine()方法把数据读出来并放到textBox2.Text里面` 就是没行`没有反应~第二句不写也没有关系` 控件有焦点就能把数据显示出来`如果没有焦点的话怎么写都不行` 小弟是第一次弄这样的程序~很晕`不太理解~大虾明示啊~ 急死了` 试了好几天了`不会 textBox2.Text= this.serialPort.ReadLine().ToString(); 提示com口被关闭 打开了也不行~ 没有焦点还是刷不上去 // 将textBox1中的文本写到串口。 sp.WriteLine(this.textBox1.Text); // 从串口中读取数据,并将它显示到textBox2中。 textBox2.Text = sp.ReadLine();建议楼主买一本《C#入门经典》认认真真从头看起,否则就算你提出问题,被人也不知道你在说什么。 是的,我看了一下,没有怎么懂,我写过写卡和读卡的程序,不过这些都是机器带的驱动。实际上,只要获取到卡的资料就好了,非接触读卡也是有驱动的,没有焦点的时候强制给一个赋值就好,当打开程序时候,onload可以制定一个焦点。 你的思路完全不正确!应该像gaoqi9902 学习打开串口后,你应该不断的监听是否有数据传输过来!因为你不知道用户什么时候会读卡,即使你知道现在在读卡,读卡和数据传输也需要一段时间,所以你必须不断的监听串口,通过的方法是使用循环语句。当你接收到数据后(待数据接收完整),再将数据赋值给控件! 急啊 哪位大哥帮下忙啊 真的没有办法了~试了很多办法都不可以这样`我的代码放到了formLoad里面了~ 加载的时候就打开了com1 不知道应该怎么弄~第一次弄`一点思头绪都没有`大家这么一说 我更晕了~下载了C#入门精典在看呢 就想找到解决方法 先谢谢了啊 以前做过一款ID卡用作刷卡器:此款ID读卡器提供两个dll文件:IDUSB.DLL、OUR_IDR.dll楼主参考一下。http://blog.csdn.net/patrickpan/archive/2008/09/02/2865235.aspx SDK中一般都会提供DEMO,C++,C#,...... MSCOMM32.OCX这个控件 在C#中就是SerialPort控件,也就是串口通信,如果你用的是VS2005或VS2008,你会在控件列表中找到它,直接拖到界面上, 用的就是这个控件SerialPort 开始以为没焦点刷不上去`后来调试了一下才发现` 这个控件就没起作用 用上了倒有了负作用了(针对我写的代码来说) 我把这个控件删掉了以后 只要有焦点就可以刷上去`笑的我肚子疼~ 这个是即插即用的那种ID卡 目前还没有很好的解决办法 还在找`希望大家给点意件 那你的ID卡就是使用了USB的模拟键盘,就是相当于输入你卡的ID号后面加上一个回车符,正是由于有一个回车符,所有在你刷卡以后文本框就失去了焦点,你可以使用TexBox的KeyPress事件来看是否有回车符进来(ASCII 13), 如果有那么就认为TextBox中的文本就是ID卡号,这时候你就可以处理你的事务,结束后清空TextBox,在让TextBox获得焦点,下面是示例代码: private void txtIdInput_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == '\r') // 如果最后一个是回车符,则结束输入。 { txtIdDisplay.Text = txtIdInput.Text; // 显示到另外一个文本框中。 // TODO: 这你是你使用ID卡号码相关的业务代码。 txtIdInput.Text = string.Empty; // 清空第一个文本框。 txtIdInput.Focus(); // 第一个文本框重新获得焦点,等待ID开输入。 } }界面上有两个控件分别为:txtIdInput, txtIdDisplay, 一个是用来等待用户输入的,一个是用来显示的,注意代码是在txtIdInput的KeyPress事件下面。 楼上的代码还是一样` txtIdInput没有焦点的时候还是不行using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.IO.Ports;namespace ee{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) { byte[] data = Convert.FromBase64String(serialPort1.ReadLine()); textBox2.Text = Encoding.Unicode.GetString(data); serialPort1.Close(); MessageBox.Show("数据接收成功!", "系统提示"); } private void Form1_Load(object sender, EventArgs e) { serialPort1.PortName = "COM1"; serialPort1.BaudRate = 9600; serialPort1.Parity = Parity.None; serialPort1.DataBits = 8; serialPort1.StopBits = StopBits.One; serialPort1.RtsEnable = true; serialPort1.DtrEnable = true; serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.serialPort1_DataReceived); } private void button1_Click(object sender, EventArgs e) { serialPort1.Open(); byte[] data = Encoding.Unicode.GetBytes(textBox1.Text); string str = Convert.ToBase64String(data); serialPort1.WriteLine(textBox1.Text); MessageBox.Show("数据发送成功!", "系统提示"); } }}这样也不行 我的电脑是IBM T42 用的是USB线转换出来的ps键盘口 不知道哪个是COM1 哪个是COM2 还有波特率 不知道如果去获取` 郁闷 有谁能提供一份源代码吗? 实在想不出办法来了 100分送上 你不是说不用SerialPort了吗?怎么到了最后还是用了?你到底有没有搞清楚你的ID读卡器是模拟键盘还是串口通信,搞清楚再说。 c# 解析json出错 Dev GridControl能使用List<T>实现主从关系展示? 关于lock的问题 C#提取字符串并计算的问题 radiobutton如何实现单击跳转 dataset.select的问题 急救!!好象没动过代码,不知道动了什么,出了这个错误 求助delphi翻译为C#中struct的问题! C#程序中用到CString,要using什么东西? C# 自动备份数据库,不要用数据库维护计划。。 请问C# Winform用来存放大量文字的是什么控件? 安装包的制作
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.IO.Ports;
using System.Windows.Forms;namespace num
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
SerialPort sp = new SerialPort("com1", 9600, Parity.None, 8,StopBits.One);
private void button4_Click(object sender, EventArgs e)
{
sp.Open();
if (this.textBox3.Text != "")//开始是this.textBox3.Text=="" 这又是为什么呢?
{
MessageBox.Show("请检查输入:");
}
else
{
sp.WriteLine(this.textBox1.Text);
//textBox2.Text = sp.ReadLine();啥意思?
}
} private void button5_Click(object sender, EventArgs e)
{
sp.Close();
} }
}
使用这些代码 有一点的小疑问 请大虾帮下忙解释一下
问题在上面的代码上注明了 还有就是 刷卡的时候必须有textBox有焦点 才能刷上去 看代码:
sp.WriteLine(this.textBox1.Text);
//textBox2.Text = sp.ReadLine();这里 我在窗体上放了 三个textbox 只要其中的任何一个有焦点都可以输入
sp.WriteLine(this.textBox1.Text);
中的textbox1没用?
sp.readline()去掉也是一个效果 怎么解释?
sp.WriteLine(this.textBox1.Text);
这一句 如果运行后 光标在textBox1上 那么刷卡没有问题能刷上去 可是我点一下别的地方 当textBox1没有焦点的时候 刷卡就出错了 刷不上去不说 刷卡器一直响着 不一会儿程序就报错了 怎么才能在没有焦点的时候刷卡也能把卡上的ID号弄到textbox1里面啊 我是这样修改的using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.IO.Ports;
using System.Windows.Forms;namespace num
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private string str; SerialPort sp = new SerialPort("com1", 9600, Parity.None, 8,StopBits.One);
private void button4_Click(object sender, EventArgs e)
{
sp.Open();
if (this.textBox3.Text != "")//开始是this.textBox3.Text=="" 这又是为什么呢?
{
MessageBox.Show("请检查输入:");
}
else
{
sp.WriteLine(str);
this.textBox1.Text=str;
}
} private void button5_Click(object sender, EventArgs e)
{
sp.Close();
} }
}
这样也不行 期待大虾指点,,....
textBox2.Text = sp.ReadLine();
sp.WriteLine(this.textBox1.Text);这句不是把读取的数据流放到textBox1.Text里面了吗
然后我调用ReadLine()方法把数据读出来并放到textBox2.Text里面` 就是没行`没有反应~第二句不写也没有关系` 控件有焦点就能把数据显示出来`如果没有焦点的话怎么写都不行` 小弟是第一次弄这样的程序~很晕`不太理解~大虾明示啊~ 急死了` 试了好几天了`不会
提示com口被关闭 打开了也不行~ 没有焦点还是刷不上去
// 将textBox1中的文本写到串口。
sp.WriteLine(this.textBox1.Text); // 从串口中读取数据,并将它显示到textBox2中。
textBox2.Text = sp.ReadLine();
建议楼主买一本《C#入门经典》认认真真从头看起,否则就算你提出问题,被人也不知道你在说什么。
应该像gaoqi9902 学习
打开串口后,你应该不断的监听是否有数据传输过来!因为你不知道用户什么时候会读卡,即使你知道现在在读卡,读卡和数据传输也需要一段时间,所以你必须不断的监听串口,通过的方法是使用循环语句。
当你接收到数据后(待数据接收完整),再将数据赋值给控件!
楼主参考一下。
http://blog.csdn.net/patrickpan/archive/2008/09/02/2865235.aspx
用的就是这个控件SerialPort 开始以为没焦点刷不上去`后来调试了一下才发现` 这个控件就没起作用 用上了倒有了负作用了(针对我写的代码来说) 我把这个控件删掉了以后 只要有焦点就可以刷上去`笑的我肚子疼~ 这个是即插即用的那种ID卡 目前还没有很好的解决办法 还在找`希望大家给点意件
{
if (e.KeyChar == '\r') // 如果最后一个是回车符,则结束输入。
{
txtIdDisplay.Text = txtIdInput.Text; // 显示到另外一个文本框中。 // TODO: 这你是你使用ID卡号码相关的业务代码。 txtIdInput.Text = string.Empty; // 清空第一个文本框。
txtIdInput.Focus(); // 第一个文本框重新获得焦点,等待ID开输入。
}
}界面上有两个控件分别为:txtIdInput, txtIdDisplay, 一个是用来等待用户输入的,一个是用来显示的,注意代码是在txtIdInput的KeyPress事件下面。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;namespace ee
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte[] data = Convert.FromBase64String(serialPort1.ReadLine());
textBox2.Text = Encoding.Unicode.GetString(data);
serialPort1.Close();
MessageBox.Show("数据接收成功!", "系统提示"); } private void Form1_Load(object sender, EventArgs e)
{
serialPort1.PortName = "COM1";
serialPort1.BaudRate = 9600;
serialPort1.Parity = Parity.None;
serialPort1.DataBits = 8;
serialPort1.StopBits = StopBits.One;
serialPort1.RtsEnable = true;
serialPort1.DtrEnable = true;
serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.serialPort1_DataReceived);
} private void button1_Click(object sender, EventArgs e)
{
serialPort1.Open();
byte[] data = Encoding.Unicode.GetBytes(textBox1.Text);
string str = Convert.ToBase64String(data);
serialPort1.WriteLine(textBox1.Text);
MessageBox.Show("数据发送成功!", "系统提示");
}
}
}
这样也不行 我的电脑是IBM T42 用的是USB线转换出来的ps键盘口 不知道哪个是COM1 哪个是COM2 还有波特率 不知道如果去获取` 郁闷 有谁能提供一份源代码吗? 实在想不出办法来了 100分送上
你不是说不用SerialPort了吗?怎么到了最后还是用了?你到底有没有搞清楚你的ID读卡器是模拟键盘还是串口通信,搞清楚再说。