C++ QSerialPort::readLine不';无法在MS Windows上按预期工作
我正在尝试通过USB串行电缆将微控制器连接到我的台式电脑。 我的台式电脑的操作系统是Windows 8.1,USB串行电缆是TTL-232R-3V3。(FTDI) (Qt版本:5.2.0 beta1,QtCreator版本:3.0,编译器:MSVC2012) 现在我正在尝试读/写环回测试,这就是为什么USB串行电缆的RX/TX引脚相互连接的原因 这是我的密码C++ QSerialPort::readLine不';无法在MS Windows上按预期工作,c++,qt,serial-port,qtserialport,C++,Qt,Serial Port,Qtserialport,我正在尝试通过USB串行电缆将微控制器连接到我的台式电脑。 我的台式电脑的操作系统是Windows 8.1,USB串行电缆是TTL-232R-3V3。(FTDI) (Qt版本:5.2.0 beta1,QtCreator版本:3.0,编译器:MSVC2012) 现在我正在尝试读/写环回测试,这就是为什么USB串行电缆的RX/TX引脚相互连接的原因 这是我的密码 #include <QtCore/QCoreApplication> #include <QtSerialPort/QS
#include <QtCore/QCoreApplication>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
#include <QtCore/QDebug>
#define PORT_NAME "COM3"
#define BAUDRATE 19600
#define TIMEOUT_MS 1000
QT_USE_NAMESPACE
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QSerialPort pSerial(PORT_NAME);
const char strMsg[] = "#1:Send data line \n #2:Send data line\n #3:Send data line end\n";
char strBuf[256];
qint64 nByte;
if(pSerial.open(QIODevice::ReadWrite)){
pSerial.setBaudRate(BAUDRATE);
qDebug() << "OPEN PASS";
pSerial.write(strMsg);
pSerial.flush();
if(pSerial.waitForBytesWritten(TIMEOUT_MS)){
qDebug() << "WRITE PASS";
}
pSerial.waitForReadyRead(TIMEOUT_MS);
while(true){
if( pSerial.canReadLine()){
qDebug() << "CAN READ LINE";
nByte = pSerial.readLine(strBuf,sizeof(strBuf));
qDebug() << "Length: " << nByte;
qDebug() << "Read data: " << strBuf;
}
}
pSerial.close();
} else {
qDebug() << "OPEN FAIL\n";
}
return a.exec();
}
#包括
#包括
#包括
#包括
#定义端口名称“COM3”
#定义波特率19600
#定义超时\u MS 1000
QT_使用名称空间
int main(int argc,char*argv[])
{
qcorea应用程序(argc、argv);
QSerialPort pSerial(港口名称);
const char strMsg[]=“1:发送数据线\n#2:发送数据线\n#3:发送数据线结束\n”;
char-strBuf[256];
qint64-nByte;
if(pSerial.open(QIODevice::ReadWrite)){
pSerial.setBaudRate(波特率);
qDebug()这是因为您需要在如下循环中读取:
QByteArray readData = serialPort.readAll();
while (serialPort.waitForReadyRead(5000))
readData.append(serialPort.readAll());
请参阅creadersync
示例以了解我添加到5.2中的详细信息。您还可以检查creadersync
示例以了解非阻塞操作
公平地说,我们没有对readLine进行过太多测试,但它在Unix上对我有效,在Windows上对其他人也有效。这是因为您需要像这样在循环中阅读:
QByteArray readData = serialPort.readAll();
while (serialPort.waitForReadyRead(5000))
readData.append(serialPort.readAll());
请参阅creadersync
示例以了解我添加到5.2中的详细信息。您还可以检查creadersync
示例以了解非阻塞操作
公平地说,我们没有对readLine进行过太多测试,但它在Unix上对我有效,在Windows上对其他人也有效。您犯的错误是希望在waitForReadyRead
返回时收到所有发送的数据。当waitForReadyRead
完成时,您可以保证的只是一些数据可以重新读取d、 它可能只有一个字符,不一定是一整行
上一次修改中的循环几乎是正确的方法。您应该将行的读取嵌套在单独的循环中。下面的代码是如何执行的,并且与QIODevice
的语义一致:
while (pSerial.waitForReadyRead(TIMEOUT_MS)) {
while (pSerial.canReadLine()) {
qDebug() << "NEW LINE";
QByteArray line = pSerial.readLine();
qDebug() << "Length: " << line.size();
qDebug() << "Read data: " << line;
qDebug() << "Error Message: " << pSerial.errorString();
}
}
qDebug << "TIMED OUT";
while(pSerial.waitForReadyRead(超时时间)){
而(pSerial.canReadLine()){
qDebug()您犯的错误是,当waitForReadyRead
返回时,您希望接收所有发送的数据。当waitForReadyRead
完成时,您所能保证的只是一些可读取的数据。数据可能只有一个字符,而不一定是整行
上一次修改中的循环几乎是正确的方法。您应该将行的读取嵌套在单独的循环中。下面的代码是如何执行的,并且与QIODevice
的语义一致:
while (pSerial.waitForReadyRead(TIMEOUT_MS)) {
while (pSerial.canReadLine()) {
qDebug() << "NEW LINE";
QByteArray line = pSerial.readLine();
qDebug() << "Length: " << line.size();
qDebug() << "Read data: " << line;
qDebug() << "Error Message: " << pSerial.errorString();
}
}
qDebug << "TIMED OUT";
while(pSerial.waitForReadyRead(超时时间)){
而(pSerial.canReadLine()){
qDebug()流量控制?你禁用了吗?@JoeZ谢谢你的评论。起初,我没有分配 任何关于流控制的标志。然后我添加了以下代码。但它对我无效。pSerial.setFlowControl(QSerialPort::SoftwareControl);或pSerial.setFlowControl(QSerialPort::NoFlowControl);@yufit_in_Japan:我给了+1,但你是否尝试过在循环中读取,比如:QByteArray readData=serialPort.readAll();而(serialPort.waitForReadyRead(5000))readData.append(serialPort.readAll());这样的事情行得通吗,也就是说,我们能确保它真的是一个读线问题吗?还有,它在Unix上行得通吗?第二次nByte的值是多少?您是否检查了errorString以防失败,或者它成功了,但没有字符?顺便说一句,您的代码中的错误管理非常松散。@LaszloPapp:非常感谢。Acc根据你的评论,我修改了源代码。虽然我不明白为什么会出现问题,但我可以取得进展。@LaszloPapp:当我在Ubuntu 13.10上尝试相同的代码(readline()版本)时,效果与我预期的一样。这个结果与MS Windows的不同。(我后来修改了这个评论,因为它是一个错误。)流量控制?你禁用了吗?@JoeZ谢谢你的评论。一开始,我没有分配 任何关于流控制的标志。然后我添加了以下代码。但它对我无效。pSerial.setFlowControl(QSerialPort::SoftwareControl);或pSerial.setFlowControl(QSerialPort::NoFlowControl);@yufit_in_Japan:我给了+1,但你是否尝试过在循环中读取,比如:QByteArray readData=serialPort.readAll();而(serialPort.waitForReadyRead(5000))readData.append(serialPort.readAll());这样的事情行得通吗,也就是说,我们能确保它真的是一个读线问题吗?还有,它在Unix上行得通吗?第二次nByte的值是多少?您是否检查了errorString以防失败,或者它成功了,但没有字符?顺便说一句,您的代码中的错误管理非常松散。@LaszloPapp:非常感谢。Acc根据你的评论,我修改了源代码。虽然我不明白为什么会出现问题,但我可以取得进展。@LaszloPapp:当我在Ubuntu 13.10上尝试相同的代码(readline()版本)时,效果与我预期的一样。这个结果与MS Windows的不同。(我后来修改了这个评论,因为它是一个错误。)这对阅读台词有什么帮助?这个答案完全没有抓住要点。咄咄逼人、无知的库巴回来了。(我真的不明白什么“完全没有抓住要点”)。事实上,OP在这个回复中得到了两种不同的解决方案,他甚至对此感到高兴。请在这个网站上保持建设性。OP的行读代码有问题。你的回答根本没有解决这个问题,你提供了一种忽略行读方面的不同解决方案。当然,这是有效的代码,但对d来说没有任何问题在我的书中,这没有抓住要点。指出显而易见的事实被认为是侵略性的还是无知的