diff --git a/src/asciireader.cpp b/src/asciireader.cpp
--- a/src/asciireader.cpp
+++ b/src/asciireader.cpp
@@ -33,6 +33,7 @@ AsciiReader::AsciiReader(QIODevice* devi
 
     _numOfChannels = _settingsWidget.numOfChannels();
     autoNumOfChannels = (_numOfChannels == NUMOFCHANNELS_AUTO);
+    delimiter = _settingsWidget.delimiter();
 
     connect(&_settingsWidget, &AsciiReaderSettings::numOfChannelsChanged,
             [this](unsigned value)
@@ -45,6 +46,12 @@ AsciiReader::AsciiReader(QIODevice* devi
                 }
             });
 
+    connect(&_settingsWidget, &AsciiReaderSettings::delimiterChanged,
+            [this](QChar d)
+            {
+                delimiter = d;
+            });
+
     connect(device, &QIODevice::aboutToClose, [this](){discardFirstLine=true;});
 }
 
@@ -90,7 +97,7 @@ void AsciiReader::onDataReady()
 {
     while(_device->canReadLine())
     {
-        QByteArray line = _device->readLine();
+        QString line = QString(_device->readLine());
 
         // discard only once when we just started reading
         if (discardFirstLine)
@@ -116,7 +123,7 @@ void AsciiReader::onDataReady()
             continue;
         }
 
-        auto separatedValues = line.split(',');
+        auto separatedValues = line.split(delimiter, QString::SkipEmptyParts);
 
         unsigned numReadChannels; // effective number of channels to read
         unsigned numComingChannels = separatedValues.length();
@@ -143,6 +150,7 @@ void AsciiReader::onDataReady()
         }
 
         // parse read line
+        unsigned numDataBroken = 0;
         double* channelSamples = new double[_numOfChannels]();
         for (unsigned ci = 0; ci < numReadChannels; ci++)
         {
@@ -153,6 +161,7 @@ void AsciiReader::onDataReady()
                 qWarning() << "Data parsing error for channel: " << ci;
                 qWarning() << "Read line: " << line;
                 channelSamples[ci] = 0;
+                numDataBroken++;
             }
         }
 
diff --git a/src/asciireader.h b/src/asciireader.h
--- a/src/asciireader.h
+++ b/src/asciireader.h
@@ -48,6 +48,7 @@ private:
     unsigned _numOfChannels;
     /// number of channels will be determined from incoming data
     unsigned autoNumOfChannels;
+    QChar delimiter; ///< selected column delimiter
     bool paused;
 
     // We may have (usually true) started reading in the middle of a
diff --git a/src/asciireadersettings.cpp b/src/asciireadersettings.cpp
--- a/src/asciireadersettings.cpp
+++ b/src/asciireadersettings.cpp
@@ -1,5 +1,5 @@
 /*
-  Copyright © 2016 Hasan Yavuz Özderya
+  Copyright © 2017 Hasan Yavuz Özderya
 
   This file is part of serialplot.
 
@@ -17,20 +17,35 @@
   along with serialplot.  If not, see .
 */
 
+#include 
+#include 
+
 #include "utils.h"
 #include "setting_defines.h"
 
 #include "asciireadersettings.h"
 #include "ui_asciireadersettings.h"
 
-#include 
-
 AsciiReaderSettings::AsciiReaderSettings(QWidget *parent) :
     QWidget(parent),
     ui(new Ui::AsciiReaderSettings)
 {
     ui->setupUi(this);
 
+    auto validator = new QRegularExpressionValidator(QRegularExpression("[^\\d]?"), this);
+    ui->leDelimiter->setValidator(validator);
+
+    connect(ui->rbComma, &QAbstractButton::toggled,
+            this, &AsciiReaderSettings::delimiterToggled);
+    connect(ui->rbSpace, &QAbstractButton::toggled,
+            this, &AsciiReaderSettings::delimiterToggled);
+    connect(ui->rbTab, &QAbstractButton::toggled,
+            this, &AsciiReaderSettings::delimiterToggled);
+    connect(ui->rbOtherDelimiter, &QAbstractButton::toggled,
+            this, &AsciiReaderSettings::delimiterToggled);
+    connect(ui->leDelimiter, &QLineEdit::textChanged,
+            this, &AsciiReaderSettings::customDelimiterChanged);
+
     // Note: if directly connected we get a runtime warning on incompatible signal arguments
     connect(ui->spNumOfChannels, SELECT::OVERLOAD_OF(&QSpinBox::valueChanged),
             [this](int value)
@@ -44,11 +59,51 @@ AsciiReaderSettings::~AsciiReaderSetting
     delete ui;
 }
 
-unsigned AsciiReaderSettings::numOfChannels()
+unsigned AsciiReaderSettings::numOfChannels() const
 {
     return ui->spNumOfChannels->value();
 }
 
+QChar AsciiReaderSettings::delimiter() const
+{
+    if (ui->rbComma->isChecked())
+    {
+        return QChar(',');
+    }
+    else if (ui->rbSpace->isChecked())
+    {
+        return QChar(' ');
+    }
+    else if (ui->rbTab->isChecked())
+    {
+        return QChar('\t');
+    }
+    else                        // rbOther
+    {
+        auto t = ui->leDelimiter->text();
+        return t.isEmpty() ? QChar() : t.at(0);
+    }
+}
+
+void AsciiReaderSettings::delimiterToggled(bool checked)
+{
+    if (!checked) return;
+
+    auto d = delimiter();
+    if (!d.isNull())
+    {
+        emit delimiterChanged(d);
+    }
+}
+
+void AsciiReaderSettings::customDelimiterChanged(const QString text)
+{
+    if (ui->rbOtherDelimiter->isChecked())
+    {
+        if (!text.isEmpty()) emit delimiterChanged(text.at(0));
+    }
+}
+
 void AsciiReaderSettings::saveSettings(QSettings* settings)
 {
     settings->beginGroup(SettingGroup_ASCII);
diff --git a/src/asciireadersettings.h b/src/asciireadersettings.h
--- a/src/asciireadersettings.h
+++ b/src/asciireadersettings.h
@@ -1,5 +1,5 @@
 /*
-  Copyright © 2016 Hasan Yavuz Özderya
+  Copyright © 2017 Hasan Yavuz Özderya
 
   This file is part of serialplot.
 
@@ -22,6 +22,7 @@
 
 #include 
 #include 
+#include 
 
 namespace Ui {
 class AsciiReaderSettings;
@@ -35,7 +36,8 @@ public:
     explicit AsciiReaderSettings(QWidget *parent = 0);
     ~AsciiReaderSettings();
 
-    unsigned numOfChannels();
+    unsigned numOfChannels() const;
+    QChar delimiter() const;
     /// Stores settings into a `QSettings`
     void saveSettings(QSettings* settings);
     /// Loads settings from a `QSettings`.
@@ -43,9 +45,15 @@ public:
 
 signals:
     void numOfChannelsChanged(unsigned);
+    /// Signaled only with a valid delimiter
+    void delimiterChanged(QChar);
 
 private:
     Ui::AsciiReaderSettings *ui;
+
+private slots:
+    void delimiterToggled(bool checked);
+    void customDelimiterChanged(const QString text);
 };
 
 #endif // ASCIIREADERSETTINGS_H
diff --git a/src/asciireadersettings.ui b/src/asciireadersettings.ui
--- a/src/asciireadersettings.ui
+++ b/src/asciireadersettings.ui
@@ -6,14 +6,17 @@
    
     0
     0
-    414
+    493
     171
    
   
   
    Form
   
-  
+  
+   
+    QFormLayout::ExpandingFieldsGrow
+   
    
     0
    
@@ -26,68 +29,105 @@
    
     0
    
-   - 
+   
- 
+    
+     
+      Number Of Channels:
+     
+    
+   
 
+   - 
+    
+     
+      
+       60
+       0
+      
+     
+     
+      Select number of channels or set to 0 for Auto (determined from incoming data)
+     
+     
+      Auto
+     
+     
+      false
+     
+     
+      0
+     
+     
+      32
+     
+    
+   
 
+   - 
+    
+     
+      Column Delimiter:
+     
+    
+   
 
+   - 
     
      
- 
-      
+      
        
-        Number Of Channels:
+        comma
+       
+       
+        true
        
       
      
 
      - 
-      
-       
-        
-         60
-         0
-        
-       
-       
-        Select number of channels or set to 0 for Auto (determined from incoming data)
+      
+       
+        space
        
-       
-        Auto
-       
-       
-        false
+      
+     
 
+     - 
+      
+       
+        tab
        
-       
-        0
-       
-       
-        32
+      
+     
 
+     - 
+      
+       
+        other:
        
       
      
 
      - 
-      
-       
-        Qt::Horizontal
+      
+       
+        
+         0
+         0
+        
        
-       
+       
         
-         1
-         20
+         30
+         16777215
         
        
-      
+       
+        Enter a custom delimiter character
+       
+       
+        
+       
+       
+        |
+       
+      
      
 
     
     
-   - 
-    
-     
-      Qt::Vertical
-     
-     
-      
-       20
-       1
-      
-     
-    
-