3 votes

QSerialPort est utilisé avant le démarrage de l'application.

Je suis en train de développer une application pour Apalis iMX6 avec Qt C++ sous Linux et j'ai ajouté cette application dans le démarrage au moyen de profile.d

ce code doit mettre ttymxc1 en mode RS485 comme ci-dessous :

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;
}

cette fonction fonctionne également et ne pose aucun problème. mais lorsque j'essaie d'ouvrir le port série parfois Pendant le démarrage de l'application, je n'ai pas pu obtenir ce port série et QSerialPortInfo m'a montré que ttymxc1 est en cours d'utilisation :

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 Le signal " " sera émis avec la valeur " PermissionError "

mais mystérieusement "ls -l /proc/[0-9] /fd/ |grep /dev/ttymxc1" me montre que ttymxc1 est utilisé par mon application.

il n'y a pas d'application qui fonctionne avec le port série et mon application est juste pour une exécution unique.

Y a-t-il une idée ?

Gracias

0voto

CppLn Points 1

Vous devez appeler close() sur m_serialPort lorsque vous fermez votre application. Sinon, votre port série conservera l'état d'utilisation.

0voto

Ali Taroosheh Points 31

J'ai trouvé un nouveau remède, et je veux le partager ici.

dans le constructeur de SerialClass j'ai ajouté initSerial() De cette façon, l'application, au début du démarrage, ouvrira l'application ttymxc1 .

Il n'y a plus de problème avec une telle solution.

Je n'ai pas ce problème avec Raspberry Pi (Raspberry Pi3 + Qt 5.6 + Raspbian). Mais Toradex Apalis est d'une autre manière.

Pouvez-vous me dire pourquoi ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X