【问题标题】:QSerialPort is in use before application startsQSerialPort 在应用程序启动之前正在使用中
【发布时间】:2020-02-04 11:43:09
【问题描述】:

我正在 Linux 中使用 Qt C++ 为 Apalis iMX6 开发应用程序,我已通过 profile.d 将此应用程序添加到启动中

此代码必须将 ttymxc1 设置为 RS485 模式,如下所示:

int enableRS485(){  
    struct serial_rs485 rs485conf;
    int fd = open ("/dev/ttymxc1", O_RDWR);
    if (fd < 0) {
        printf("Error: Can't open: /dev/ttymxc1 %d\n",fd);
        return fd;
    }
    rs485conf.flags |= SER_RS485_ENABLED;
    rs485conf.flags &= ~(SER_RS485_RTS_ON_SEND);
    rs485conf.flags |= SER_RS485_RTS_AFTER_SEND;
    rs485conf.flags |= SER_RS485_RX_DURING_TX;
    err = ioctl (fd, TIOCSRS485, &rs485conf);
    if (err < 0) {
            printf("Error: TIOCSRS485 ioctl not supported.\n");
            return err;
    }
    err = close (fd);
    if (err < 0) {
            printf("Error: Can't close: /dev/ttyLP1 %d\n",err);
            return err;
    }
    return 0;
}

这个功能也很好用,没有问题。但是当我尝试在启动期间打开串行端口有时时,应用程序无法获取此串行端口,并且 QSerialPortInfo 显示 ttymxc1 正在使用中。我的串口初始化如下:

void SerialClass::initSerial()
{
    m_serialPort = new QSerialPort();
    enableRS485();
    sleep(1);
    m_serialPort->setPortName("/dev/ttymxc1");
    m_serialPort->setFlowControl(QSerialPort::NoFlowControl);
    m_serialPort->setBaudRate(9600);
    m_serialPort->setRequestToSend(false);
    bool res = m_serialPort->open(QIODevice::ReadWrite);
}

QSerialPort::errorOccured” 信号将发出值“PermissionError

但神秘地“ls -l /proc/[0-9]/fd/ |grep /dev/ttymxc1”显示我的应用程序正在使用 ttymxc1。

没有适用于串口的应用程序,我的应用程序只运行一次。

有什么想法吗?

谢谢

【问题讨论】:

    标签: c++ qt embedded


    【解决方案1】:

    当您关闭应用程序时,您需要在 m_serialPort 上调用 close()。否则你的串口将保持在使用状态。

    【讨论】:

    • 这个应用程序已经被profile.d添加到启动中,因此永远不会关闭,也不需要在关闭事件时关闭串口。无论如何,我也是这样做的,在应用过程中,关闭使串口关闭但什么都不会发生,
    【解决方案2】:

    我发现了一种新的治疗方法,所以我想在这里分享一下。

    在SerialClass构造函数中我已经添加了initSerial(),这样应用程序在开始启动时,会打开ttymxc1

    这样的解决方案没有更多问题。

    我对 Raspberry Pi(Raspberry Pi3 + Qt 5.6 + Raspbian)没有这样的问题。但是 Toradex Apalis 是另一种方式。

    请告诉我为什么?

    【讨论】:

      猜你喜欢
      • 2014-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多