/// <summary> /// 把数据写入卡片的某个扇区的某些块中 /// </summary> /// <param name="cardID">需写入卡片的卡号(为null或空时不检查卡号)</param> /// <param name="section">扇区(0~15)</param> /// <param name="block">起始块号(0~3)</param> /// <param name="ucExt">写入块数(1~3)</param> /// <param name="pBuf">写入数据</param> /// <param name="key">密钥</param> /// <param name="successBuz">成功是否发出提示音</param> /// <param name="failBuz">失败是否发出提示音</param> /// <param name="loop">是否循环写入,直到写入成功或取消写入</param> /// <param name="initKey">密钥验证失败后,是否初始化扇出密钥</param> /// <returns></returns> public CardOperationResultCode WriteSection(string cardID, int section, int block, byte ucExt, byte[] pBuf, byte[] key, bool successBuz, bool failBuz, bool loop, bool initKey) { bool originalStarted = _Started; if (originalStarted) { StopReadCard(); //正在读卡,先停止 WaitForReading(); //等待读卡完成 } CardOperationResultCode result = CardOperationResultCode.InitFail; try { while (true) { if (HadActiveReader) { result = _ActiveReader.WriteSection(cardID, section, block, ucExt, pBuf, key, successBuz, failBuz, initKey); } else { foreach (ICardReader reader in _Readers) { result = reader.WriteSection(cardID, section, block, ucExt, pBuf, key, successBuz, failBuz, initKey); if (result == CardOperationResultCode.Success) { _ActiveReader = reader; break; } } } if (!loop || result == CardOperationResultCode.Success) { break;//退出循环写入 } else { string msg = "信息未能写入卡片,是否重新写入?"; switch (result) { case CardOperationResultCode.Success: break; case CardOperationResultCode.NoCard: msg += string.Format("\r\n原因:{0}", "没有卡片!"); break; case CardOperationResultCode.CardIDError: msg += string.Format("\r\n原因:{0}", "卡片不是当前发行的卡片!"); break; case CardOperationResultCode.AuthFail: case CardOperationResultCode.Fail: msg += string.Format("\r\n原因:{0}", "卡片不是有效卡片!"); break; case CardOperationResultCode.InitFail: case CardOperationResultCode.OpenFail: msg += string.Format("\r\n原因:{0}", "打开读卡器失败!"); break; default: break; } if (System.Windows.Forms.MessageBox.Show(msg, "询问?", System.Windows.Forms.MessageBoxButtons.YesNo, System.Windows.Forms.MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.No) { break;//退出循环写入 } } } } catch (ThreadAbortException ex) { } catch (Exception ex) { ExceptionPolicy.HandleException(ex); } if (originalStarted) { BeginReadCard(); //恢复读卡 } return(result); }