Qt串口通讯

时间:2013-08-02 23:11:59

标签: c++ qt serial-port qtserialport

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

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();
}

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

this forum开始,似乎有时并非所有数据都被发送,并且发送的内容都附加了'\ 0'。所以,如果

  

cd / applica'\ 0'   发送后,port->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();
}