Qt串口不能很好地读取字符串

时间:2016-02-10 12:52:52

标签: c++ qt ubuntu unicode serial-port

我在Ubuntu Gnome 14.04 LTS上使用Qt 5.4从串口读取字符串行。一切都很好,但是当我重新安装Ubuntu Gnome 14.04和Qt 5.4时,我的串口代码运行不正常。当Arduino发送“0”时,Qt的代码读取它就像这个“ ”和其他通过串行发送Qt的数字将其读作字母和符号。我认为我的Qt unicode的问题。我的ubuntu的unicode是en.US.UTF-8,QT unicode被设置为“system”。请帮我 :( 这是我从串口读取数据的代码:

    QByteArray input;    
if (serial->canReadLine())    //chect if data line is ready
     input.clear();
   input = serial->readLine(); //read data line from sreial port
   ui->label->setText(input);
   qDebug ()<<input<<endl;

这个Arduino代码与CuteCom和Arduino串口监视器一起正常工作

    const int analogInPin = A0; 


unsigned int sensorValue = 0;        // value read from the pot


void setup() {

  Serial.begin(19200);
}

void loop() {
  Serial.print("\n");
  Serial.print("#");
  for (int i=0; i < 5; i++) {
  // read the analog in value:
  sensorValue = analogRead(analogInPin);

  Serial.print(sensorValue);
  Serial.print("#");

};
  sensorValue = analogRead(analogInPin);
  Serial.print(sensorValue);
  Serial.print("# \n");  
}

抱歉我的英文

2 个答案:

答案 0 :(得分:0)

如果奇偶校验或数据/停止位参数不同,您仍然可以进行写入和读取,但是您会感到很有趣&#34;输出类似于上面显示的那个,这不是unicode设置的问题(尤其不是&#39; 0&#39;,这是ASCII集的一个字符)。

尝试在开始通信之前在两端显式设置相同的端口参数。

答案 1 :(得分:0)

有几个问题:

  1. 您没有发布足够的代码来了解您如何使用它的上下文。我假设您处理附加到readyRead信号的方法中的数据。

  2. 您只读一行,在那里您应该读取行,直到没有更多可用的行。可以使用任何可用于读取的字节数发出readyRead信号:这些信号可能不构成完整的行,或几条完整的行!如果您不再继续阅读,那么您将不会严重滞后于传入的数据。

  3. 您正在使用隐式QByteArray转化为QString次转化。这些是难闻的代码味道。明确一点。

  4. 你有相当详细的代码。在设置其值之前,您不需要清除QByteArray。您还应该在使用时声明它。更好的是,使用C ++ 11带来的类型推断。

  5. 因此:

    class MyWindow : public QDialog {
      QSerialPort m_port;
      void onData() {
        while (m_port->canReadLine())
          auto input = QString::fromLatin1(m_port->readLine());
          ui->label->setText(input);
          qDebug() << input;
        }
      }
      ...
    public:
      MyWindow(QWidget * parent = 0) : QDialog(parent) {
        ...
        connect(&m_port, &QIODevice::readyRead, this, &MyWindow::onData);
      }
    };