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);
           
        }
    }

解决方案 »

  1.   

    我咨询了 啊 他说我们只负责硬件问题 测试DEMO能通过啊示例只有VB C等 就没
    c# 我说那你帮我做个示例呗 他说 呸 
    各位大大 谁看出问题没啊
      

  2.   

    除了demo,应该还有对应的调用方法说明的阿你问他们要一下
      

  3.   

    是啊(1)程序开始,调用rf_init()rf_init函数初始化串口。(2)寻卡,调用rf_card()rf_card;      相当于连续调用三个函数:rf_request()rf_requestrf_anticoll()rf_anticollrf_select()rf_select      注:调用高级函数对卡进行操作时,无需此步骤。
    我就在寻卡这里卡住了 我想卡能寻到 应该就好操作了 囧 愁死淫啊
      

  4.   

    第三个参数 ref uint _Snr 转成 unsigned long *_Snr 没问题吗?
      

  5.   

    你好 我是unsigned long *_Snr 转成ref uint _Snr 我想是不是因为这个方法要返回参数 所以导入DLL的时候 要先指定调用方式。。
      

  6.   

    [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);
      

  7.   

     引用应该是你这样的 谢谢玫瑰啦 但我第二个和第三参数是 unsigned char _Mode,unsigned long *_Snr 我用的是byte 和ref uint 这也是在网上找的 说 这两个这样对应 你应该做过类似的吧 像我要用到的这两个参数类型 我这样转行吗?还是返回1 这次应该是参数类型用错了 ^_^
      

  8.   

    你把 unsigned long *_Snr 改用为 [MarshalAs(UnmanagedType.LPArray)]byte[] 试试. 因为 unsigned long * 是变长的, 你用UINT可能不合适.
      

  9.   

    将你VB的DEMO的调用代码发上来看看
      

  10.   

    网络不号 刚打开贴。。 byte[]我也试过了 ULONG[]也试了 返回还是1 =失败 应该能返回成功的啊  [DllImport("mwrf32.dll", EntryPoint = "rf_card", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
            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);
      

  11.   

    复制错误 ULONG应该是byte 
      

  12.   

    Declare Function rf_card Lib "mwrf32.dll" (ByVal icdev As Long, ByVal mode%, Snr As Long) As Integer
      

  13.   

    Private 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 If 这个应该是VB 调用这个方法的时候 我又外行了既然只能连续回复3次 
      

  14.   

    [DllImport("mwrf32.dll", EntryPoint = "rf_card", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
            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传递的。
      

  15.   

     调用的时候 是这样用的吗  int snr = 0;
                int card = rf_card(icdev,0,ref snr);还是执行失败 顺便也试了下 ref unit 也不行返回1,0才成功 问了厂家 他说DLL是通用的 测试的程序能运行 那C#肯定也能通过。其他程序也关了 不会存在占用的情况
      

  16.   

       [DllImport("mwrf32.dll")] 
            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调用代码都贴出来看看
      

  17.   

     恩恩 弹出来的是0 不过我在GetLastWin32Error这个方法后面加了() _init()执行成功了啊 骚等啊 你别激动 我来贴VB代码 你看下22楼 玫瑰大哥给的参考贴 和我类似 但他说他照着改了下好了。但我没他那手气啊 改了也不行 囧
      

  18.   

    Private Sub Form_Load()
    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的 谢谢大家了哈 感觉快出来了就差那么一点点 囧
      

  19.   

    address = 9
    sector = 2
    cardmode = 1
    关键的没有啊,这三个参数定义成什么类型了?
    只能看出第1个,byval,第2,3个是byref的
      

  20.   

    st = rf_card(ByVal icdev, cardmode, Snr)
    还有st的类型定义
      

  21.   

    Dim address As Integer
    Dim sector As Integer
    Dim cardmode As Integer
     st 没找到 我再找找
      

  22.   

      End
          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() 竟然找不到定义的地方
      

  23.   


    晕了,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)
      

  24.   

    Int32 snr = 0;
                int card = rf_card(icdev,0, ref snr);
    定义的地方 照你的改了 我这样调用的 还是不行 晕了 还是不行http://topic.csdn.net/u/20091222/15/742ABEA3-FD3D-4DD1-A36D-69AB26C259E0.html 这个贴不知道怎么弄好的 我照他那样改了也不行
      

  25.   


    那个贴里是改成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,结果是什么?
      

  26.   

    因为执行失败 返回1 所以结果 两个都是0 和new出来的时候一样, 不是一个库啊 必须要改成3个参数吧 我把后面那个参数去掉 也不行
      

  27.   

    把DLL对应的.h头文件贴上来看看?难道不是同一个DLL?
    你最好提供个下载地址
      

  28.   

    是一个啊 通用的DLL 在代码里面 引用这个DLL的时候 指明了这个DLL--mwrf32.dll
      

  29.   

    现在上不了,你上传到CSDN的下载空间,再发个链接过来
      

  30.   

    http://download.csdn.net/source/2106741这是资源链接  麻烦了哈 亲个 恩啊~
      

  31.   


    <marquee behavior=alternate>回复</marquee>
      

  32.   

    [DllImport("mwrf32.dll", EntryPoint = "rf_card", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)] 
            public static extern int rf_card(int icdev, byte mode, ref uint _Snr);从C的code中看声明方式这样就可以了
    你确定rf_init调用成功了吗?
      

  33.   

      [DllImport("mwrf32.dll")]
              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里面的方法参数了 试了好多呀 好多呀 都不行呀 不行呀 
      

  34.   

    确定成功了啊 那个贴也是 rf_init成功了 rf—card不行 好像试过你刚才贴出的代码 我再试试下
      

  35.   

    最开始就是这样用的
    public static extern int rf_card(int icdev, byte mode, ref uint _Snr); 
     uint _Snr = 0;
                int card = rf_card(icdev,0,ref _Snr);
    之后也换了好多类型 都不报错 只是返回失败 
      

  36.   

    如果可以你试试VB的或C的代码调用后_Snr的值是什么?我没办法调试啊
      

  37.   

     也对 我去重装下vs08里面有VB。net 试试看 呵 
      

  38.   

    你运行DemoRF4.05看是否可以得到SN?
      

  39.   

    我运行的VC6.0里面的代码 sn=2795770699
      

  40.   

    unsigned int *TagType c#中 应该是 ref uint TagType吧
      

  41.   

    (2)寻卡,调用rf_card()rf_card;      相当于连续调用三个函数:rf_request()rf_requestrf_anticoll()rf_anticollrf_select()
    int rf_request(int icdev,unsigned char _Mode,unsigned int *TagType);功 能:寻卡请求参 数:icdev:通讯设备标识符       _Mode:寻卡模式mode_card       Tagtype:卡类型值,0x0004为M1卡,0x0010为ML卡
    我换种方法也不行 第一个方法就返回失败
      

  42.   

    首先 snr 要定义为 long 变量  REF 传入  才可以获得 序列号  其次 很重要的一点 你没做 在你设置了
    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个函数 分别为重置 请求  防冲突  选卡(寻卡)
      

  43.   

    [DllImport("mwrf32.dll", EntryPoint = "rf_init", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
            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");
      

  44.   

    http://topic.csdn.net/t/20060406/12/4667154.html  [DllImport("mwrf32.dll")]   
      public   static   extern   short   rf_card(int   icdev,   int   mode,   ref   int   Snr);   
        
      调用:   
        
      int   cardmode=1;   
        
      retcode   =   CRF35.rf_card(icdev,   cardmode,ref   Snrl);
      

  45.   

    哥们,我也遇到过这样的问题, 现在正瞅着呢!   用VC++写出来的完全正确, 用C#.net写出来的比用VC++提取的字节要长一倍,   哥们你现在解决了吗?
      

  46.   

    <code>
    函数原型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>
      

  47.   

    明华的IC卡吧..
    试下:
            [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);