public partial class Form1 : Form
{
[DllImport("mwrf32.dll")]
public static extern int rf_init(int port, long baud);//功 能:初始化串口
[DllImport("mwrf32.dll")]
public static extern int rf_card(int icdev, byte _Mode, ref uint _Snr);//功 能:寻卡,能返回在工作区域内某张卡的序列号
[DllImport("mwrf32.dll")]
public static extern int rf_halt(int icdev);//功 能:中止对该卡操作
[DllImport("mwrf32.dll")]
public static extern int rf_request(int icdev, byte _Mode, ref uint TagType);
public int hqhuser32 = 0;
#region 构造方法连接函数库
//=================================================================
/// <summary>
/// IC卡构造函数装载函数库
/// </summary>
public Form1()
{
InitializeComponent();
}
#endregion
private void button1_Click(object sender, EventArgs e)
{
//第一步 功 能:初始化串口参 数:串口号,通讯波特率9600~115200
返 回:成功则返回串口标识符>0,失败返回负值,这个能成功返回正整数例如 1350
int icdev = rf_init(0,9600);
uint snr=0;
//第二步寻卡传入功 能:寻卡,能返回在工作区域内某张卡的序列号
参 数:icdev:通讯设备标识符_Mode:寻卡模式 0 一次对一张卡操作_Snr:返回的卡序列号
int rf_card(int icdev,unsigned char _Mode,unsigned long *_Snr);这是原方法
返 回:成功则返回 0 这里失败 返回1 但测试的demo 能通过 问了硬件开发方 说是我这边的问题
求指教 int card = rf_card(icdev,0,ref snr);
//uint Tagtype=0x0004;
//int request = rf_request(icdev, 0, ref Tagtype);
int halt=rf_halt(icdev);
}
}
{
[DllImport("mwrf32.dll")]
public static extern int rf_init(int port, long baud);//功 能:初始化串口
[DllImport("mwrf32.dll")]
public static extern int rf_card(int icdev, byte _Mode, ref uint _Snr);//功 能:寻卡,能返回在工作区域内某张卡的序列号
[DllImport("mwrf32.dll")]
public static extern int rf_halt(int icdev);//功 能:中止对该卡操作
[DllImport("mwrf32.dll")]
public static extern int rf_request(int icdev, byte _Mode, ref uint TagType);
public int hqhuser32 = 0;
#region 构造方法连接函数库
//=================================================================
/// <summary>
/// IC卡构造函数装载函数库
/// </summary>
public Form1()
{
InitializeComponent();
}
#endregion
private void button1_Click(object sender, EventArgs e)
{
//第一步 功 能:初始化串口参 数:串口号,通讯波特率9600~115200
返 回:成功则返回串口标识符>0,失败返回负值,这个能成功返回正整数例如 1350
int icdev = rf_init(0,9600);
uint snr=0;
//第二步寻卡传入功 能:寻卡,能返回在工作区域内某张卡的序列号
参 数:icdev:通讯设备标识符_Mode:寻卡模式 0 一次对一张卡操作_Snr:返回的卡序列号
int rf_card(int icdev,unsigned char _Mode,unsigned long *_Snr);这是原方法
返 回:成功则返回 0 这里失败 返回1 但测试的demo 能通过 问了硬件开发方 说是我这边的问题
求指教 int card = rf_card(icdev,0,ref snr);
//uint Tagtype=0x0004;
//int request = rf_request(icdev, 0, ref Tagtype);
int halt=rf_halt(icdev);
}
}
c# 我说那你帮我做个示例呗 他说 呸
各位大大 谁看出问题没啊
我就在寻卡这里卡住了 我想卡能寻到 应该就好操作了 囧 愁死淫啊
//说明: 向指定地址写数据
//调用: icdev: 通讯设备标识符 mode: 寻卡模式
//_Snr: 返回序列号 _Snrlen: 序列号长度
//返回: <0 错误 =0 正确
public static extern Int16 rf_card(int icdev, Int16 mode, [MarshalAs(UnmanagedType.LPArray)]byte[] _Snr, [MarshalAs(UnmanagedType.LPArray)]byte[] _Snrlen);
public static extern int rf_card(int icdev, byte mode, [MarshalAs(UnmanagedType.LPArray)]ulong[] _Snr);//, [MarshalAs(UnmanagedType.LPArray)]byte[] _Snrlen
byte[] snr = new byte[2];
int card = rf_card(icdev,0,snr);
address = 9
sector = 2
cardmode = 1
st = rf_card(ByVal icdev, cardmode, Snr)
If st <> 0 Then
M1_label.Caption = "Call rf_card() error. Exit!"
Exit Sub
End If 这个应该是VB 调用这个方法的时候 我又外行了既然只能连续回复3次
public static extern int rf_card(int icdev, ref byte mode, ref int _Snr);//, [MarshalAs(UnmanagedType.LPArray)]byte[] _Snrlen
int card = rf_card(icdev,0,snr);vb里面第2,3个参数都是用的ref传递的。
int card = rf_card(icdev,0,ref snr);还是执行失败 顺便也试了下 ref unit 也不行返回1,0才成功 问了厂家 他说DLL是通用的 测试的程序能运行 那C#肯定也能通过。其他程序也关了 不会存在占用的情况
public static extern int rf_init(int port, long baud);//功 能:初始化串口 初始化成功了吗?baud用int就可以了啊。int snr = 0;
int mode=0
int card = rf_card(icdev,ref mode,ref snr);
MessageBox.Show(System.Runtime.InteropServices.Marshal.GetLastWin32Error.ToString());这样再试试。顺便看看弹出来的error code是不是0你把DLL中几个函数的VB调用代码都贴出来看看
icdev = -1
End SubPrivate Sub Form_Unload(Cancel As Integer)
quit
End SubPrivate Sub M1_comm_Click()
address = 9
sector = 2
cardmode = 1
st = rf_card(ByVal icdev, cardmode, Snr)
If st <> 0 Then
M1_label.Caption = "Call rf_card() error. Exit!"
Exit Sub
End Ifloadmode = 0
sector = 4
st = rf_authentication(ByVal icdev, loadmode, sector)
If st <> 0 Then
M1_label.Caption = "Call rf_authentication() error.Exit!"
Exit Sub
End If
data32 = "1234567890abcdef1234567890abcdef"
st = rf_write_hex(ByVal icdev, address, ByVal data32)
If st <> 0 Then
M1_label.Caption = "Call rf_write_hex() error.Exit!"
Exit Sub
End Ifst = rf_check_writehex(ByVal icdev, Snr, loadmode, address, data32)
If st <> 0 Then
M1_label.Caption = "Call rf_check_writehex() error.Exit!"
Exit Sub
End Ifst = rf_read_hex(ByVal icdev, address, databuff32)
If st <> 0 Then
M1_label.Caption = "Call rf_read_hex error.Exit!"
Exit Sub
End If'Modify the keys and some control bits
'Keep the following paramerters and keys same as the default
akey(0) = &HA0
akey(1) = &HA1
akey(2) = &HA2
akey(3) = &HA3
akey(4) = &HA4
akey(5) = &HA5bkey(0) = &HB0
bkey(1) = &HB1
bkey(2) = &HB2
bkey(3) = &HB3
bkey(4) = &HB4
bkey(5) = &HB5st = rf_changeb3(ByVal icdev, 2, akey(0), 0, 0, 0, 1, 0, bkey(0))
If st <> 0 Then
M1_label.Caption = "Call rf_changeb3() error.exit!"
Exit Sub
End If'Value Operation
wvalue = 10000
st = rf_initval(ByVal icdev, address + 1, ByVal wvalue)
If st <> 0 Then
M1_label.Caption = "Call rf_initval() error.Exit!"
Exit Sub
End If
我贴一段吧 长了 怕看着晕 测试代码 估计没硬件 里面的参数设置都是乱搞的 0啊1的 谢谢大家了哈 感觉快出来了就差那么一点点 囧
sector = 2
cardmode = 1
关键的没有啊,这三个参数定义成什么类型了?
只能看出第1个,byval,第2,3个是byref的
还有st的类型定义
Dim sector As Integer
Dim cardmode As Integer
st 没找到 我再找找
End
End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit
Dim akey(6) As Byte
Dim bkey(6) As Byte
Dim hexkey As String * 12
Dim displaydata(8) As Byte
Dim eepromdata As String * 32
Dim hardver As String * 20
Dim libver As String * 16
Dim ser As String * 16
Dim Snr As Long
Dim Rsnr As Long
Dim data16 As String * 16
Dim data32 As String * 32
Dim databuff32 As String * 32
Dim databuff16 As String * 16
Dim rvalue As Long
Dim wvalue As Long
Dim mlrvalue As Integer
Dim mlwvalue As Integer
Dim cardmode As Integer
Dim loadmode As Integer
Dim sector As Integer
Dim address As Integer
Dim ptrdest As String * 16
Dim ptrsource As String * 16
Dim time As String * 14
Dim timebuff As String * 14
Private Sub Form_Load() 竟然找不到定义的地方
晕了,vb里面Integer是16位的数据,Long是32位的数据,Integer对应在C#中改为int16,Long对应为int32对应Declare Function rf_card Lib "mwrf32.dll" (ByVal icdev As Long, ByVal mode%, Snr As Long) As Integer
改为
[DllImport("mwrf32.dll", EntryPoint = "rf_card", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
public static extern Int16 rf_card(int icdev, int16 mode, ref Int32 _Snr)
int card = rf_card(icdev,0, ref snr);
定义的地方 照你的改了 我这样调用的 还是不行 晕了 还是不行http://topic.csdn.net/u/20091222/15/742ABEA3-FD3D-4DD1-A36D-69AB26C259E0.html 这个贴不知道怎么弄好的 我照他那样改了也不行
那个贴里是改成4个参数的
[DllImport("mwpd_32.dll", EntryPoint = "rf_card", SetLastError = true,
CharSet = CharSet.Auto, ExactSpelling = false,
CallingConvention = CallingConvention.StdCall)]
//说明: 向指定地址写数据
//调用: icdev: 通讯设备标识符 mode: 寻卡模式
// _Snr: 返回序列号 _Snrlen: 序列号长度
//返回: <0 错误 =0 正确
public static extern Int16 rf_card(int icdev, Int16 mode, [MarshalAs(UnmanagedType.LPArray)]byte[] _Snr, [MarshalAs(UnmanagedType.LPArray)]byte[] _Snrlen);你将_Snr和_Snrlen的长度定义为2,结果是什么?
你最好提供个下载地址
<marquee behavior=alternate>回复</marquee>
public static extern int rf_card(int icdev, byte mode, ref uint _Snr);从C的code中看声明方式这样就可以了
你确定rf_init调用成功了吗?
public static extern Int16 rf_card(int icdev, Int16 mode, [MarshalAs(UnmanagedType.LPArray)]byte[] _Snr);
byte[] _snr = new byte[2];
Int16 card = rf_card(icdev,0, _snr);可以肯定 [DllImport("mwrf32.dll")]这句没错 返回0、1的card类型应该不影响 就看rf_card里面的方法参数了 试了好多呀 好多呀 都不行呀 不行呀
public static extern int rf_card(int icdev, byte mode, ref uint _Snr);
uint _Snr = 0;
int card = rf_card(icdev,0,ref _Snr);
之后也换了好多类型 都不报错 只是返回失败
int rf_request(int icdev,unsigned char _Mode,unsigned int *TagType);功 能:寻卡请求参 数:icdev:通讯设备标识符 _Mode:寻卡模式mode_card Tagtype:卡类型值,0x0004为M1卡,0x0010为ML卡
我换种方法也不行 第一个方法就返回失败
int icdev = rf_init(0,9600); 波特率之后 需要选卡 设备说明那里有 你不选卡的话 设备是不知道你要获取的是哪张卡的 …st = rf_reset(icdev,5);
st = rf_request(icdev,1,&TagType);
st = rf_anticoll(icdev,0, &Snr);
st = rf_select(icdev,Snr,&Size);用到上面4个函数 分别为重置 请求 防冲突 选卡(寻卡)
public static extern int rf_init(int port, int baud);
[DllImport("mwrf32.dll", EntryPoint = "rf_card", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern int rf_card(int icdev, byte mode, ref UInt64 snr);使用:
int icdev = 0;
byte iMode = 1;
UInt64 uValue = 0;
icdev = rf_init(0, 115200);
rf_card(icdev, iMode, ref uValue);
string strCardID=uValue.ToString("X");
public static extern short rf_card(int icdev, int mode, ref int Snr);
调用:
int cardmode=1;
retcode = CRF35.rf_card(icdev, cardmode,ref Snrl);
函数原型public static extern int rf_anticoll(byte _Bcnt, out uint _Sur);
uint snr = 0;
st = rf_anticoll(type, out snr);//得到UID值转换为16进制
string uid = Convert.ToString(snr, 16);
</code>
试下:
[DllImport("mwrf32.dll", EntryPoint = "rf_card", SetLastError = true,
CharSet = CharSet.Auto, ExactSpelling = false,
CallingConvention = CallingConvention.StdCall)]
public static extern Int16 rf_card(int icdev, int mode, [MarshalAs(UnmanagedType.LPArray)]byte[] snr); [DllImport("mwrf32.dll", EntryPoint = "hex_a", SetLastError = true,
CharSet = CharSet.Auto, ExactSpelling = false,
CallingConvention = CallingConvention.StdCall)]
public static extern Int16 hex_a([MarshalAs(UnmanagedType.LPArray)]byte[] hex, [MarshalAs(UnmanagedType.LPArray)]byte[] asc, int len);调用:
byte[] snr1 = new byte[5];
byte[] snr2 = new byte[8];
int cardState = Common.ICCard.rf_card(icdev, 1, snr1);//返回0正确
int hexState = Common.ICCard.hex_a(snr1, snr2, 4);//返回0正确
string cardSN = System.Text.Encoding.Default.GetString(snr2);