4

シリアル ポート経由で別のコンピューターと通信する Qt アプリケーションを作成しています。私には2つの本当の問題があります。

1. データを正常に送受信できますが、シリアル ポートが入力の一部を「食べる」ことがあります。たとえば、私が送信した場合:

cd /application/bin

場合によっては (常にではありません)、次のもののみを受け取ります。

cd /applica

(これは端末であるため、入力をエコー バックします。また、私のプロンプトは、明らかに間違った場所にいることを示しています。)

2. また、受信できるデータがあることを知っていても、利用可能なデータがあるときに起動する Qt スロットが起動しないことがあります。別のポートを送信\r\nすると、スロットが起動します。たとえばls、コマンド名がポートから読み返されることがありますが、もう一度リターンを押すまで、フォルダーの内容はそこに置かれています。次に、ディレクトリのリストと 2 つのプロンプトを取得します。

これが私のコードです:

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

0

このフォーラムから、すべてのデータが送信されるとは限らず、送信されるデータには「\0」が追加されることがあるようです。だからもし

cd /applica'\0' が送信された場合、port->readAll()すべてを読み取ったと見なされるため、そこで停止します。

そのフォーラムで提案された答えの 1 つは、コードがほとんど行っているように、1 行ずつ読むことでした。あなたの場合、コードを次のように変更できると思います。

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 に答える