QSerialPort используется до запуска приложения - PullRequest
3 голосов
/ 04 февраля 2020

Я разрабатываю приложение для Apalis iMX6 с Qt C ++ в Linux, и я добавил это приложение в автозагрузку с помощью 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 используется моим приложением.

нет приложение, которое работает с последовательным портом, и мое приложение запускается только один раз.

Есть идеи?

Спасибо

Ответы [ 2 ]

0 голосов
/ 08 февраля 2020

Я нашел новое лекарство, поэтому хочу поделиться им здесь.

в конструкторе SerialClass Я добавил initSerial () , таким образом, приложение в начале при запуске откроется ttymxc1 .

Больше нет проблем с таким решением.

У меня нет такой проблемы с Raspberry Pi (Raspberry Pi3 + Qt 5.6 + Распбиан). Но Торадекс Апалис по-другому.

Скажите, пожалуйста, почему?

0 голосов
/ 06 февраля 2020

Вам нужно вызвать close () на m_serialPort, когда вы закрываете свое приложение. В противном случае ваш последовательный порт будет оставаться в рабочем состоянии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...