diff --git a/src/asciireader.cpp b/src/asciireader.cpp
--- a/src/asciireader.cpp
+++ b/src/asciireader.cpp
@@ -21,6 +21,9 @@
 
 #include "asciireader.h"
 
+/// If set to this value number of channels is determined from input
+#define NUMOFCHANNELS_AUTO   (0)
+
 AsciiReader::AsciiReader(QIODevice* device, ChannelManager* channelMan, QObject *parent) :
     AbstractReader(device, channelMan, parent)
 {
@@ -29,10 +32,23 @@ AsciiReader::AsciiReader(QIODevice* devi
     sampleCount = 0;
 
     _numOfChannels = _settingsWidget.numOfChannels();
+    autoNumOfChannels = (_numOfChannels == NUMOFCHANNELS_AUTO);
+    // do not allow '0'
+    if (_numOfChannels == 0)
+    {
+        _numOfChannels = 1;
+    }
+
     connect(&_settingsWidget, &AsciiReaderSettings::numOfChannelsChanged,
-            this, &AsciiReader::numOfChannelsChanged);
-    connect(&_settingsWidget, &AsciiReaderSettings::numOfChannelsChanged,
-            [this](unsigned value){_numOfChannels = value;});
+            [this](unsigned value)
+            {
+                _numOfChannels = value;
+                autoNumOfChannels = (_numOfChannels == NUMOFCHANNELS_AUTO);
+                if (!autoNumOfChannels)
+                {
+                    emit numOfChannelsChanged(value);
+                }
+            });
 
     connect(device, &QIODevice::aboutToClose, [this](){discardFirstLine=true;});
 }
@@ -99,8 +115,20 @@ void AsciiReader::onDataReady()
 
         auto separatedValues = line.split(',');
 
-        int numReadChannels; // effective number of channels to read
-        if (separatedValues.length() >= int(_numOfChannels))
+        unsigned numReadChannels; // effective number of channels to read
+        unsigned numComingChannels = separatedValues.length();
+
+        if (autoNumOfChannels)
+        {
+            // did number of channels changed?
+            if (numComingChannels != _numOfChannels)
+            {
+                _numOfChannels = numComingChannels;
+                emit numOfChannelsChanged(numComingChannels);
+            }
+            numReadChannels = numComingChannels;
+        }
+        else if (numComingChannels >= _numOfChannels)
         {
             numReadChannels = _numOfChannels;
         }
@@ -111,7 +139,7 @@ void AsciiReader::onDataReady()
         }
 
         // parse read line
-        for (int ci = 0; ci < numReadChannels; ci++)
+        for (unsigned ci = 0; ci < numReadChannels; ci++)
         {
             bool ok;
             double channelSample = separatedValues[ci].toDouble(&ok);
diff --git a/src/asciireader.h b/src/asciireader.h
--- a/src/asciireader.h
+++ b/src/asciireader.h
@@ -39,6 +39,8 @@ public slots:
 private:
     AsciiReaderSettings _settingsWidget;
     unsigned _numOfChannels;
+    /// number of channels will be determined from incoming data
+    unsigned autoNumOfChannels;
     bool paused;
 
     // We may have (usually true) started reading in the middle of a
diff --git a/src/asciireadersettings.ui b/src/asciireadersettings.ui
--- a/src/asciireadersettings.ui
+++ b/src/asciireadersettings.ui
@@ -44,13 +44,16 @@
         
        
        
-        Select number of channels
+        Select number of channels or set to 0 for Auto (determined from incoming data)
+       
+       
+        Auto
        
        
         false
        
        
-        1
+        0
        
        
         32