/// <summary> /// 向读卡器请求命令,并取得返回包 /// </summary> /// <param name="cmd">请求的命令</param> /// <param name="data">请求中包含的数据</param> /// <returns></returns> public YCTPacket Request(YCTCommandType cmd, byte[] data) { lock (_PortLocker) { byte[] request = CreateRequest(cmd, data); if (Log) { Ralid.GeneralLibrary.LOG.FileLog.Log("羊城通读卡器", "发送数据: " + HexStringConverter.HexToString(request, " ")); } _Port.OnDataArrivedEvent -= _Port_OnDataArrivedEvent; _buffer.Clear(); _Responsed.Reset(); _Response = null; _Port.OnDataArrivedEvent += _Port_OnDataArrivedEvent; _Port.SendData(request); if (_Responsed.WaitOne(5000)) { if (_Response != null && _Response.CheckCRC() && _Response.Command == (byte)cmd) { _LastError = _Response.Status; return(_Response); } } } _LastError = -1; return(null); }
private byte[] CreateRequest(YCTCommandType cmd, byte[] data) { ////包结构 头(1byte) + 包长(1byte) + Command(1byte) + data(nbyte) + checksum(1byte) List <byte> ret = new List <byte>(); ret.Add(0xBA); //头 ret.Add((byte)(2 + (data != null ? data.Length : 0))); //命令+数据+crc的长度 ret.Add((byte)cmd); if (data != null) { ret.AddRange(data); } ret.Add(CRCHelper.CalCRC(ret)); return(ret.ToArray()); }