[Visual Studio] Qt はシリアル ポートから送信されたデータを受信し、ビットごとの OR 演算を使用して 2 つの 8 ビット データを 16 ビット整数に結合します。

質問

前回からの続きですが、以前はデータを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 と左シフト演算を使用して、送信されたデータを再結合し、送信したい実際の値を取得します。

おすすめ

転載: blog.csdn.net/weixin_36815313/article/details/131408372