我正在开发一个应用程序,它从连接在Windows 7的SerialPort上的设备(微控制器)读取数据,并将所有读取的数据显示到基于Qt的UI应用程序中。
环境: Qt:Qt 5.6.0 操作系统:Windows 7
在从Windows串行端口实现连续读取之前。我使用QSerialPort类实现了一个测试应用程序,用于通过按下按钮(Qt GUI中的某个按钮)从串口读取数据,并且它正常工作。
所以我开始从串口连接的设备上实现连续读取示例: 1.连接PushButton按。连接到设备。 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;是类头文件中定义的公共变量。
这里的问题是SLOT onReadData()连接到SocketNotifier永远不会被调用。我觉得永远不会发出激活的(int)信号。
我做了一些谷歌,在一个链接上我发现QSocketNotifier不适用于Windows上的SerialPort读取。由于链接很老,所以想确认一下。 http://www.archivum.info/qt-interest@trolltech.com/2008-03/00128/Re-QSocketNotifier.html
请告诉我我做错了什么?
谢谢,
答案 0 :(得分:2)
您不需要在Qt中使用QSocketNotifier
串行端口。
QSerialPort
继承自QIODevice
,因此您可以将其readyRead()
信号连接到您的广告位onReadData
。
在Windows上,QSocketNotifier
似乎只适用于套接字,因为它在内部使用WinSock2函数。对于其他窗口句柄,您可以使用QWinEventNotifier
(QSerialPort
具有类似的私有类QWinOverlappedIoNotifier
)。