在 Linux 中使用 Qt 的 Close() 文件描述符

Posted

技术标签:

【中文标题】在 Linux 中使用 Qt 的 Close() 文件描述符【英文标题】:Close() filedescriptor using Qt in Linux 【发布时间】:2011-04-07 13:45:55 【问题描述】:

背景资料:

我一直在编写代码来控制通过 USB 电缆连接但模拟 RS-232 串行端口的设备。

有问题的设备是一个 Arduino 微控制器控制的伺服平移和倾斜平台(但这并不重要)。

我已经设法使用 C++ 语言和在NetBeans IDE 中设置的 g++ 编译器使用以下代码将字符写入 USB 模拟串行端口:

    #include <cstdlib>
    #include <stdio.h>   /* Standard input/output definitions */
    #include <string.h>  /* String function definitions */
    #include <unistd.h>  /* UNIX standard function definitions */
    #include <fcntl.h>   /* File control definitions */
    #include <errno.h>   /* Error number definitions */
    #include <termios.h> /* POSIX terminal control definitions */

    /*
     * 'open_port()' - Open serial port 1.
     *
     * Returns the file descriptor on success or -1 on error.
     */

    int
    open_port(void)
    
        int fd; /* File descriptor for the port */

        fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);
        if (fd == -1)
        
            /*
            * Could not open the port.
            */

            perror("open_port: Unable to open /dev/ttyUSB0 - ");
        
        else
            fcntl(fd, F_SETFL, 0);

        int pannumber = 90;
        char str[256];
        int tiltnumber = 90;
        char str2[256];
        char panchar = 0xA5;
        char tiltchar = 0xA5;

        while (tiltchar != 0x00) 
            printf ("Enter the pan number: ");
            gets ( str );
            printf ("\n");
            pannumber = atoi ( str );

            printf ("Enter the tilt number: ");
            gets ( str2 );
            printf ("\n");

            tiltnumber = atoi ( str2 );
            panchar = (char) pannumber;
            tiltchar = (char) tiltnumber;
            int n = 0;
            char mydata[] =  'U' , 'U' , 'U' , 'U' , panchar , tiltchar ;
            n = write(fd, mydata, 6);
            if (n < 0)
            fputs("write() of 6 bytes failed!\n", stderr);
        
        close(fd);
        return (fd);
    

这很好用:(“UUUU”字符用于与在 arduino 上运行的草图握手,接下来的两个字符设置伺服角度)。

问题:

我尝试使用 Qt Creator 和两个图形滑块来做同样的事情,它们的值在 0 到 180 之间,它们被转换为字符并按上述方式发送。

这也可以,但是在使用 Qt creator IDE 编译时它不喜欢 close(fd);命令。如果我将此行注释掉,程序可以工作,但最终它会抱怨打开的文件太多。

Qt代码:

void MainWindow::TiltValueChangedHandler() 
    tiltValue =   ui->verticalSlider->value();
    panValue = ui->horizontalSlider->value();
    ui->label_3->setText(QString::number(tiltValue));
    ui->label_4->setText(QString::number(panValue));

    panValue++; // To prevent the error when 0 is sent over serial to range is effectively 1 to 181.

    int fd; /* File descriptor for the port. */

    fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);
    if (fd == -1)
    
        /*
         * Could not open the port.
         */

        perror("open_port: Unable to open /dev/ttyUSB0 - ");
    
    else
        fcntl(fd, F_SETFL, 0);

    char panchar = (char) panValue;
    char tiltchar = (char) tiltValue;

    int n = 0;
    char mydata[] =  'U' , 'U' , 'U' , 'U' , panchar , tiltchar ;
    n = write(fd, mydata, 6);
    if (n < 0)
        fputs("write() of 6 bytes failed!\n", stderr);

    // close(fd);
    // above line has to be commented out or will not compile but file not does not close!
    return;
 

close(fd)没有被注释掉时的Qt编译器错误是:

错误:没有匹配的函数调用'MainWindow::close(int&)'

【问题讨论】:

听起来像是命名空间冲突。试试 ::close(fd)。 还有一点:通常我们以这种形式调用Qt。 QT 通常是 QuickTime。 【参考方案1】:

用途:

::close(fd);

QWidget::close使用全局关闭函数

【讨论】:

感谢这是正确的,现在可以编译了!但是我不确定我理解为什么 ::close(fd); 之前的空白这不是说 close(fd) 属于当前对象范围吗? 如果没有::,它会尝试使用QWidget的bool close(void);方法。当您添加 :: 时,您声明使用全局命名空间中的 close【参考方案2】:

您可能缺少来自Qt Creator 的 stdio.h。

【讨论】:

抱歉不清楚,我在这个函数之上有一系列的导入。

以上是关于在 Linux 中使用 Qt 的 Close() 文件描述符的主要内容,如果未能解决你的问题,请参考以下文章

请问怎么查看QT自带函数,QT里那些像close的函数怎么查看原代码?

QT中关闭应用程序和窗口的函数(quit(),exit()以及close()的区别)

Qt窗口及控件-窗口Close()自动释放

请教一个Linux下Qt关于multimedia的问题

请教一个Linux下Qt关于multimedia的问题

Qt 窗口属性简介之Qt::WA_DeleteOnClose