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

我认为这个问题一定与使用 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 ?

就像我刚才说的,它一定和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;
}

这里的重要部分是打印出所有端口名称和描述,以便您可以查看哪些端口可供您使用...我发现这在设置串行 com 时很有帮助,您可以使用它来确认您的 socat 工具。 .

于 2016-03-07T08:01:22.653 回答
0

问题是 Serial 类中的一个函数filterPorts(),它关闭了打开的端口并在 testclass 中调用

于 2017-01-09T17:33:19.777 回答