【发布时间】:2013-12-15 07:50:14
【问题描述】:
我正在尝试通过 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();
}
当程序开始运行时,结果与我预期的不同。 只能接收发送数据的第一行。因此,打印“读取数据:#1 发送数据行” 在控制台上。但是将永远不会收到其余发送的数据。有谁知道为什么?
任何帮助将不胜感激。 提前致谢。
编辑:我根据 Papp 的评论修改了我的代码。然后它按我的预期工作。 已收到所有发送的消息。
这是否意味着我误解了 readLine() 或 canReadLine() 的用法?
// while(true){
// if( pSerial.canReadLine()){
// qDebug() << "CAN READ LINE";
// nByte = pSerial.readLine(strBuf,sizeof(strBuf));
// qDebug() << "Length: " << nByte;
// qDebug() << "Read data: " << strBuf;
// }
// }
pSerial.waitForReadyRead(TIMEOUT_MS);
QByteArray readData = pSerial.readAll();
while (pSerial.waitForReadyRead(TIMEOUT_MS)) {
readData.append(pSerial.readAll());
}
qDebug() << "Read data: " << readData;
第二次编辑:以下代码也适用于我。
while(true){
if( pSerial.waitForReadyRead(TIMEOUT_MS) && pSerial.canReadLine()){ // I revised this line
qDebug() << "CAN READ LINE";
nByte = pSerial.readLine(strBuf,sizeof(strBuf));
qDebug() << "Length: " << nByte;
qDebug() << "Read data: " << strBuf;
qDebug() << "Error Message: " << pSerial.errorString();
}
}
【问题讨论】:
-
流量控制?你禁用了吗?
-
@JoeZ 感谢您的评论。起初,我没有分配任何关于流控制的标志。然后我添加了以下代码。但它对我不起作用。 pSerial.setFlowControl(QSerialPort::SoftwareControl);或 pSerial.setFlowControl(QSerialPort::NoFlowControl);
-
@yufit_in_Japan:我给了+1,但是您是否尝试过循环读取,例如:QByteArray readData = serialPort.readAll(); while (serialPort.waitForReadyRead(5000)) readData.append(serialPort.readAll());这样的事情是否有效,即我们可以确保它真的是一个 readLine 问题吗?另外,它适用于 Unix 吗?第二次nByte的值是多少?您是否检查了 errorString 以防万一它不成功,或者它以零字符成功?顺便说一句,您的代码中的错误管理相当草率。
-
@LaszloPapp :非常感谢。根据您的评论,我修改了源代码。虽然我不明白为什么会出现问题,但我可以取得进展。
-
@LaszloPapp :当我在 Ubuntu 13.10 上尝试相同的代码(readline() 版本)时,它可以正常工作。这个结果与 MS Windows 的结果不同。(我后来修改了这个评论,因为它被证明是一个错误。)
标签: c++ qt serial-port qtserialport