diff --git a/dynamixel_base/src/dynamixel_slave.c b/dynamixel_base/src/dynamixel_slave.c
index 84aaeaeabccf810a950c7e9488d07a76d042f302..a3415844ee740f710fbb677d8a0a95a6bd08da41 100644
--- a/dynamixel_base/src/dynamixel_slave.c
+++ b/dynamixel_base/src/dynamixel_slave.c
@@ -5,8 +5,6 @@ unsigned char dyn_slave_irq_receive_cb(TDynamixelSlave *dyn_slave,unsigned char
 {
   if(dyn_slave!=0x00000000)
   {
-    if(dyn_slave->comm_dev->time!=0x00000000)
-      time_set_timeout(dyn_slave->comm_dev->time,dyn_slave->rx_timeout_ms*1000);
     switch(dyn_slave->received_bytes)
     {
       case 0: if(byte==0xFF)
@@ -14,6 +12,8 @@ unsigned char dyn_slave_irq_receive_cb(TDynamixelSlave *dyn_slave,unsigned char
                 dyn_slave->rx_buffer[dyn_slave->received_bytes]=byte;
                 dyn_slave->received_bytes++;
               }
+              if(dyn_slave->comm_dev->time!=0x00000000)
+                time_set_timeout(dyn_slave->comm_dev->time,dyn_slave->rx_timeout_ms*1000);
               break;
       case 1: if(byte==0xFF)
               {
@@ -123,8 +123,8 @@ void dyn_slave_send_status_packet(TDynamixelSlave *slave,unsigned char address,u
 {
   if(slave!=0x00000000)
   {
-    // wait until the previous transmission has ended (if any)
-    while(comm_is_send_done(slave->comm_dev)==COMM_BUSY);
+    // cancel any transmission pending 
+    comm_do_dma_send(slave->comm_dev);
     if(return_delay>0)
       if(slave->comm_dev->time!=0x00000000)
         time_delay_us(slave->comm_dev->time,return_delay<<1);