Example #1
0
        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");
        }
Example #2
0
        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;
            }
        }