/* This method sends an R-Nack block to the specified reader */
		private bool SendRNackBlock(SpringCardIWM2_Serial_Reader reader)
		{
			byte[] data = new byte[5];
			data[0] = ASCII_STX;
			data[1] = (byte)  (IWM2_MK2_PROTO_R_NACK | reader.block_number);
			data[2] = reader.GetAddress();
			data[3] = CalculateLRC(data, 3);
			data[4] = ASCII_ETX;
			
			byte out_len = 0;
			byte[] res = EscapeForbiddenBytes(data, 5, out out_len);
			
			if (show_frames)
				LogByteArrayEmitted(res, out_len);
			
			try
			{
				port.Write(res, 0, out_len);
				Thread.Sleep(1); 		/* slow down the bus */

			} catch (Exception)
			{
				return false;
			}
			return true;				
		}
		/* This method sends an I-Block with a payload to the specified reader */
		private bool SendIBlock(SpringCardIWM2_Serial_Reader reader, byte[] payload)
		{
			byte[] data;
			byte offset = 0;
			
			if (payload == null)
				data = new byte[5];
			else
				data = new byte[5 + payload.Length];
						
			data[offset++] = ASCII_STX;
			data[offset++] = (byte)  (IWM2_MK2_PROTO_I_BLOCK | reader.block_number);
			data[offset++] = reader.GetAddress();
			if (payload != null)
				for (byte i=0; i<payload.Length; i++)
					data[offset++] = payload[i];
			
			data[offset] = CalculateLRC(data, offset);
			offset++;
			data[offset++] = ASCII_ETX;
			
			byte out_len = 0;
			byte[] res = EscapeForbiddenBytes(data, offset, out out_len);
			
			if (show_frames)
				LogByteArrayEmitted(res, out_len);
			
			try
			{
				port.Write(res, 0, out_len);
				Thread.Sleep(1); 		/* slow down the bus */
			
			} catch (Exception)
			{
				return false;
			}
			
			return true;		
		}