public void WriteAndReadMessage(PktType type, string head, string body, out string responseOut, bool keepWaitting = true, int readTimeOut = 0) { string prefix = String.Empty; string suffix = String.Empty; responseOut = String.Empty; if (type == PktType.SI) { prefix = Convert.ToChar(0x0F).ToString(); suffix = Convert.ToChar(0x0E).ToString(); } else if (type == PktType.STX) { prefix = Convert.ToChar(0x02).ToString(); suffix = Convert.ToChar(0x03).ToString(); } string packed_meaasge = prefix + head + body + suffix; byte lrc = DataHandler.LRCCalculator(Encoding.ASCII.GetBytes(packed_meaasge), packed_meaasge.Length); if (_serialPort.BytesToRead > 0) { _serialPort.DiscardInBuffer(); } if (_serialPort.BytesToWrite > 0) { _serialPort.DiscardOutBuffer(); } // Sending message try { _serialPort.Write(packed_meaasge + Convert.ToChar(lrc).ToString()); if (OnDataSent != null) { byte[] data_sent = Encoding.ASCII.GetBytes(packed_meaasge + Convert.ToChar(lrc).ToString()); OnDataSent(this, data_sent); } } catch (InvalidOperationException) { throw new System.InvalidOperationException("Serial Port is not open."); } catch (Exception) { throw new System.Exception("Sending message failed."); } // Check if ACK is received try { byte[] controlCode = new byte[1]; _serialPort.Read(controlCode, 0, 1); if (OnDataReceived != null) { OnDataReceived(this, controlCode); } switch (controlCode[0]) { case 0x06: case 0x04: //Console.WriteLine("Received 0x{0} from the reader.", controlCode[0].ToString("X2")); //Console.WriteLine("BytesToWrite = {0}", _serialPort.BytesToWrite); break; case 0x15: // NAK throw new System.Exception("Received NAK from reader: Incorrect LRC."); default: // Unknown throw new System.Exception("Unknown response: 0x" + controlCode[0].ToString("X2")); } } catch (TimeoutException) { // Reader no response; throw new System.TimeoutException("Timeout: No ACK"); } catch (Exception) { throw new System.Exception("Waitting ACK failed."); } if (!keepWaitting) { return; } int response_length = 0; byte[] readBuffer = new byte[_serialPort.ReadBufferSize]; byte bPrefix, bSuffix; if (type == PktType.SI) { bPrefix = 0x0F; bSuffix = 0x0E; } else { bPrefix = 0x02; bSuffix = 0x03; } // Waitting for reply from reader Stopwatch s = new Stopwatch(); if (readTimeOut > 0) { s.Start(); } while (s.Elapsed <= TimeSpan.FromMilliseconds(readTimeOut)) { Application.DoEvents(); if (_serialPort.BytesToRead == 0) { continue; } int bytes = _serialPort.BytesToRead; _serialPort.Read(readBuffer, response_length, bytes); response_length += bytes; if (readBuffer[0] == bPrefix && readBuffer[response_length - 2] == bSuffix) { if (OnDataReceived != null) { byte[] localBuffer = new byte[response_length]; Array.Copy(readBuffer, localBuffer, response_length); OnDataReceived(this, localBuffer); } // LRC check if (readBuffer[response_length - 1] == DataHandler.LRCCalculator(readBuffer, response_length - 1)) { // Send ACK _serialPort.Write(Convert.ToChar(0x06).ToString()); if (OnDataSent != null) { byte[] ack = Encoding.ASCII.GetBytes(Convert.ToChar(0x06).ToString()); OnDataSent(this, ack); } responseOut = Encoding.ASCII.GetString(readBuffer, 1, response_length - 3); } else { // Send NAK _serialPort.Write(Convert.ToChar(0x15).ToString()); if (OnDataSent != null) { byte[] nak = Encoding.ASCII.GetBytes(Convert.ToChar(0x15).ToString()); OnDataSent(this, nak); } } return; } } s.Reset(); // Timeout throw new System.TimeoutException("Timeout: No response"); }
private void SetICCApplicationConfig(string fullName, int buffer_len = -1) { string s1A = Convert.ToChar(0x1A).ToString(); string s1C = Convert.ToChar(0x1C).ToString(); if (buffer_len < 0) { buffer_len = serialPort.GetWriteBufferSize(); } int max_body_length = buffer_len - 25; List <string> message_body_list = new List <string>(); try { string aid = String.Empty; string message_body = String.Empty; var sr = new StreamReader(fullName); while (!sr.EndOfStream) { string sl = sr.ReadLine(); if (sl.ToUpper().StartsWith("NOTE")) { break; } // Description string handling string description = String.Empty; if (sl.Contains("//")) { int descripePosition = sl.IndexOf("//"); description = sl.Substring(descripePosition + 2).Trim(); sl = sl.Substring(0, descripePosition); } // Tag Format Value string handling string[] tagFormatValue = sl.Trim().Split(' '); if (tagFormatValue.Length == 3) { if (tagFormatValue[0].ToUpper().Equals("9F06")) { aid = tagFormatValue[2]; } tagFormatValue[1] = DataHandler.UICFormatConvertor(tagFormatValue[1]).ToString(); string data_object = string.Join(s1C, tagFormatValue); if ((message_body.Length + data_object.Length) > max_body_length) { message_body_list.Add(message_body); message_body = String.Empty; } message_body += s1A + data_object; } } message_body_list.Add(message_body); if (string.IsNullOrEmpty(aid)) { throw new System.FormatException("Missing AID 9F06"); } int current_pkg = 1; int total_pkg = message_body_list.Count; while (current_pkg <= total_pkg) { string pre_fix = current_pkg == 1 ? (s1A + aid) : ""; serialPort.WriteAndReadMessage(PktType.STX, "T05" + current_pkg.ToString() + total_pkg.ToString(), pre_fix + message_body_list[current_pkg - 1], out string response); if (!response.Equals("T060")) { throw new System.FormatException(response); } current_pkg += 1; } } catch (Exception ex) { throw ex; } }