Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QSerialPort::readLine不';无法在MS Windows上按预期工作_C++_Qt_Serial Port_Qtserialport - Fatal编程技术网

C++ QSerialPort::readLine不';无法在MS Windows上按预期工作

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

我正在尝试通过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/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来说没有任何问题在我的书中,这没有抓住要点。指出显而易见的事实被认为是侵略性的还是无知的