我有一个通过RS-232将数据发送到Hyperterminal的功能。该函数在while循环中正常工作,但是,在while循环中,它仅在第一次发送,之后它不发送任何内容。
qDebug() << MESSAGE;
int choice;
std::cin >> choice;
while( choice != 3 )
{
switch (choice)
{
case 1:
// Ready to send data
port->write("QSerial Port!\r\n");
break;
case 2:
qDebug() << "Todo...";
break;
case 3:
break;
default:
qDebug() << "Invalid Choice ...";
}
qDebug() << MESSAGE;
std::cin >> choice;
}
编辑:
#include <QCoreApplication>
#include <iostream>
#include <QDebug>
#include <QSerialPort>
const char MESSAGE[] = "\n----- New Menu ----"
"\n1- Send Data \n"
"2- Receive Data \n"
"3- Quit: \n";
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
QSerialPort *port = new QSerialPort;
port->setPortName("COM4");
// Check the validity of the port
if ( !port->open(QIODevice::ReadWrite) )
{
qDebug() << "\nError: " << port->portName() << " port can't be opened ...";
return -1;
}else{
qDebug() << '\n' << port->portName() << " port has been opened successfully ...";
port->setBaudRate(QSerialPort::Baud9600);
port->setStopBits(QSerialPort::OneStop);
port->setDataBits(QSerialPort::Data8);
port->setParity(QSerialPort::NoParity);
port->setFlowControl(QSerialPort::NoFlowControl);
qDebug() << port->portName() << " port has been configured correctly ...";
}
qDebug() << MESSAGE;
int choice;
std::cin >> choice;
while( choice != 3 )
{
switch (choice)
{
case 1:
{
// Ready to send data
if ( port->write("QSerial Port!\r\n", qstrlen("QSerial Port!\r\n")) == -1)
{
qDebug() << port->errorString();
}
//port->bytesWritten(strlen("QSerial Port!\r\n"));
port->waitForBytesWritten(-1);
//qDebug() << port->errorString();
}
break;
case 2:
qDebug() << "Todo...";
break;
case 3:
break;
default:
qDebug() << "Invalid Choice ...";
}
qDebug() << MESSAGE;
std::cin >> choice;
}
qDebug() << "\n Goodbye ....";
port->close();
delete port;
return app.exec();
}
答案 0 :(得分:1)
您的代码存在以下缺陷:
1)您没有处理错误。
2)您不检查写操作的返回值。
3)在再次写作之前,你似乎没有以编程方式等待。这是不正确的。使用sync waitForBytesWritten或async bytesWritten信号为下一次写入提供绿灯。
最关键的可能是最后一点。它会导致&#34;随机&#34;行为如何发送数据。在这种特殊情况下,它可能会按顺序发送,因为等待输入可能需要更长的时间,但它仍然不是稳定且可靠的代码。
答案 1 :(得分:0)
我不能完全赞同第(3)点。 没有任何东西可以说你不能做第二次写作,而第一次写作仍然很出色。原则上,数据应该只添加到传输队列中。 这就像说&#34;你不能再写这个文件,直到先前的数据写入磁盘&#34;。 我在qtserial遇到了类似的问题:
while (..)
{
<send data>
<receive data>
}
原则上你必须先接受qApp-&gt; processEvents()才能收到任何内容 或者在你可以写新数据之前。 我期待与读取/写入文件相同的行为。 对我而言,qtserial并不像你期望的那样表现。