コーディングが新しくなりました。私と一緒に抱きしめてください。 Qtの例のTerminalから学び、生の16進バイトを送信しようとしました。 最初は0x57、0x04、0x02を問題なく送信できました。このようにQt QSerialPortを使用して16進数を送信する方法0x00
void MainWindow::writeData(const QByteArray &data)
{
serial->write(data);
}
void MainWindow::myFunction1()
{
QByteArray ba("\x57\x04\x02");
writeData(ba);
}
次に、私は0x00sでいくつかの選択可能なデータ文字列を送る必要がありました。上記のコードは\ x00を送信せず、その背後にあるものをすべて消去するので、 'fromRawData'を使用して特殊文字の変換を停止します。
void MainWindow::myFunction2(int option)
{
QByteArray hexString;
switch (option){
case 1:
hexString.append(QByteArray::fromRawData("\x00\x01\x02",3);
break;
case 2:
hexString.append(QByteArray::fromRawData("\xFF\x00",2));
break;
}
writeData(hexString);
}
上記のコードでは、両方の定数文字列を送信できました。しかし、今私は本当の挑戦に直面している、私は非定数16進バイトを送信する必要があります。私は16進文字列を格納するための符号なしchar配列を作成し、後でその値を変更しました。それをconst char配列にキャストしました。しかし、この鋳造は間違ったサイズを与えた。ケース3では
void MainWindow::myFunction3(int option)
{
unsigned char Diff[] = {0x45, 0x00, 0x01, 0x02};
...
Diff[2] = 0x08; // runtime change
const char *cDiff = (const char*)Diff; // casting
int size_Diff = sizeof(Diff); // qDebug shows 4
int size_cDiff = sizeof(cDiff); // qDebug shows 8 !!???
QByteArray hexString;
switch (option){
case 1:
hexString.append(QByteArray::fromRawData("\x00\x01\x02",3);
break;
case 2:
hexString.append(QByteArray::fromRawData("\xFF\x00",2));
break;
case 3:
hexString = QByteArray::fromRawData(cDiff, sizeof(cDiff));
break;
}
writeData(hexString);
}
、私は0x45 0x00で、0x08に、0x02の0x01の、0x00を、0x00に、0x00で、私のMCUボード上の合計8つのバイトを持って!次に、Diff []のサイズを10に変更し、sizeof(cDiff)= 8も変更しました。最後の2バイトが切り捨てられました。
私の最初の質問は、QSerialPortを使用して実行時に決定された0x00から0xFFまでのさまざまな配列サイズと値の範囲のunsigned charを送信するより良い方法はありますか? 2番目の質問は、なぜキャストが私に間違った配列サイズを与えたのですか?
がポインタでこの DLIU
これは私が探しているものです。どうもありがとうございます – DLiu