读卡器带的光盘上有用于开发的接口dll,其中有打开串口,寻卡,装载密码,验证,读卡,终止读卡,关闭串口的函数。我想问的是,程序应该如何判断卡是否已经放到了读卡器上?(是非接触式的读卡器)是在程序一启动就执行打开串口的函数,然后看DataReceieved事件是否被触发判断吗?但是它是自带的打开串口函数,处理都在内部的,打开成功后还要返回一个串口标识符。。还有,我在程序的Loaded事件里已经打开了另一个串口(不是用来读卡的),会不会和这个发生冲突?有没有做过这方面程序的大侠指点一下啊。。

解决方案 »

  1.   

    DataReceieved事件是可以被触发判断的 当然前提是串口要一直开着 另使用不同的串口之间是不会有冲突的 
      

  2.   

    1、把串口当成文件来看,C#SerialPort提供了收到数据通知的功能
    2、熟悉SDK的流程,然后再做工作,
      

  3.   

    我这样的思路对不对?程序启动时打开串口,并且不停地寻卡,当寻卡函数返回值为true时认为IC卡已经放好了,就执行读卡函数。不过我使用的不是C#本身的串口操作,是接口dll里提供的串口操作函数。
      

  4.   

    这种也可以,叫轮询式的,如果接口提供了上报的机制会更好,要具体的看sdk接口才知道 
      

  5.   

    多谢高手指点。接口没有提供类似DataRecieved之类的功能,只能写在定时器里不停地去寻卡了。
    我现在已经在程序启动时成功打开串口,并且设置1秒钟寻一次卡。但是我又遇到了新的问题(对不起分数太少了,问题又这么多。。)
    SDK文档上写打开串口会返回一个串口标示符,将这个标示符作为寻卡函数的参数。
    然后寻卡函数执行成功会输出一个唯一的IC卡序列号。我调试程序得到的串口标示符为76,但是作为参数执行寻卡函数后怎么也得不到IC卡序列号,也就是说寻卡函数总是不能正确执行。
    这个序列号应该是出厂时就已经固化在卡里面的吧!还是要自己往卡里写呢?
    下面是SDK文档的一些内容int  Open_Device(int port,long baud);功 能:初始化串口参 数:port:串口号,取值为0~3       baud:为通讯波特率9600~115200返 回:成功则返回串口标识符>0,失败返回负值,见错误代码表   例:int icdev;       icdev=Open_Device(0,9600);//初始化串口1,波特率9600 如果是WIN32程序则icdev为设备句柄,见下例:       HANDLE icdev;       icdev=Open_Device(0,115200);       if(icdev<0)              MessageBox(“Open_Device error”);int rf_card(int icdev,unsigned char _Mode,unsigned long *_Snr);功 能:寻卡,能返回在工作区域内某张卡的序列号参 数:icdev:通讯设备标识符       _Mode:寻卡模式mode_card       _Snr:返回的卡序列号返 回:成功则返回 0   例:int st;       unsigned long snr;       st=rf_card(icdev,0,&snr);   注:选择IDLE模式,在对卡进行读写操作,执行rf_halt()rf_halt指令中止卡操作后,只有当该卡离开并再次进入操作区时,读写器才能够再次对它进行操作。
      

  6.   

    SDK文档上写的port:串口号,取值为0~3因为我也不知道到底要传几,只能一个个遍历看哪个能返回正数值(文档上说正数值是正确的返回值)。我试过,port参数用0~3以外的数值返回的都是负数,只有2能返回正数79。文档上只写了错误代码的含义,也不知道他返回的是什么意思。。然后我试了下,波特率竟然随便填一个数字也返回79,就算传负的波特率也是。。肯定是在打开串口的时候就出现问题了,不过不知道问题出在哪里。由于很少做和硬件有关的开发,不懂的地方比较多,还请高手多多指教。
    下面是我写的代码           bolIsSerialPortOpen = false;
               int cntOpenSerialPort = 0; //用于循环打开读卡器串口
                byte _Status = 0;            while (cntOpenSerialPort <= 3 && !bolIsSerialPortOpen) //串口号取值为0~3
                {
                    icDev = Open_Device(cntOpenSerialPort, 9600);                if (icDev > 0)
                    {
                        if (rf_get_status(icDev, ref _Status) == 0) //取得读写器硬件版本号,如“mwrf100_v3.0”
                        {
                            bolIsSerialPortOpen = true;    //串口已打开
                            rf_beep(icDev, 30);     //IC卡读卡器蜂鸣30毫秒
                        }
                    }
                    cntOpenSerialPort++;
                }
      

  7.   


    我的思路是初始化程序时打开串口,将寻卡函数放在一个定时器timer中,(如果串口已成功打开则)每秒寻卡一次。这么做会不会很耗内存呢?
      

  8.   

    既然是串口,建议尝试不用开发包dll,就用微软的mscomm组件,很好用,不用timer,有OnComm事件主动报告读到的数据。
      

  9.   

    问题解决了,SDK文档上写的参数值范围为0~3,其实我的串口是COM7,设置成6就好了。。
    散分