2016-02-21 9 views
-3

У вас есть проблемы со считывателем смарт-карт. Считыватель подключается к ПК через преобразователь Usb-to-Serial. Не читает ничего читателя.C# смарт-карты последовательный интерфейс

... 
    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

'sp.DataReceived + = Sp_PinChanged', похоже, не определен. Извините, но код должен, по крайней мере, скомпилировать, -1 для этого. –

+0

Сначала в последовательных портах диспетчера устройств проверьте, обнаружен ли ваш считыватель карт смарт-карт вашим компьютером. Вы уверены, что это в порту com4? Есть ли исключения? что происходит после выполнения кода на sp.Write ??? –

ответ

0

Ну, прежде всего, вы прикрепляете обработчики событий после, вы отправляете что-то читателю. Это не хорошо. Я рекомендую полностью инициализировать экземпляр SerialPort (настроить его, присоединить события и т. Д.) И только после этого, откройте соединение и сообщите об этом.

Также ваша заявка не wait для чего угодно. Если вы используете асинхронную связь (путем определения события DataReceived), вам необходимо убедиться, что ваше приложение действительно циклов и ждет.

Ваше консольное приложение этого не делает. Он пишет что-то в последовательный порт, а затем завершает работу, когда он выходит из метода Main. Если вы ожидаете ответ вы должны решить:

  1. Используйте синхронный способ вызова методов на самом деле блока/чтение из последовательного порта.
  2. Используйте асинхронный способ, когда вы начали делать, но затем запустите приложение, не блокируя нити.

И, пожалуйста, не смешивайте два! Я вижу много кода, где люди в 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 (это бод скорость и т.д. правильно?)
  2. Неправильный последовательный порт (у вас есть больше чем один?)
  3. устройство не общается, как вы думаете (вы посылаете правильную команду ?)
  4. и т. Д.
+0

Благодарим за ответ. Я исправил свой код. Но он тоже ничего не делает. Программа не проходит через DataRecived. Когда я устанавливаю тайм-аут чтения/записи (или спящий поток), на экране появляется только «время ожидания». – ALEG

+0

Ну, если вы «исправили» свой код, пожалуйста, измените свой вопрос, чтобы отразить новую версию. Я не могу ничего сказать, если не вижу код. –

+0

Я исправил свой код. Извините за мой английский, я не очень хорош в нем (как и в C#). – ALEG

Смежные вопросы