【问题标题】:Qt Serial Port communicationQt 串口通讯
【发布时间】:2013-08-04 08:23:37
【问题描述】:

我正在编写一个 Qt 应用程序以通过串行端口与另一台计算机通信。我有两个真正的问题。

1. 我可以很好地发送和接收数据,但有时串行端口会“吃掉”我输入的一部分。 例如,如果我发送:

cd /application/bin

有时(并非总是)它只会收到:

cd /applica

(因为它是一个终端,它会回显输入。我的提示也告诉我,我显然是在错误的位置。)

2. 此外,有时即使我知道有数据可以接收,当有可用数据时触发的 Qt 插槽也不会触发。如果我在端口下发送另一个\r\n,插槽将触发。 例如,有时我会 ls 某事,命令名称将从端口读回,但文件夹的内容在那里处于不确定状态,直到我再次点击返回。然后我得到目录列表和两个提示。

这是我的代码:

void Logic::onReadyRead(){        
        QByteArray incomingData;  
        incomingData = port->readAll();
        QString s(incomingData);
        emit dataAvailable(s);// this is a Qt slot if you don't know what it is.
        qDebug() << "in:"<< s.toLatin1();     
}

void Logic::writeToTerminal(QString string )
{
    string.append( "\r\n");
    port->write((char*)string.data(), string.length());
    if ( port->bytesToWrite() > 0){
        port->flush();
    }
    qDebug() << "out:" << string.toLatin1();
}

【问题讨论】:

  • 我刚刚意识到可能不太清楚,这些都是不相关的问题。 Shell 会告诉我它不能去/applica 因为没有这样的目录存在
  • 您需要缓冲从端口读取的数据,直到遇到 ,这可能需要从端口多次读取。

标签: c++ qt serial-port qtserialport


【解决方案1】:

我找到了解决方案,我怀疑是编码错误,但我不确定。发送 QByteArray 可以解决这两个问题,而不是通过串行端口发送 QString。我更改了writeToTerminal() 方法:

void Logic::writeToTerminal(QString string )
{
    string.append( "\r");
    QByteArray ba = string.toAscii();
    port->write(ba);
}

【讨论】:

    【解决方案2】:

    this forum 看来,有时并非所有数据都已发送,并且发送的任何数据都附加了一个“\0”。所以如果

    cd /applica'\0' 被发送,然后port-&gt;readAll() 会停在那里,因为它认为它已经阅读了所有内容。

    该论坛上的一个建议答案是逐行阅读,您的代码几乎就是这样做的。因此,我认为在您的情况下,您可以将代码更改为:

    void Logic::onReadyRead(){        
        QByteArray incomingData;  
        if(port->canReadLine()) {
          incomingData = port->readLine();
          QString s(incomingData);
          emit dataAvailable(s);// this is a Qt slot if you don't know what it is.
          qDebug() << "in:"<< s.toLatin1();
        }     
    }
    
    void Logic::writeToTerminal(QString string )
    {
        string.append( "\r\n");
        port->write((char*)string.data(), string.length());
        if ( port->bytesToWrite() > 0){
            port->flush();
        }
        qDebug() << "out:" << string.toLatin1();
    }
    

    【讨论】:

    • 我建议不要在不指定编码的情况下盲目地从 QByteArray 转换为 QString ,反之亦然。例如。写作时:QByteArray data = s.toUtf8(); //explicitly convert to UTF-8;并检查返回值:const qint64 written = port-&gt;write(data.constData(), data.length());
    • @maditya,我曾尝试逐行阅读,但它并没有解决我的问题。它的效果比 port-&gt;readAll() 稍微差一点,不过还是谢谢
    猜你喜欢
    • 2011-05-24
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多