0

組み込みの FriendlyARM ベースのプロセッサ システム用の C++ プログラムを開発する必要があります。デスクトップコンピュータには Qt Creator 3.0.0 (Qt 5.2.0 ベース) を使用しています。私のプログラムは、Mini2440 FriendlyARM プロセッサのシリアル ポートから読み取ることができるはずです。

ターゲット システム (組み込みシステム) に移動する前に、ラップトップのシリアル ポートの読み取りと書き込みを試みました。私の主な問題は、シリアルポートから読み取る方法です。ご存知のように、新しいコンピュータやラップトップにはシリアル ポートがありません。そのため、手作りの USB-シリアル アダプタ ケーブルを使用して、シリアル ポート プログラミングをシミュレートしようとしています。USBシリアルケーブルを差し込むと、Ubuntuでは「/dev/ttyUSB0」として認識されます。うまくいきそうです。ケーブルのもう一方の端 (シリアル ポート) はどこにも接続されていないことに注意してください。

私の最初の質問は次のとおりです。このようにケーブルを構成しても問題ありませんか、それとも他のデバイスに接続する必要がありますか? 10 秒ごとに /dev/ttyUSB0 に書き込み、データを読み取ろうとします。私は次のコードになりました:

void MainWindow::refreshNotificationArea()
{
    generateNotifAreaData(); // a typical random data-generator
    QList<QSerialPortInfo> L = QSerialPortInfo::availablePorts();
    for (auto e : L)
        qDebug() << e.portName() << '\n'; // it prints 1 serial port: :ttyUSB0
    // write to the port
    QSerialPort notifAreaPort;
    // 1. set properties
    notifAreaPort.setBaudRate(QSerialPort::Baud9600); 
    notifAreaPort.setStopBits(QSerialPort::OneStop);
    notifAreaPort.setParity(QSerialPort::NoParity); 
    notifAreaPort.setDataBits(QSerialPort::Data8);
    notifAreaPort.setFlowControl(QSerialPort::NoFlowControl); 
    QObject::connect(&notifAreaPort,SIGNAL(error(QSerialPort::SerialPortError)),
    this, SLOT(errorReport(QSerialPort::SerialPortError)));
    notifAreaPort.setPortName(serial_device.c_str());
    // 2. open port
    notifAreaPort.open(QIODevice::ReadWrite);
    if (!notifAreaPort.isOpen())
        qDebug() << "Open failed"; // open is OK, no error message printed

    string s  = convertNotifAreadData2Str();
    qDebug() << "Generated data " << s.c_str(); // OK
    int a = notifAreaPort.write(s.c_str()); // write done
    qDebug() << "Write count" << a; // OK

    // now read the info

    QByteArray ba = notifAreaPort.readLine(3); // read failed
    QSerialPort::SerialPortError err = notifAreaPort.error();
    qDebug() << "Error code" << err;
    qDebug() << "What? " << notifAreaPort.errorString();
    qDebug() << "Read count " << ba.size(); // 0

    notifAreaPort.close();
}

void MainWindow::errorReport(QSerialPort::SerialPortError error)
{
    if(error!=0)
        qDebug()<<"ERROR:"<<endl<<error; // nothing printed
}

シリアルポートへの書き込みはOKです。しかし、読み込み時に「そのようなファイルやディレクトリはありません」という問題が発生することがあります。ときどき「ファイルが一時的に利用できません! 奇妙なことに、notifAreaPort.error() は 0 を返します。これは、エラーが発生していないことを意味します!

考え?

-- サイード・アムローラヒ・ボヨウキ

4

3 に答える 3

-1

「手作りの USB - シリアル アダプター」 - 面白そうですね。これは正しく動作しますか? PIN 2(Rx) と 3(Tx) を接続してデータを取得するのは良い考えだと思います。これで、他の端末ソフトウェアでデバイスをテストできます。私はシリアル ポートに常に readyRead() シグナルを使用し、port->bytesAvailable() で読み取る前にチェックします。そして、port->open(QIODevice::ReadWrite | QIODevice::Unbuffered) でポートを開きます。

于 2014-02-08T11:08:11.297 に答える