QSerialPort не может открыться с кодом ошибки 11 - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь связаться с устройством, которое предоставило последовательный порт.Когда я использую программу примера C, предоставленную производителем устройства, она была успешно подключена, и я могу отправлять / получать данные.Но когда я использую свою программу на C ++ с QSerialPort, метод open() вернул false, а error() вернул 11 (Произошла неопознанная ошибка, как описано в документации Qt ).Может ли кто-нибудь помочь мне?

  • ОС: Cent OS 6,9
  • ГЦК / г ++: 4,8
  • Qt: 5,6,0

Пример соединения с QSerialPort:

#include <qserialport.h>
#include <qstring.h>

int main(int argc, const char *argv[])
{
    QString portName = "/dev/corser/x64ExpCL4x1_s0";
    QSerialPort *pSerial = new QSerialPort();
    pSerial->setPortName(portName);
    pSerial->setBaudRate(QSerialPort::Baud9600);
    pSerial->setParity(QSerialPort::NoParity);
    pSerial->setDataBits(QSerialPort::Data8);
    pSerial->setStopBits(QSerialPort::OneStop);
    pSerial->setFlowControl(QSerialPort::NoFlowControl);
    bool success = pSerial->open(QIODevice::ReadWrite);
    if (!success) {
        printf("Error: %d\n", pSerial->error());
    } else {
        printf("Success.\n");
        pSerial->close();
    }
    delete pSerial;
    return 0;
}

Эта программа выводит на печать Error: 11.


Вот программа на C, взятая из устройствапример программы.Эта программа просто пытается подключить последовательный порт, а затем закрыть соединение.Хотя оригинальный пример программы сложен.На самом деле это своего рода «Терминальная» программа, которая отправляет пользовательские команды на устройство и распечатывает ответы с устройства.

#include <unistd.h>
#include <termios.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <pthread.h>

#include <sys/ioctl.h>
#include <ctype.h>          /* Character types */


#define TRUE 1
#define FALSE 0

typedef struct 
{
    int     open;           // Flag for current open status of port 
    int     update;         // Flag indicating parameter changes    
    char    *port;          // Current port to be opened            
    int     iod;            // I/O index for open device port       
    struct  termios stty;   // Terminal port control structure      
} SCOM_CTL;

struct termios ttctl = {0};
struct termios ttsav = {0};
struct termios coctl = {0};
struct termios cnctl = {0};

#define OPEN            1
#define CLOSE           2
#define UPDATE          3
#define NO_UPDATE       4

SCOM_CTL scom;

int main( int argc, char **argv )
{
    scom.port = "/dev/corser/x64ExpCL4x1_s0";
    scom_init();
    scom_open_port();

    if (scom.open == OPEN) 
    { 
        fputs("\rSuccess.\r\n", stdout);
        scom_close_port(scom.iod);
    }
    else
    {
        fputs("\rError.\r\n", stdout);
    }
}

// Initialize the console (stdin) for raw access.
int scom_init()
{
    int i;
    scom.open = CLOSE;
    scom.update = NO_UPDATE;
    scom.iod  = -1;
    tcgetattr(0, &coctl);   // Save a copy to restore stdin.
    tcgetattr(0, &cnctl);
    cfmakeraw( &cnctl);     // Set stdin to raw !
    tcsetattr(0, 0, &cnctl);    
}

int scom_open_port()
{
    int i, iod;

    if (scom.open == OPEN) 
    {
        close(scom.iod);
        scom.open = CLOSE;
    }

    if ( (iod = open( scom.port, (O_RDWR | O_NOCTTY))) == -1) 
    {
        conres();       /* Reset the console. */
        fputs("term : Open Failure on device\n", stdout);
        return -1;  
    }

    scom.iod = iod;
    scom.open = OPEN;
    scom.update = NO_UPDATE;
}

int scom_close_port()
{
    scom.open = CLOSE;
    close(scom.iod);
}

int conres()
{
    return(tcsetattr(0, 0, &coctl));
}

Эта программа печатает Success.

...