我試圖通過USB串行電纜將微控制器與臺式PC連接。 我的臺式電腦的操作系統是Windows 8.1,USB串行電纜是TTL-232R-3V3。 (FTDI) (Qt版本:5.2.0 beta1,QtCreator版本:3.0,編譯器:MSVC2012)QSerialPort :: readLine在MS Windows上無法正常工作
現在我正在嘗試讀/寫環回測試,這就是爲什麼RX/TX引腳的USB串行電纜相互連接。
這是我的代碼。
#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(); (serialPort.waitForReadyRead(5000)) readData.append(serialPort.readAll());這樣的事情是否行得通,即我們能否確定它確實是一個readLine問題?另外,它在Unix上工作嗎? nByte第二次的價值是什麼?你是否檢查過errorString,以防萬一不成功,或者它是否成功爲零字符?順便說一下,你的代碼中的錯誤管理是相當潦草的。 – lpapp