diff --git a/master/master.c b/master/master.c
index e68918fec486b2c9e6f682be9c53b746158754ce..144241ba0ecb1725f91cb26b664223bf4aff2704 100644
--- a/master/master.c
+++ b/master/master.c
@@ -1452,22 +1452,25 @@ int ecrt_master_activate(ec_master_t *master /**< EtherCAT master */)
 void ec_master_sync_io(ec_master_t *master /**< EtherCAT master */)
 {
     ec_datagram_t *datagram;
-    unsigned int datagrams_waiting;
+    unsigned int datagrams_sent;
 
-    // send datagrams
+    // send all datagrams
     ecrt_master_send(master);
 
     while (1) { // active waiting
         ecrt_master_receive(master); // receive and dequeue datagrams
 
         // count number of datagrams still waiting for response
-        datagrams_waiting = 0;
+        datagrams_sent = 0;
         list_for_each_entry(datagram, &master->datagram_queue, queue) {
-            datagrams_waiting++;
+            // there may be another process that queued commands
+            // in the meantime.
+            if (datagram->state == EC_DATAGRAM_QUEUED) continue;
+            datagrams_sent++;
         }
 
-        // if there are no more datagrams waiting, abort loop.
-        if (!datagrams_waiting) break;
+        // abort loop if there are no more datagrams marked as sent.
+        if (!datagrams_sent) break;
     }
 }