0

我有阅读器:Promag PCR-300FMU,USB(无手册,无 SDK)。

在此处输入图像描述

所以我照顾了winscard.dll上的文档

public List<string> ListReaders()
    {
        int ReaderCount = 0;
        List<string> AvailableReaderList = new List<string>();

        //Make sure a context has been established before 
        //retrieving the list of smartcard readers.
        retCode = Card.SCardListReaders(hContext, null, null, ref ReaderCount);
        if (retCode != Card.SCARD_S_SUCCESS)
        {
            MessageBox.Show(Card.GetScardErrMsg(retCode));
            //connActive = false;
        }

        byte[] ReadersList = new byte[ReaderCount];

        //Get the list of reader present again but this time add sReaderGroup, retData as 2rd & 3rd parameter respectively.
        retCode = Card.SCardListReaders(hContext, null, ReadersList, ref ReaderCount);
        if (retCode != Card.SCARD_S_SUCCESS)
        {
            MessageBox.Show(Card.GetScardErrMsg(retCode));
        }

        string rName = "";
        int indx = 0;
        if (ReaderCount > 0)
        {
            // Convert reader buffer to string
            while (ReadersList[indx] != 0)
            {

                while (ReadersList[indx] != 0)
                {
                    rName = rName + (char)ReadersList[indx];
                    indx = indx + 1;
                }

                //Add reader name to list
                AvailableReaderList.Add(rName);
                rName = "";
                indx = indx + 1;

            }
        }
        return AvailableReaderList;

    }

this.ListReaders() 发回给我 ==> 一件 ==> 通用 EMV 智能卡读卡器 0 ==> 这不是我的读卡器

这是我得到的 VID 和 PID

USB\VID_1667&PID_0005&MI_01\6&DE89751&0&0001 VID: 1667 PID: 0005 USB\VID_1667&PID_0005&MI_00\6&DE89751&0&0000 VID: 1667 PID: 0005 USB\VID_1667&PID:48_0005\PGM-T

        public static UsbDevice MyUsbDevice1;
    public static UsbDeviceFinder MyUsbFinder1 = new UsbDeviceFinder(1667, 0005);
    public static UsbDevice MyUsbDevice2;
    public static UsbDeviceFinder MyUsbFinder2 = new UsbDeviceFinder(Int32.Parse("1667", System.Globalization.NumberStyles.HexNumber), Int32.Parse("0005", System.Globalization.NumberStyles.HexNumber));

    static void Main(string[] args)
    {
        //GetAllVidAndPidOnPC();
        MyUsbDevice1 = UsbDevice.OpenUsbDevice(MyUsbFinder1);
        MyUsbDevice2 = UsbDevice.OpenUsbDevice(MyUsbFinder2);

    }

在 MyUsbDevice1 和 MyUsbDevice2 中始终为 NULL

你能帮助我吗 ?

4

1 回答 1

0

您的阅读器不是智能卡阅读器。你不能通过winscard使用它。

例如,您可以使用LibUsbDotNet库阅读它并以这种方式对其进行编码:

using System;
using System.Text;
using LibUsbDotNet;
using LibUsbDotNet.Main;

namespace Examples
{
internal class ReadPolling
{
    public static UsbDevice MyUsbDevice;

    #region SET YOUR USB Vendor and Product ID!

    public static UsbDeviceFinder MyUsbFinder = new UsbDeviceFinder(1234, 1);

    #endregion

    public static void Main(string[] args)
    {
        ErrorCode ec = ErrorCode.None;

        try
        {
            // Find and open the usb device.
            MyUsbDevice = UsbDevice.OpenUsbDevice(MyUsbFinder);

            // If the device is open and ready
            if (MyUsbDevice == null) throw new Exception("Device Not Found.");

            // If this is a "whole" usb device (libusb-win32, linux libusb-1.0)
            // it exposes an IUsbDevice interface. If not (WinUSB) the 
            // 'wholeUsbDevice' variable will be null indicating this is 
            // an interface of a device; it does not require or support 
            // configuration and interface selection.
            IUsbDevice wholeUsbDevice = MyUsbDevice as IUsbDevice;
            if (!ReferenceEquals(wholeUsbDevice, null))
            {
                // This is a "whole" USB device. Before it can be used, 
                // the desired configuration and interface must be selected.

                // Select config #1
                wholeUsbDevice.SetConfiguration(1);

                // Claim interface #0.
                wholeUsbDevice.ClaimInterface(0);
            }

            // open read endpoint 1.
            UsbEndpointReader reader = MyUsbDevice.OpenEndpointReader(ReadEndpointID.Ep01);


            byte[] readBuffer = new byte[1024];
            while (ec == ErrorCode.None)
            {
                int bytesRead;

                // If the device hasn't sent data in the last 5 seconds,
                // a timeout error (ec = IoTimedOut) will occur. 
                ec = reader.Read(readBuffer, 5000, out bytesRead);

                if (bytesRead == 0) throw new Exception(string.Format("{0}:No more bytes!", ec));
                Console.WriteLine("{0} bytes read", bytesRead);

                // Write that output to the console.
                Console.Write(Encoding.Default.GetString(readBuffer, 0, bytesRead));
            }

            Console.WriteLine("\r\nDone!\r\n");
        }
        catch (Exception ex)
        {
            Console.WriteLine();
            Console.WriteLine((ec != ErrorCode.None ? ec + ":" : String.Empty) + ex.Message);
        }
        finally
        {
            if (MyUsbDevice != null)
            {
                if (MyUsbDevice.IsOpen)
                {
                    // If this is a "whole" usb device (libusb-win32, linux libusb-1.0)
                    // it exposes an IUsbDevice interface. If not (WinUSB) the 
                    // 'wholeUsbDevice' variable will be null indicating this is 
                    // an interface of a device; it does not require or support 
                    // configuration and interface selection.
                    IUsbDevice wholeUsbDevice = MyUsbDevice as IUsbDevice;
                    if (!ReferenceEquals(wholeUsbDevice, null))
                    {
                        // Release interface #0.
                        wholeUsbDevice.ReleaseInterface(0);
                    }

                    MyUsbDevice.Close();
                }
                MyUsbDevice = null;

                // Free usb resources
                UsbDevice.Exit();

            }

            // Wait for user input..
            Console.ReadKey();
        }
    }
  }
}
于 2020-12-12T13:07:14.473 回答