C#智能卡串口介绍

时间:2016-02-21 11:36:03

标签: c# serial-port smartcard

智能卡读卡器出现问题。 Reader通过Usb-to-serial转换器连接到pc。无法从读者那里读到任何东西。

...
    static void Main(string[] args)
    {
        byte[] data = new byte[256];
        byte[] recived = new byte[256];
        data[0] = 0x00;
        data[1] = 0xA4;
        data[2] = 0x04;
        data[3] = 0x00;
        data[4] = 0x00;
        data[5] = 0x00;
        data[6] = 0x00;
        System.IO.Ports.SerialPort sp = new System.IO.Ports.SerialPort("COM4", 38400, System.IO.Ports.Parity.None, 8, System.IO.Ports.StopBits.One);
        sp.WriteTimeout = 300;
        sp.ReadTimeout = 300;
        sp.DataReceived += Sp_DataReceived;
        sp.ErrorReceived += Sp_ErrorReceived;
        if (sp.IsOpen)
        {sp.Close();}
        sp.Open();
        try {
            sp.Write(data, 0, 7);
            int bt = sp.ReceivedBytesThreshold;
            sp.Read(recived, 0, bt);
            if (bt != 0)
            {   Console.WriteLine(bt.ToString());
                Console.ReadKey();}
        } catch (Exception ex){
            Console.WriteLine(ex.Message);
            Console.ReadKey();}    
    }
    private static void Sp_ErrorReceived(object sender, System.IO.Ports.SerialErrorReceivedEventArgs e)
    {Console.ReadKey();}
    private static void Sp_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {Console.ReadKey();}
}

}

代码不执行任何操作,就好像系统中没有读卡器一样。

1 个答案:

答案 0 :(得分:0)

好吧,首先,在向读者发送内容后,您将附加事件处理程序。这不好。我建议完全初始化SerialPort实例(设置,附加事件等)和之后,打开连接并进行通信。

您的应用程序也不会等待。如果使用异步通信(通过定义DataReceived事件),则需要确保应用程序实际循环并等待

您的控制台应用程序不会这样做。它将某些内容写入串行端口,然后在退出Main方法时退出。如果您希望得到答案,您需要决定:

  1. 使用调用方法的同步方式从串口实际阻止/读取
  2. 在开始时使用异步方式,但随后在不阻塞任何线程的情况下运行应用程序。
  3. 请:不要把两者混在一起!我看到很多代码,DataReceived中的人写了一个循环,因为他们不能一次性获取所有信息。不要那样做。而是构建一个缓冲区并检查它是否完整传输。 Read中没有DataReceived

    以下代码可能有效。它不会实现异步变体,而是阻塞,同步方法:

    static void Main(string[] args)
    {
        byte[] data = new byte[256];
        byte[] recived = new byte[256];
        data[0] = 0x00;
        data[1] = 0xA4;
        data[2] = 0x04;
        data[3] = 0x00;
        data[4] = 0x00;
        data[5] = 0x00;
        data[6] = 0x00;
    
        using (System.IO.Ports.SerialPort sp = new System.IO.Ports.SerialPort("COM4", 38400, System.IO.Ports.Parity.None, 8, System.IO.Ports.StopBits.One))
        {
            try 
            {
                sp.Open();
    
                sp.Write(data, 0, 7);
    
                int bytesRead = sp.Read(recived, 0, received.Length);
                if (bytesRead != 0)
                {
                    string s = Encoding.ASCII.GetString(received, 0, bytesRead);
                    Console.WriteLine(s);
                    Console.ReadKey();
                }
            } 
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.ReadKey();
            } 
        }   
    }
    

    如果 在控制台上没有显示任何结果,则可能有多种错误原因,包括:

    1. 错误的COM配置(BAUD率等是否正确?)
    2. 错误的串口(你有多个吗?)
    3. 设备无法按您的想法传达(您发送的命令是正确的吗?)
    4. 等。