我正在开发一个应用程序,它从连接在Windows 7的SerialPort上的设备(微控制器)读取数据,并将所有读取的数据显示在基于Qt的UI应用程序中。
环境:Qt:Qt 5.6.0操作系统:Windows 7
在从Windows串行端口执行连续读取之前。 我实现了一个testing应用程序,使用QSerialPort类button按下(在Qt GUI中的某个button)从串行端口读取数据,它工作正常。
因此,我开始实施从串口连接的设备连续读取示例:1.连接PushButtonbutton。 连接到设备。 2.开始按下button。 开始阅读。 3.停止按下button。 停止阅读。
在这里,我的代码与我的testing应用程序相同,但连续阅读。 当我连接到设备(Connect Push Button press)时,我实现了QSocketNotifierfunction。 以下是相同的代码:
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串口; 是在类标题文件中定义的公共variables。
这里问题是SLOT连接到SocketNotifier的onReadData()永远不会被调用。 在我看来,激活(int)信号从不发射。
我做了一些谷歌和一个链接,我发现QSocketNotifier不适用于在Windows上读取串行端口。 由于链接很旧所以想确认。 http://www.archivum.info/qt-interest@trolltech.com/2008-03/00128/Re-QSocketNotifier.html
请告诉我做错了什么?
谢谢,
你不需要在Qt中使用串口的QSocketNotifier
。
QSerialPort
从QSerialPort
继承,所以你可以连接它的信号readyRead()
到你的插槽onReadData
。
在Windows上, QSocketNotifier
似乎只适用于套接字,因为它在内部使用WinSock2函数。 对于其他窗口句柄,可以使用QWinEventNotifier
( QSerialPort
具有类似的私有类QWinOverlappedIoNotifier
)。