非接触式的ID卡刷卡  在VB中有一个控件可以实现 但用到C#里面 有一点不方便 还要注册那个控件  想单纯的用C#来实现 用C#封装的类库  希望大家给点建议和资料    刷卡的时候把读到的数字放到一个textbox里面 是winform程序 相关的就是往ID卡里面写数据了  先谢过了  

解决方案 »

  1.   

    没有手册   看了看VB 的MSCOMM32.OCX这个控件  只是得注册 想找找别的办法 请大虾指教
      

  2.   

    MSCOMM32.OCX这个控件 在C#中就是SerialPort控件,也就是串口通信,如果你用的是VS2005或VS2008,你会在控件列表中找到它,直接拖到界面上,具体使用方法请搂主自己查看MSDN,有问题可以给我发邮件:[email protected].
      

  3.   

    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()去掉也是一个效果  怎么解释?
      

  4.   


       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();
            }    }
    }
    这样也不行 期待大虾指点,,....
      

  5.   

    思路完全反了,首先你要明白你的程序是用来读ID卡里的资料的,比如是ID号码,姑且你把ID卡读卡器看做是一个下位机,你现在要做的就是上位机和下位机的串口通讯。个人理解这个流程是这样的。在用户使用ID卡刷卡时下位机会开始动作(我们不知道它是怎样工作的,也不需要知道),读卡器在读出ID号码后会向上位机通过串口发出指令,上位机监视串口缓冲区中是否有数据进来,如果有则读进来,读多少个字节你要看读卡器的通许协议,在C#中你可以使用SerialPort的DataReceiving事件来监控是否有数据进来,然后使用SerialPort的ReadLine方法来读取缓冲区里的数据,读回来的数据怎么处理就看你自己的需要了。另外TextBox有一个Focurs的方法可以用来让控件获得焦点,请楼主仔细查看MSDN文档。
      

  6.   

      sp.WriteLine(this.textBox1.Text);
      textBox2.Text = sp.ReadLine();
    sp.WriteLine(this.textBox1.Text);这句不是把读取的数据流放到textBox1.Text里面了吗
    然后我调用ReadLine()方法把数据读出来并放到textBox2.Text里面` 就是没行`没有反应~第二句不写也没有关系` 控件有焦点就能把数据显示出来`如果没有焦点的话怎么写都不行` 小弟是第一次弄这样的程序~很晕`不太理解~大虾明示啊~ 急死了` 试了好几天了`不会   
      

  7.   

    textBox2.Text= this.serialPort.ReadLine().ToString();
      

  8.   


    提示com口被关闭 打开了也不行~ 没有焦点还是刷不上去
      

  9.   


      // 将textBox1中的文本写到串口。
      sp.WriteLine(this.textBox1.Text);   // 从串口中读取数据,并将它显示到textBox2中。
      textBox2.Text = sp.ReadLine();
    建议楼主买一本《C#入门经典》认认真真从头看起,否则就算你提出问题,被人也不知道你在说什么。
      

  10.   

    是的,我看了一下,没有怎么懂,我写过写卡和读卡的程序,不过这些都是机器带的驱动。实际上,只要获取到卡的资料就好了,非接触读卡也是有驱动的,没有焦点的时候强制给一个赋值就好,当打开程序时候,onload可以制定一个焦点。
      

  11.   

    你的思路完全不正确!
    应该像gaoqi9902 学习
    打开串口后,你应该不断的监听是否有数据传输过来!因为你不知道用户什么时候会读卡,即使你知道现在在读卡,读卡和数据传输也需要一段时间,所以你必须不断的监听串口,通过的方法是使用循环语句。
    当你接收到数据后(待数据接收完整),再将数据赋值给控件!
      

  12.   

    急啊 哪位大哥帮下忙啊 真的没有办法了~试了很多办法都不可以这样`我的代码放到了formLoad里面了~ 加载的时候就打开了com1 不知道应该怎么弄~第一次弄`一点思头绪都没有`大家这么一说 我更晕了~下载了C#入门精典在看呢 就想找到解决方法 先谢谢了啊
      

  13.   

    以前做过一款ID卡用作刷卡器:此款ID读卡器提供两个dll文件:IDUSB.DLL、OUR_IDR.dll
    楼主参考一下。
    http://blog.csdn.net/patrickpan/archive/2008/09/02/2865235.aspx
      

  14.   

    SDK中一般都会提供DEMO,C++,C#,......
      

  15.   

    MSCOMM32.OCX这个控件 在C#中就是SerialPort控件,也就是串口通信,如果你用的是VS2005或VS2008,你会在控件列表中找到它,直接拖到界面上,
      

  16.   


    用的就是这个控件SerialPort  开始以为没焦点刷不上去`后来调试了一下才发现`  这个控件就没起作用 用上了倒有了负作用了(针对我写的代码来说)  我把这个控件删掉了以后  只要有焦点就可以刷上去`笑的我肚子疼~  这个是即插即用的那种ID卡  目前还没有很好的解决办法 还在找`希望大家给点意件
      

  17.   

    那你的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事件下面。
      

  18.   

    楼上的代码还是一样` 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分送上
      

  19.   


    你不是说不用SerialPort了吗?怎么到了最后还是用了?你到底有没有搞清楚你的ID读卡器是模拟键盘还是串口通信,搞清楚再说。