0

privateSerialを使用してメンバー関数を介してポートを開くことができるクラスがあります。Serial::openPort()QSerialPort serial_stream

bool Serial::openPort(std::string port)
{
    std::string realPort = "/dev/" + port;
    if(isOpen()) {
        return true;
    }
    serial_stream.setPortName(QString(realPort.c_str()));
    bool loc = serial_stream.open(serial_stream.ReadWrite);
    serial_stream.setFlowControl(serial_stream.HardwareControl);
    serial_stream.setStopBits(serial_stream.OneStop);
    serial_stream.setParity(serial_stream.NoParity);
    serial_stream.setDataBits(serial_stream.Data8);
    serial_stream.setBaudRate(defaultBaud);
    open = loc;
    return loc;
}

メソッド送信:

bool Serial::send(unsigned char data[])
{
    if(!isOpen()) {
      return false;
    }
    int size = BUFFER_SIZE;
    char loc[size];
    for(int p = 0; p<size; p++) {
       loc[p] = data[p];
    }
    int check = serial_stream.write(loc, size);
    if(check != size) {
        return false;
    }
    return true;
}

socat 経由で仮想ポートを開きます:

Terminal 1: socat -d -d pty,raw,echo=0 pty,raw,echo=0
Terminal 2: cat < /dev/pts/2

次に、テスト関数で次のことを行います。

bool b = Serial::instance().openPort("pts/3");
cout << b << endl;//-> "true"
unsigned char data[8] = {'a','b','c','d','e','f','g','h'};
bool sent =  Serial::instance().send(data);

だから私が欲しかったのは、クラスでポートを開いてdata送信できることでした。b はそうで、ポートを開くことができました。しかし、送信したいときは、次の情報を取得します。pts/2pts/3QSerialPortSerialtrueQSerialPortdata

QIODevice::write (QSerialPort): device not open

RSR232ケーブルと別のコンピューターでコードをテストしたので、問題はsocatの間違った使用に関係していると思います。

あなたの助けに感謝します。

編集: code_fodder からの最初の (いいえ) 回答の後、私は彼が私にやるように言ったことを行い、私の に for ループを追加しましたinitTestCase():

void tst_serial::initTestCase() {
    cout << "Testfälle gestartet" << endl;
    QList<QSerialPortInfo> ports = QSerialPortInfo::availablePorts();
    cout << "for: " << ports.count() << endl;//-> for: 0
    for (int n=0; n > ports.count(); n++)
    {
        cout << ports[n].portName().toStdString() << ports[n].description().toStdString() << endl;
    }
}

私がコメントしたように、利用可能なポートの数は 0 です (これは正しい方法ではないことが予想されます)。しかし、なぜSerial::instance().openPort("pts/3");true を返すのでしょうか?

今言ったように、それは socat と関係があるに違いありません...

4

2 に答える 2

1

必ずしも答えではない

しかし、例を追加するにはこのスペースが必要でした。

どのポートが利用可能かを判断するために Qt 関数を使用しようとしましたか? これは、USBシリアルポートを見つけるために使用する関数の例です(必要に応じて、ループはc ++ 11を使用して元に戻すことができます)...

QList<QString> QSerialComs::getUsbSerialPortsList()
{
    QList<QString> usbSerialPorts;
    for (auto serialPortInfo: QSerialPortInfo::availablePorts())
    {
        qDebug() << "Port" << serialPortInfo.portName()
                 << "Desc: " << serialPortInfo.description()
                 << endl;

        if (serialPortInfo.description().contains("USB"))
        {
            usbSerialPorts.append(serialPortInfo.portName());
        }
    }

    return usbSerialPorts;
}

ここで重要な部分は、すべてのポート名と説明を出力して、使用可能なポートを確認できるようにすることです...シリアル通信を設定するときにこれが役立つと思います.socatツールを確認するために使用できます.. .

于 2016-03-07T08:01:22.653 に答える
0

問題はfilterPorts()、開いているポートを閉じてテストクラスで呼び出されたクラス Serialの関数でした

于 2017-01-09T17:33:19.777 に答える