diff --git a/src/shared/trk/trkdevice.cpp b/src/shared/trk/trkdevice.cpp
index 831024f341985a792a7ec5c4ad2e854633258e78..4885a72a4328aa4da225cb8fe4850ab4a479eb7c 100644
--- a/src/shared/trk/trkdevice.cpp
+++ b/src/shared/trk/trkdevice.cpp
@@ -486,6 +486,7 @@ public:
 signals:
     void error(const QString &);
     void dataReceived(char c);
+    void dataReceived(const QByteArray &data);
 
 public slots:
     void terminate();
@@ -514,11 +515,23 @@ WinReaderThread::~WinReaderThread()
 // Return 0 to continue or error code
 int WinReaderThread::tryRead()
 {
+    enum { BufSize = 1024 };
+    char buffer[BufSize];
+    // Check if there are already bytes waiting. If not, wait for first byte
+    COMSTAT comStat;
+    if (!ClearCommError(m_context->device, NULL, &comStat)){
+        emit error(QString::fromLatin1("ClearCommError failed: %1").arg(winErrorMessage(GetLastError())));
+        return -7;
+    }    
+    const DWORD bytesToRead = qMax(DWORD(1), qMin(comStat.cbInQue, DWORD(BufSize)));
     // Trigger read
-    char c;
     DWORD bytesRead = 0;
-    if (ReadFile(m_context->device, &c, 1, &bytesRead, &m_context->readOverlapped)) {
-        emit dataReceived(c);
+    if (ReadFile(m_context->device, &buffer, bytesToRead, &bytesRead, &m_context->readOverlapped)) {
+        if (bytesRead == 1) {
+            emit dataReceived(buffer[0]);
+        } else {
+            emit dataReceived(QByteArray(buffer, bytesRead));
+        }
         return 0;
     }
     const DWORD readError = GetLastError();
@@ -540,7 +553,11 @@ int WinReaderThread::tryRead()
         emit error(QString::fromLatin1("GetOverlappedResult failed: %1").arg(winErrorMessage(GetLastError())));
         return -3;
     }
-    emit dataReceived(c);
+    if (bytesRead == 1) {
+        emit dataReceived(buffer[0]);
+    } else {
+        emit dataReceived(QByteArray(buffer, bytesRead));
+    }
     return 0;
 }
 
@@ -787,10 +804,9 @@ bool TrkDevice::open(const QString &port, QString *errorMessage)
 #ifdef Q_OS_WIN
     connect(d->readerThread.data(), SIGNAL(dataReceived(char)),
             this, SLOT(dataReceived(char)), Qt::QueuedConnection);
-#else
+#endif
     connect(d->readerThread.data(), SIGNAL(dataReceived(QByteArray)),
             this, SLOT(dataReceived(QByteArray)), Qt::QueuedConnection);
-#endif
     d->readerThread->start();
 
     d->writerThread = QSharedPointer<WriterThread>(new WriterThread(d->deviceContext));