C#读取IC卡数据

mizuho_2006 2012-04-18 05:19:09
读卡器带的光盘上有用于开发的接口dll,其中有打开串口,寻卡,装载密码,验证,读卡,终止读卡,关闭串口的函数。

我想问的是,程序应该如何判断卡是否已经放到了读卡器上?(是非接触式的读卡器)

是在程序一启动就执行打开串口的函数,然后看DataReceieved事件是否被触发判断吗?但是它是自带的打开串口函数,处理都在内部的,打开成功后还要返回一个串口标识符。。还有,我在程序的Loaded事件里已经打开了另一个串口(不是用来读卡的),会不会和这个发生冲突?

有没有做过这方面程序的大侠指点一下啊。。
...全文
752 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
mizuho_2008 2012-04-19
  • 打赏
  • 举报
回复
问题解决了,SDK文档上写的参数值范围为0~3,其实我的串口是COM7,设置成6就好了。。
散分。。。
mizuho_2006 2012-04-19
  • 打赏
  • 举报
回复
我这样的思路对不对?

程序启动时打开串口,并且不停地寻卡,当寻卡函数返回值为true时认为IC卡已经放好了,就执行读卡函数。

不过我使用的不是C#本身的串口操作,是接口dll里提供的串口操作函数。

vfp2cs 2012-04-19
  • 打赏
  • 举报
回复
既然是串口,建议尝试不用开发包dll,就用微软的mscomm组件,很好用,不用timer,有OnComm事件主动报告读到的数据。
mizuho_2006 2012-04-19
  • 打赏
  • 举报
回复
晕,我刚试的把读卡器的线拔掉,还能用串口3(参数为2)并打开返回值为79。。。
mizuho_2006 2012-04-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
建议:轮询宜放在后台中运行,有读卡成功事件发生再做动作
[/Quote]

我的思路是初始化程序时打开串口,将寻卡函数放在一个定时器timer中,(如果串口已成功打开则)每秒寻卡一次。这么做会不会很耗内存呢?
changjiangzhibin 2012-04-19
  • 打赏
  • 举报
回复
建议:轮询宜放在后台中运行,有读卡成功事件发生再做动作
mizuho_2006 2012-04-19
  • 打赏
  • 举报
回复
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++;
}


ztenv 2012-04-19
  • 打赏
  • 举报
回复
这个序列号应该是出厂时就已经固化在卡里面的吧!还是要自己往卡里写呢?

这个要取决于你的IC卡是不是可写的,序列号这个东西如果不是破解,都是出厂固定的。

确认设备所接串口和你打开的串口是相同的然后再去调试。
mizuho_2006 2012-04-19
  • 打赏
  • 举报
回复
多谢高手指点。

接口没有提供类似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指令中止卡操作后,只有当该卡离开并再次进入操作区时,读写器才能够再次对它进行操作。

ztenv 2012-04-19
  • 打赏
  • 举报
回复
这种也可以,叫轮询式的,如果接口提供了上报的机制会更好,要具体的看sdk接口才知道
ztenv 2012-04-18
  • 打赏
  • 举报
回复
1、把串口当成文件来看,C#SerialPort提供了收到数据通知的功能
2、熟悉SDK的流程,然后再做工作,
baichangle 2012-04-18
  • 打赏
  • 举报
回复
DataReceieved事件是可以被触发判断的 当然前提是串口要一直开着 另使用不同的串口之间是不会有冲突的

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧