3

ハードウェアで FTDI シリアル ポート CHIP を使用しています。現在、Linux で動作するコードがあり、Windows 7 に移行しました。奇妙な問題がいくつか発生します。

問題: これを行う他のコンソール アプリケーションを実行しないと、シリアル ポートにデータを書き込むことができません。

 serial.setPortName("COM3");
        if (serial.open(QIODevice::ReadWrite)) {
            bool success = serial.setBaudRate(QSerialPort::Baud9600) &
            serial.setStopBits(QSerialPort::OneStop) &
            serial.setDataBits(QSerialPort::Data8) &
            serial.setParity(QSerialPort::NoParity) &
            serial.setFlowControl(QSerialPort::NoFlowControl);
            qDebug() << "Connected to usb device: " << (success ? "OK" : "FAIL");

           while(true) {
                if(serial.waitForReadyRead(-1)) {
                    QByteArray out = serial.readAll();
                    for(int i=0; i< out.length(); i++) {
                        qDebug() << (int) out[i];
                    }
                }
            }
            serial.close();

だから、すべてを読んでループするだけです。ハードウェアは何も送信しないため、読み取りは無限ループにすぎません。書き込みプログラムを閉じて実行すると、正しく実行されます。

char* input;
input = new char[size+3];
QByteArray bytearr;

for(int i=0;i<size+2;i++) {
    input[i] = (char) package[i];
    bytearr.append((unsigned char) package[i]);
}


QString serialPortName = "COM3";
QSerialPort serialPort;
serialPort.setPortName(serialPortName);
serialPort.open(QIODevice::ReadWrite);
serialPort.write(bytearr);
serialPort.flush();
serialPort.close();

read all を実行すると動作しますが、read all を実行しないと動作しません。私たちは何を間違っていますか?ありがとう。

4

2 に答える 2

2

FTDIチップを搭載したボードを使用したアプリケーションで同様の問題が発生しました。19200 ボー/秒でバイトを書き込もうとしましたが、実際には約 1200 ボー/秒でした (オシロスコープを使用して確認)。問題は、バイトを書き込んだ直後にシリアル ポートを閉じることでした。ポートを閉じる前に QThread::msleep(5) を使用して待機するだけで解決しました。クローズ操作中にデバイスがリセットまたは何かを取得し、最新のバイトが誤ったボーレートおよびその他のパラメーターで送信されているようです。

于 2015-02-10T09:13:49.623 に答える
1

QT シリアル ポート SW を機能させるには、QT イベントを処理する必要があることがわかりました。読み取りの前に qApp->processEvents() をループに入れると、うまくいきました。

(Windows-7 上の QT 4.8.5)

于 2014-04-15T11:02:41.867 に答える