diff --git a/lib/kiss/kiss_serial.rb b/lib/kiss/kiss_serial.rb
index 4bad9d8ee86520162a2d12ed1278890c5d394451..60f64ea80be02613e6c2761b2e41b3e004492fdd 100644
--- a/lib/kiss/kiss_serial.rb
+++ b/lib/kiss/kiss_serial.rb
@@ -77,7 +77,7 @@ module Kiss
             end
 
             if @serial == nil or @serial.closed?
-                raise 'Attempting to close before the class has been started.'
+                raise IOError.new('Attempting to close before the class has been started.')
             else
                 @serial.close
             end
diff --git a/spec/kiss/kiss_serial_spec.rb b/spec/kiss/kiss_serial_spec.rb
index 4e8e6e2a83b2743ceef8a8c7be13102fcc43e8f8..fb99551009becf6df408128615d29b8516085e15 100644
--- a/spec/kiss/kiss_serial_spec.rb
+++ b/spec/kiss/kiss_serial_spec.rb
@@ -132,28 +132,58 @@ describe Kiss::KissSerial do
         kiss_serial.close
       end
     end
+
+    context "Given an underlying connection that has been closed" do
+      let( :serial_port ) { double(SerialPort) }
+      let( :kiss_serial ) { Kiss::KissSerial.new("/dev/ttyUSB-scs") }
+
+      it "closes underlying serial port" do
+        allow( SerialPort ).to receive(:new).and_return(serial_port)
+        allow(serial_port).to receive(:read_timeout=)
+        kiss_serial.connect
+
+        allow(serial_port).to receive(:closed?).and_return(true)
+        expect(serial_port).to_not receive(:close)
+        expect {
+          kiss_serial.close
+        }.to raise_error(IOError)
+      end
+    end
+  end
+
+  describe ".write" do
+    context "Given an underlying connection and valid frame" do
+      let( :serial_port ) { double(SerialPort) }
+      let( :kiss_serial ) { Kiss::KissSerial.new("/dev/ttyUSB-scs") }
+
+      it "encodes the frame properly" do
+        allow( SerialPort ).to receive(:new).and_return(serial_port)
+        allow(serial_port).to receive(:read_timeout=)
+        allow(serial_port).to receive(:write).with(Kiss::MODE_INIT_W8DED.map { |b| b.chr }.join)
+        kiss_serial.connect(Kiss::MODE_INIT_W8DED)
+
+        expect(serial_port).to receive(:write).with(ENCODED_FRAME.map { |b| b.chr }.join).once
+        kiss_serial.write(DECODED_FRAME)
+      end
+    end
   end
 
-  # describe ".read" do
-  #   context "Given an encoded frame as bytes on the underlying interface" do
-  #     let(:kiss_mock) {KissMock.new}
-  #     it "successfully decoded and parsed the frame" do
-  #       kiss_mock.add_read_from_interface(ENCODED_FRAME)
-  #       translated_frame = kiss_mock.read
-  #       expect(translated_frame).to eql(DECODED_FRAME)
-  #     end
-  #   end
-  # end
-  #
-  # describe ".write" do
-  #   context "Given a decoded frame" do
-  #     let(:kiss_mock) {KissMock.new}
-  #     it "successfully encodes to the underlying interface" do
-  #       kiss_mock.write(DECODED_FRAME)
-  #       all_raw_frames = kiss_mock.get_sent_to_interface
-  #       expect(all_raw_frames[0]).to eql(ENCODED_FRAME)
-  #     end
-  #   end
-  # end
+  describe ".read" do
+    context "Given an underlying connection with a valid frame waiting" do
+      let( :serial_port ) { double(SerialPort) }
+      let( :kiss_serial ) { Kiss::KissSerial.new("/dev/ttyUSB-scs") }
+
+      it "decodes the frame properly" do
+        allow( SerialPort ).to receive(:new).and_return(serial_port)
+        allow(serial_port).to receive(:read_timeout=)
+        allow(serial_port).to receive(:write).with(Kiss::MODE_INIT_W8DED.map { |b| b.chr }.join)
+        kiss_serial.connect(Kiss::MODE_INIT_W8DED)
+
+        expect(serial_port).to receive(:read).and_return(ENCODED_FRAME.map { |b| b.chr }.join, nil)
+        actual_frame = kiss_serial.read
+        expect(actual_frame).to eql(DECODED_FRAME)
+      end
+    end
+  end
 
 end