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