4

我正在编写一个 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();
}
4

2 回答 2

2

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

void Logic::writeToTerminal(QString string )
{
    string.append( "\r");
    QByteArray ba = string.toAscii();
    port->write(ba);
}
于 2013-08-05T17:56:12.190 回答
0

这个论坛,似乎有时并非所有数据都被发送,并且无论发送什么都附加了一个'\ 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();
}
于 2013-08-03T00:04:38.000 回答