私の問題は、私のコードがコントローラへの接続からデータを受信するのを止める理由がわかりません。Qt/C++でModbus-RTUプロトコルを使用してデバイスに接続する
状況:私はデバイスに接続してデータを取得するためのQtプログラムを作成しています。このデバイスは、ボーレート9600、偶数パリティ、8データビット、1ストップビットのModbus-RTUプロトコルを使用してRS-485でデータを転送します。 QtプログラムはQSerialPortクラスを使用してデバイスと通信します。プログラムを初めて起動したときに、バイナリパケットを送信した後、デバイスからの応答を受け取ることができます。しかし、2回目からは、私のプログラムは何も受信しません。でも、上記のパケットをたくさん送信しました。理解を容易にするために、以下の私のコードを確認してください:
01030000000ac5cd
Length: 8
Length: 0
0103140000001b0000000000000000ffb2000400040000b49e
Length: 25
01030000000ac5cd
Length: 8
Length: 0
01030000000ac5cd
Length: 8
Length: 0
01030000000ac5cd
Length: 8
が、私は私のコードで何かを見逃していました:
#include <QCoreApplication>
#include <QtSerialPort/qserialport.h>
#include <QtSerialPort/QSerialPort>
#include <iostream>
#include <bitset>
#include <fstream>
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
fstream fs;
QSerialPort qsp;
qsp.setPortName("COM2");
qsp.setBaudRate(QSerialPort::Baud9600);
qsp.setDataBits(QSerialPort::Data8);
qsp.setParity(QSerialPort::EvenParity);
qsp.setStopBits(QSerialPort::OneStop);
qsp.setFlowControl(QSerialPort::NoFlowControl);
if (qsp.open(QIODevice::ReadWrite)){
QByteArray qbaDataSend;
qbaDataSend.resize(8);
qbaDataSend[0] = 0x01;
qbaDataSend[1] = 0x03;
qbaDataSend[2] = 0x00;
qbaDataSend[3] = 0x00;
qbaDataSend[4] = 0x00;
qbaDataSend[5] = 0x0A;
qbaDataSend[6] = 0xC5;
qbaDataSend[7] = 0xCD;
cout << endl << "Byte wrote: " <<qbaDataSend.toHex().toStdString() << endl << "Length: " << qsp.write(qbaDataSend) << endl;
fs.open("Data.txt", ios_base::app | ios_base::out);
fs << qbaDataSend.toHex().toStdString() << endl;
fs << "Length: " << qbaDataSend.toStdString().length() << endl << endl;
fs.close();
qsp.flush();
while(true){
_sleep(3000);
do {
QByteArray qbaDataRead = qsp.readAll();
fs.open("Data.txt", ios_base::app | ios_base::out);
cout << qbaDataRead.toHex().toStdString() << endl;
fs << qbaDataRead.toHex().toStdString() << endl;
cout << "Length: " << qbaDataRead.toStdString().length() << endl << endl;
fs << "Length: " << qbaDataRead.toStdString().length() << endl << endl;
fs.close();
}
while(qsp.waitForReadyRead(3000));
cout << endl << "Byte wrote: " <<qbaDataSend.toHex().toStdString() << endl << "Length: " << qsp.write(qbaDataSend) << endl;
qsp.write(qbaDataSend, 8);
fs.open("Data.txt", ios_base::app | ios_base::out);
fs << qbaDataSend.toHex().toStdString() << endl;
fs << "Length: " << qbaDataSend.toStdString().length() << endl << endl;
fs.close();
qsp.flush();
}
}
cout << "Out" << endl;
qsp.close();
cout << "Error: " << qsp.errorString().toStdString() << endl;
cout << "Close" << endl;
return a.exec();
}
ここで私が得た結果ですか?
ありがとうございました。
あなたは、デバッガを使用して参照しようとしたことがあり何が起こっている? –