C++ QSocketnotifier在windows上无法读取串行端口?

C++ QSocketnotifier在windows上无法读取串行端口?,c++,windows,qt,C++,Windows,Qt,我正在开发一个应用程序,从连接在Windows7串行端口上的设备(微控制器)读取数据,并将所有读取的数据显示到基于Qt的UI应用程序中 环境: Qt:Qt 5.6.0 操作系统:Windows7 在实现从Windows串行端口的连续读取之前。我使用QSerialPort类实现了一个测试应用程序,用于在按下按钮(QtGUI中的一些按钮)时从串行端口读取数据,并且它工作正常 因此,我开始从串行端口连接的设备执行连续读取示例: 1.连接按钮按钮。连接到设备。 2.启动按钮按下。开始阅读。 3.停止按钮

我正在开发一个应用程序,从连接在Windows7串行端口上的设备(微控制器)读取数据,并将所有读取的数据显示到基于Qt的UI应用程序中

环境: Qt:Qt 5.6.0 操作系统:Windows7

在实现从Windows串行端口的连续读取之前。我使用QSerialPort类实现了一个测试应用程序,用于在按下按钮(QtGUI中的一些按钮)时从串行端口读取数据,并且它工作正常

因此,我开始从串行端口连接的设备执行连续读取示例: 1.连接按钮按钮。连接到设备。 2.启动按钮按下。开始阅读。 3.停止按钮按下。停止阅读

这里我的代码和我的测试应用程序一样,只是为了继续阅读。当我连接到设备时(连接按钮按下),我实现了QSocketNotifier功能。以下是相同的代码:

bool Test::openPort()
{
    bool result = false;

    //SerialPortManager: Class to Open, Read, Write to the device connected at Serial Port
    if(serialPortManager != NULL) 
    {
        result = serialPortManager->open(); // Returns TRUE

        if(operationSuccessful)
        {
            //socketNotifier  pointer defined in TestClass.h file
        socketNotifier = new QSocketNotifier(serialPortManager->getSerialPortFileDescriptor(), QSocketNotifier::Read);
            connect(socketNotifier , SIGNAL(activated(int)), this, SLOT(onReadData()));

        socketNotifier ->setEnabled(true);
        }
    }

    return result ;
}

qint32 SerialPortManager::getSerialPortFileDescriptor()
{
    int readFileDescriptor = _open_osfhandle((qintptr)serialPort.handle(), _O_RDONLY | _O_WRONLY);

    return readFileDescriptor;
    //return (qintptr)serialPort.handle();
}
其中QSerialPort serialPort;是在类头文件中定义的公共变量

这里的问题是连接到SocketNotifier的插槽onReadData()从未被调用。在我看来,激活的(int)信号从未发出

我在谷歌上做了一些搜索,在一个链接上我发现QSocketNotifier不适用于Windows上的串行端口读取。由于链接非常旧,所以希望确认。

请告知我做错了什么


谢谢,

您不需要在Qt中使用带有串行端口的
QSocketNotifier

QSerialPort
继承自
QIODevice
,因此您可以将其信号
readyRead()
连接到插槽
onReadData


在Windows上,
QSocketNotifier
似乎只适用于套接字,因为它在内部使用WinSock2函数。对于其他窗口句柄,可以使用
QWinEventNotifier
QSerialPort
具有类似的私有类
qwinoverlappedinotifier
)。

socketNotifier=new QSocketNotifier(serialPortManager->getSerialPortFileDescriptor(),QSocketNotifier::Read,this)在这段代码中,我把帕伦特放在那个样的位置,哈罗·H·加萨米,谢谢你们的回复。我加上了“这个”家长,但没用。仍然没有调用插槽onReadData()。下面是我用来获取文件描述符的代码,希望它有助于解决问题:。qint32 SerialPortManager::getSerialPortFileDescriptor(){int readFileDescriptor=_open_osfhandle((qintpttr)serialPort.handle(),_O_RDONLY | O_WRONLY);return readFileDescriptor;//return(qintpttr)serialPort.handle()}我在qt中使用套接字编程时也会这样做。首先,我为连接到类中的套接字做了一个配置。然后在主窗口中打开套接字并设置套接字通知程序<代码>串行端口>openport();通知程序=新的QSocketNotifier(serialport->fd,QSocketNotifier::Read,this);通知程序->设置启用(真);连接(此->通知程序、信号(已激活(int))、此、插槽(ReadAndProcessData())并且在插槽运行之后,您应该再次启用通知程序。您好H.Ghassami。我无法理解点“连接到套接字的配置”??我的应用程序有一个类“SerialPortManager”,其中包括QSerialPort类。我使用这个类打开设备的串行端口。端口已成功打开。现在,在另一个名为Test的类中,派生自QOBject(MainWindow是另一个类),我正在创建一个socketNotifier,并将其连接到无法工作的插槽。这里你能解释一下你提到的配置是什么吗?你能和我分享Windows的示例吗?提前感谢,感谢H.Ghassami帮助我更好地理解SocketNotifier。