2016-04-11 29 views
1

コーディングが新しくなりました。私と一緒に抱きしめてください。 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

答えて

1

C、あなたが「入力することができますが必要ですバイナリ "データを直接QByteArrayに書き込むために、私は組み込みシステムのシリアルインターフェイス経由でデータを送信するためにこれを常に使用します。ここで

は一例です:

QByteArray data; 

// Add some data 
data.append((char) 0xFF); 
data.append((char) 0x00); 
data.append((char) 0x55); 
data.append((char) 0x99); 

// Modify some data 
data[0] = (char) 0x23; 
data[2] = (char) 0x02; 

何の鋳造でぐちゃぐちゃとデータを格納するために異なるデータ型を使用してはありません。 QSerialPortが使用するQByteArrayのすべて。その(IMHO)は常にデータ型を同じに保つのが最善ですが、Qtを使用する場合は、QByteArrayのようなQtベースのものを意味します。

そしてdata.size()を使用して長さを取得できます。

編集

もうひとつは(あなたが間違っているところ多分これがある)に注意することは、私はあなたがQByteArray文字列コンテナを考えていると思うが、また(を含むバイトを含むように設計されていることである \ 0の)。すでにあなたの変数QByteArray hexString;は間違って名前が付けられています。私はhexDataと思っています。あるいは、ちょうどserialDataがわかりやすいです。実際には、実際にバイトとビットを使用できる文字列を使用しようとしています。再び

// Serialising uint16 into bytes... 
uint16_t val; 
    : 
msg.append((char) ((val >> 0) & 0xFF)); 
msg.append((char) ((val >> 8) & 0xFF)); 

、そのすべてのバイトとビットと:(私が行ったように)

また、あなたは本当にでも、私は私のような事をやっていたので、習慣によってこれを始めたのcharにキャストする必要はありません。文字列ではありません。

+0

これは私が探しているものです。どうもありがとうございます – DLiu

0

sizeofにご注意いただき、誠にありがとうございますが、それはデータについては何も(どのように大きなことはポインタである)コンピュータアーキテクチャについて説明しますないとので、あなたは、何をしたいことはありませんポインタがを指しています。

また、strlenは、文字列に埋め込みNUL文字を含めることができない場合は信頼できません。他の方法で手で長さを把握する必要があります。静的なサイズの配列の大きさを得るために

+0

こんにちはベン、私のコードの代わりに 'unsigned char'から 'const char'に配列全体をキャストする安全な方法はありますか? const char * cDiff =(const char *)Diff; DLiu

+0

キャストは安全ですが、まだサイズを別々に管理する必要があります。 –

0

使用std::extent

unsigned char Diff[] = {0x45, 0x00, 0x01, 0x02}; 
const char *cDiff = (const char*)Diff; 
int diffSize = std::extent<decltype(Diff)>::value; 
QByteArray ba = QByteArray(cDiff,diffSize); 

注:それはあなたがいじり、すべてこれを行う必要はありません++ 11

関連する問題