記事ディレクトリ
質問
前回からの続きですが、以前はデータを8ビットに分解してバイト配列に保存して送信しました。今回はVisual StudioをベースにQt環境を開発し、それをC++言語で受け取り、マージし直しました。
逆アセンブルに関してはArduino IDE環境で行いました。詳細については、記事「【Arduino】シリアルデータを送信する場合、ビット単位のANDと右シフトを使用してデータを8ビットに分解し、コードや解析も含めてバイト配列に保存してから送信する」を参照してください。
方法
適切な位置に従ってバイト配列をマージします
まずコアコードをアップロードします
QByteArray data = m_SerialPort.read(2);
int Channel1 = (data[1] << 8) | data[0];
最初の行は、シリアル ポートから 2 バイトのデータを読み取り、それをQByteArray
型の変数に格納することを意味しますdata
。
2行目は、data
変数の2バイト目のデータを8ビット左シフトし、1バイト目のデータと結合して得られた値を変数に代入することを示していますChannel1
。
補助的なビットごとの OR 演算
ビットごとの OR 演算では、各ビットの結果は 2 つのオペランドの対応するビットの論理 OR 演算によって決まります。
ルールは次のとおりです。
- 2 つのオペランドの対応するビットの少なくとも 1 つが 1 の場合、結果ビットは 1 になります。
- それ以外の場合、結果ビットは 0 になります。
たとえば、次の 2 つの 2 進数のビット単位の OR 演算を考えてみましょう。
1 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | (171) |
---|---|---|---|---|---|---|---|---|
1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | (204) |
| |
||||||||
1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | (239) |
例えば
例えば、送信するデータが の場合16234
、実際に送信されるのは であるdata = data[0] data[1] = 01101010 00111111
理由については、こちらの記事も参照してください。【Arduino】シリアルデータを送信する場合、ビットごとのANDと右シフトを使ってデータを8ビットに分解し、バイト配列に保存してコードや解析も含めて送信します。
最初のバイトdata[0] = 01101010
。
2バイト目data[1] = 00111111
。
操作の結果data[1] << 8
は です00111111 00000000
。
ビット単位の OR|
演算では、次の演算プロセスが発生します。
0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | (16128) | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |
|||||||||||||||||
0 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | (106) | |||||||||
0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | (16234) |
Channel1 = 16234
最終結果は、送信したいデータ結果と一致していることがわかります。
要約する
以前は、データは 8 ビットに分解され、ビット単位の AND および右シフト演算を通じて送信されていました。ここでは、ビットごとの OR と左シフト演算を使用して、送信されたデータを再結合し、送信したい実際の値を取得します。