diff --git a/cMIPS/serial.inp b/cMIPS/serial.inp
index ce14040059ad11bfb716933c99b0e5566623b9c3..5427aab4c0e40ae492e818b23eed512213047e59 100644
--- a/cMIPS/serial.inp
+++ b/cMIPS/serial.inp
@@ -1,5 +1,6 @@
 0
-00
+11
 ffffffff
 7C2
 
+
diff --git a/cMIPS/tests/handlerUART.s b/cMIPS/tests/handlerUART.s
index 6b4a9981a93823adfa8c727a668ff434b2c9b397..e88dce142ab9725cc49b3d62a3b538fae1fcc020 100644
--- a/cMIPS/tests/handlerUART.s
+++ b/cMIPS/tests/handlerUART.s
@@ -35,6 +35,11 @@ RX:
     # ori $a0, $a0, %lo(x_IO_BASE_ADDR)
     # sw  $k1, 0($a0)               # Print for debug
 
+    lw    $k1, 0($a1)
+    j     RX
+    nop
+
+
 
 
 TX:
@@ -46,6 +51,10 @@ TX:
 
     lw    $a1, 52($a0)          # Read ntx
 
+    # lui $k1, %hi(x_IO_BASE_ADDR)
+    # ori $k1, $k1, %lo(x_IO_BASE_ADDR)
+    # sw  $a1, 0($k1)               # Print for debug
+
     addiu $k1, $zero, 16
     slt   $k1, $a1, $k1         # If ntx < 16 there's something on the queue
     beq   $k1, $zero, END      
@@ -59,13 +68,21 @@ TX:
     andi  $k1, $k1, 15          # It's a circular queue so: (tx_hd+1)%16
     sw    $k1, 40($a0)          # Save tx_hd
 
-    addiu $a1, $a1, 24          # tx_hd position on tx_queue
+    # addiu $a1, $a1, 24          # tx_hd position on tx_queue
     add   $a0, $a1, $a0         # tx_queue head address
-    lbu   $a1, 0($a0)           # Read TX_queue head
+    lbu   $a1, 24($a0)           # Read TX_queue head
 
     lui   $a0, %hi(HW_uart_addr)
     ori   $a0, $a0, %lo(HW_uart_addr)
     sb    $a1, 4($a0)           # Put data on UART
 
+    # lui $a0, %hi(x_IO_BASE_ADDR)
+    # ori $a0, $a0, %lo(x_IO_BASE_ADDR)
+    # sw  $a1, 0($a0)               # Print for debug
+
+    lw    $k1, 0($a0)
+    j     RX
+    nop
+
 END:
 
diff --git a/cMIPS/tests/uart.c b/cMIPS/tests/uart.c
index 05455d5c631fcc4d9947dbf10f286e62f90df9a0..3d962842ce7008f85b177afd353d6612bab2e397 100644
--- a/cMIPS/tests/uart.c
+++ b/cMIPS/tests/uart.c
@@ -56,7 +56,7 @@ int probetx(void);         // returns ntx
 int iostat(void);          // returns integer with status at lsb
 void ioctl(int);           // write lsb in control register
 char getc(void);           // returns char in queue, decrements nrx
-int Putc(char);            // inserts char in queue, decrements ntx
+void Putc(char);            // inserts char in queue, decrements ntx
 int ctoi(char);            // converts a character to an integer
 
 void initUd();
@@ -65,41 +65,51 @@ extern UARTDriver Ud;
 volatile Tserial *uart;
 
 int main(){
-    int i;
-    volatile int state;    // tell GCC not to optimize away code
-    volatile Tstatus status;
-    volatile char c;
     uart = (void *)IO_UART_ADDR; // bottom of UART address range
     Tcontrol ctrl;
 
-
     ctrl.ign   = 0;
-    ctrl.intTX = 0;
+    ctrl.intTX = 1;
     ctrl.intRX = 1;
     ctrl.speed = 2;        // operate at 1/2 of the highest data rate
     uart->cs.ctl = ctrl;
 
     initUd();
-
-    c = getc();
-    while(c != '\0') {
+    volatile char c;
+    
+    while((c = getc()) != '\0') {
         if(c != EOF) {
-            int n = 0;
-            while(c != '\n' && c != '\0') {
-                int h = ctoi(c);
-                if(h != EOF) {
-                    n = n*16 + h;         
-                }
-                c = getc();
-            }
-            //If it's a negative hex make it a negative integer as well
-            n = 0x8000&n ? (int)(0x7FFF&n)-0x8000 : n;
-            print(n);
-            //while(!Putc(c)); // Wait till there's space on queue
+            Putc(c);
         }
-        c = getc();
     }
-    Putc(c); // Sends EOF
+    if(Ud.ntx < 16){
+        disableInterr();
+        uart->d.tx = Ud.tx_q[Ud.tx_hd];
+        Ud.tx_hd = (Ud.tx_hd+1)%16;
+        Ud.ntx++;
+        enableInterr();
+    }
+
+    int cont;
+    for(cont=0;cont<1000;cont++);  //Wait for the remote uart
+    
+    // while((c = getc()) != '\0') {
+    //     if(c != EOF) {
+    //         // while(!Putc(c)); // Wait till there's space on queue
+    //         int n = 0;
+    //         while(c != '\n' && c != '\0') {
+    //             int h = ctoi(c);
+    //             if(h != EOF) {
+    //                 n = n*16 + h;         
+    //             }
+    //             c = getc();
+    //         }
+    //         //If it's a negative hex make it a negative integer as well
+    //         n = 0x8000&n ? (int)(0x7FFF&n)-0x8000 : n;
+    //         // print(n);
+    //     }
+    // }
+    // Putc(c); // Sends EOF
 
     return 0;
 }
@@ -114,37 +124,33 @@ void initUd(){
 }
 
 char getc(){
-    char c;
+    char c = EOF;
     if(Ud.nrx > 0){
         disableInterr();
         c = Ud.rx_q[Ud.rx_hd];
         Ud.rx_hd = (Ud.rx_hd+1)%16;
         Ud.nrx--;
         enableInterr();
-    }else{
-        c = EOF;
     }
     return c;
 }
 
-int Putc(char c){
-    int sent;
-    if(Ud.ntx == 16) {
-        uart->d.tx = c;
-        return 1;
-    }
-
+void Putc(char c){
     if(Ud.ntx > 0){
         disableInterr();
         Ud.tx_q[Ud.tx_tl] = c;
         Ud.tx_tl = (Ud.tx_tl+1)%16;
         Ud.ntx--;
         enableInterr();
-        sent = 1;
     }else{
-        sent = 0;
+        while(!(TXempty&uart->cs.stat.s));
+        disableInterr();
+        uart->d.tx = Ud.tx_q[Ud.tx_hd];
+        Ud.tx_hd = (Ud.tx_hd+1)%16;
+        Ud.ntx++;
+        enableInterr();
+        Putc(c);
     }
-    return sent;
 }
 
 int proberx(){