Не удается написать, чтобы открыть QSerialPort, используя socat

У меня есть класс Serial, в котором я могу открыть порт через функцию-член 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 в pts/2 через открытый порт pts/3 с QSerialPort в классе Serial. b равно true, поэтому QSerialPort смог открыть порт. Но когда я хочу отправить data, я получаю следующую информацию:

QIODevice::write (QSerialPort): device not open

Я думаю, что проблема должна быть как-то связана с неправильным использованием socat, потому что мы уже тестировали код с кабелем RSR232 и другим компьютером.

Был бы признателен за вашу помощь.

РЕДАКТИРОВАТЬ: после первого (нет) ответа от 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?

Как я только что сказал, это должно быть как-то связано с сокат...


person goulashsoup    schedule 06.03.2016    source источник


Ответы (2)


Не обязательно ответ

Но нужно это место, чтобы добавить пример.

Вы пытались использовать функции Qt, чтобы определить, какие порты доступны? Вот пример функции, которую я использую для поиска последовательных портов USB (в цикле используется С++ 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. .

person code_fodder    schedule 07.03.2016

Проблема заключалась в функции filterPorts() в классе Serial, которая закрывала открытый порт и вызывалась в тестовом классе.

person goulashsoup    schedule 09.01.2017