我正在尝试读取/写入支持RS-232的设备。这在Linux上没有问题。该设备通过Digitus USB /串行适配器连接。
设备在设备管理器中显示为COM4。
void PayLife::run() {
this->sendingData = 0;
this->running = true;
qDebug() << "Starting PayLife Thread";
this->port = new AbstractSerial();
this->port->setDeviceName(this->addy);
QByteArray ba;
if (port->open(AbstractSerial::ReadWrite| AbstractSerial::Unbuffered)) {
if (!port->setBaudRate(AbstractSerial::BaudRate19200)) {
qDebug() << "Set baud rate " << AbstractSerial::BaudRate19200 << " error.";
goto end_thread;
};
if (!port->setDataBits(AbstractSerial::DataBits7)) {
qDebug() << "Set data bits " << AbstractSerial::DataBits7 << " error.";
goto end_thread;
}
if (!port->setParity(AbstractSerial::ParityEven)) {
qDebug() << "Set parity " << AbstractSerial::ParityEven << " error.";
goto end_thread;
}
if (!port->setStopBits(AbstractSerial::StopBits1)) {
qDebug() << "Set stop bits " << AbstractSerial::StopBits1 << " error.";
goto end_thread;
}
if (!port->setFlowControl(AbstractSerial::FlowControlOff)) {
qDebug() << "Set flow " << AbstractSerial::FlowControlOff << " error.";
goto end_thread;
}
while(this->running) {
if ((port->bytesAvailable() > 0) || port->waitForReadyRead(900)) {
ba.clear();
ba = port->read(1024);
qDebug() << "Readed is : " << ba.size() << " bytes";
}
else {
qDebug() << "Timeout read data in time : " << QTime::currentTime();
}
}
}
end_thread:
this->running = false;
}
在Linux上,我不使用QSerialDevice,只是常规的串行读/写。
无论如何,我总是得到:
Starting PayLife Thread
Readed is : 0 bytes
Timeout read data in time : QTime("16:27:43")
Timeout read data in time : QTime("16:27:44")
Timeout read data in time : QTime("16:27:45")
Timeout read data in time : QTime("16:27:46")
我不确定为什么。
请注意,我首先尝试使用常规Windows API读取和写入相同的结果,即它只是没有准备好来自设备的任何数据。
我100%确定始终可以从设备中读取内容,因为它会在连接中发送ENQ。
答案 0 :(得分:1)
如果您尚未生成QSerialDevice
的doxygen文档,则应生成该文档。这个问题似乎在那里得到解释。
在无缓冲模式的Windows上:
必须避免
CharIntervalTimeout
和TotalReadConstantTimeout
的值AbstractSerial::read()
等于0.理论上,计划在 零值的超时方法AbstractSerial
将读取 缓冲设备驱动程序中的数据(不要混淆 缓冲区read
!)并立即返回它们。但对于 原因不明,这个读数总是返回0,不依赖于 是否在缓冲区中存在现成数据。
因为waitForReadyReady
在无缓冲模式下等待数据,我猜{{1}}在该模式下没有做任何有用的事情。