1

私は低レベルの開発経験がないので、以下の命令を整数に変換する方法がわかりません...

基本的に、どのIOがアクティブか非アクティブかを知らせるマイクロプロセッサがあります。デバイスに ASCII コマンドを送信すると、デバイスは 15 の I/O のどれが開いているか閉じているかについての WORD で応答します... 指示は次のとおりです。

  • ユニットは、DIn0 のみオンの場合は「A0001/」、すべての入力がアクティブの場合は「A????/」と応答します。
  • Awxyz/ - w=0 から ? の MSB の上位ニブル ASCII 文字 0001=1、1111=?、z=LSB の下位ニブル。

結局のところ、15(または16?)の入力のうちどれがアクティブかを示す数値に変換できるようにしたいだけです。

15 番目の I/O ポートに何か接続しているのですが、"A8000" という応答が返ってきました。誰かが私のためにこれを片付けてもらえますか?

4

2 に答える 2

3

BitConverterクラスを使用して、バイトの配列を必要な整数形式に変換できます。

16ビットを取得している場合は、それらをUInt16に変換します

C#はエンディアンを定義しません。これは、実行しているハードウェアによって決まります。IntelおよびAMDプロセッサはリトルエンディアンです。BitConverter.IsLittleEndianを使用して、プラットフォームのエンディアンを学習できます。.NETを実行しているコンピューターとデータを提供するハードウェアのエンディアンが同じでない場合は、2バイトを交換する必要があります。

byte[] inputFromHardware = { 126, 42 };
ushort value = BitConverter.ToUInt16( inputFromHardware, index );

15(または16?)入力のどれがアクティブです

ビットがハードウェアフラグである場合、16個すべてが何かを意味するために使用されている可能性があります。ビットが符号付き数値を表すために使用される場合、ビットの1つは正と負を表すために使用されます。ハードウェアはステータスビットを提供しているため、どのビットも符号として解釈されるべきではありません。

&特定のビットがアクティブであるかどうかを知りたい場合は、演算子とともにビットマスクを使用できます。たとえば、バイナリマスク

0000 0000 0000 0100

16進数に対応

0x0004

右から3番目のビットがオンになっているかどうかを確認するには、次を使用します。

bool thirdBitFromRightIsOn = (value & 0x0004 != 0);

アップデート

製造元が値8000(16進数と想定)がチャネル15がアクティブであることを表すと言っている場合は、次のように見てください。

あなたのビットマスク

1000 0000 0000 0000  (binary)
 8    0    0    0    (hex)

メーカーからの情報に基づいて、左端のビットはチャネル15に対応します。

次のようにそのマスクを使用できます。

bool channel15IsOn = (value & 0x8000 != 0);
于 2013-02-11T18:58:01.907 に答える
0

2 番目の選択肢 (ただし Nibbles のみ) は、次のように Math ライブラリを使用することです。

  string x = "A0001/"
  int y = 0;
  for (int i = 3; i >= 0; i--)
  {
      if (x[4-i] == '1')
      y += (int)Math.Pow(2,i);
  }

ブラケットを使用するだけで文字列を文字の配列として扱い、数字をキャストして数字として扱う機能を使用すると、ハードコードされたビットから整数への変換を行うことができます。それは初心者の解決策ですが、それも適切だと思います。

于 2013-02-11T19:39:54.943 に答える