0

私は大学の化学科のプロジェクトに取り組んでいる学生です。昨年、私は C++ プログラムを書き、ピコモーター ステージを制御し、それを力圧センサーと通信させ、センサーに触れるまでステージを上下に動かしました。このプログラムを作成するために、会社が提供した DLL を使用しました。少し時間がかかりましたが、すべてが機能するようになりました。

今年は、プログラムに第 2 段階を組み込み、プログラム全体を C# を使用して GUI に更新します。2 番目のステージと力センサーは、C# で動作する DLL のみを提供しますが、古いステージは C++ を対象としていました。3 つすべてを新しい C# GUI プログラムで動作させることができました。この問題を除けば、ほとんどすべて完了しています。

古いプログラムでは、次の関数を使用してステージ上のモーターが動いているかどうかを判断できました。

#define MOTOR_MOVING 0x01
byte isMoving = LdcnGetStat(pico_addr) & MOTOR_MOVING;

byte LdcnGetStat(byte address) は、指定されたアドレスにあるモジュールの最後のステータス バイトを返します。私が持っている取扱説明書によると、モーターが動いているときにビット0が設定されると想定されています。したがって、bool 変数を使用して C++ プログラムでテストすると、モーターが動いていないときは isMoving が 0 になり、動いているときは 1 になり、モーターの動きが止まるとすぐに 0 に戻ります。正常に動作します。

しかし、C# では、これを組み込むのに問題があります。

byte isMoving = LdcnGetStat(pico_addr) & MOTOR_MOVING;

動作しません。明示的なキャストを行う必要があります。だから私はこれに変更しました:

bool isMoving = Convert.ToBoolean(LdcnGetStat(pico_addr) & 
Convert.ToBoolean(MOTOR_MOVING);

それは私にエラーを与えませんが、LdcnGetStat(pico_addr) は常に「true」を返します。これは、0 になることはないためです。LdcnGetStat() が吐き出す値をテストすると、モーターが動いていないときに 28 が返されます。移動している場合は 98 を返します。移動後にもう一度テストすると、23 が返されます。

C#でこれを処理する適切な方法はありますか? LdcnGetStat が正しい数値を返すかどうかを確認することを考えていますが、特に値が移動後に変化するように見えるため、それを処理する正しい方法とは思えません。

ありがとう

4

2 に答える 2

2

C/C++ の条件は、ゼロに対する比較に効果的にコンパイルされます。したがって、式LdcnGetStat(pico_addr) & MOTOR_MOVINGは と同等(LdcnGetStat(pico_addr) & MOTOR_MOVING) != 0です。ただし、C# では、条件は実際boolの s で行われるため、2 番目の式しか使用できません。

必要があれば、もっと説明できます。

于 2013-07-12T20:20:03.917 に答える