USBシリアルケーブルを介してマイクロコントローラーをデスクトップPCに接続しようとしています。私のデスクトップ PC の OS は 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();
}
プログラムの実行を開始すると、結果が予想とは異なります。送信データは先頭行のみ受信可能です。そのため、「Read data: #1 Send data line」がコンソールに出力されます。しかし、送信された残りのデータは決して受信されません。誰かが理由を知っていますか?
どんな助けでも大歓迎です。前もって感謝します。
編集: 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;
EDIT 2回目:次のコードも機能します。
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();
}
}