0

我是一名学生,正在为我大学的化学系做一个项目。去年,我编写了一个 C++ 程序来控制微型运动平台并让它与压力传感器通信,上下移动平台直到它接触到传感器。我使用公司提供的DLL来编写这个程序。我花了一段时间,但我得到了一切工作。

今年,我将第二阶段合并到程序中,并使用 C# 将整个程序更新为 GUI。第二阶段和力传感器仅提供适用于 C# 的 DLL,而旧阶段则适用于 C++。我能够让这三个都在新的 C# GUI 程序中工作,这一切都差不多完成了,保存了这个问题:

在旧程序中,我能够通过此功能确定舞台上的电机是否正在移动:

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

byte LdcnGetStat(byte address) 返回给定地址处模块的最后一个状态字节。根据我的说明手册,假设在电机移动时设置位 0。因此,如果我在我的 C++ 程序中使用 bool 变量对其进行测试,当电机不移动时 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,当它正在移动,它返回 s 98。如果我在移动后再次测试,它返回 23。

在 C# 中是否有适当的方法来处理这个问题?我正在考虑检查 LdcnGetStat 是否返回正确的数值,但这似乎不是处理它的正确方法,特别是因为这些值似乎在移动后发生了变化。

谢谢

4

2 回答 2

2

C/C++ 中的条件有效地编译为与零的比较。所以表达式LdcnGetStat(pico_addr) & MOTOR_MOVING等价于(LdcnGetStat(pico_addr) & MOTOR_MOVING) != 0。然而,在 C# 中,条件是用实际bool的 s 完成的,因此您只能使用第二个表达式。

如果你需要我可以解释更多。

于 2013-07-12T20:20:03.917 回答
1

我认为您正在寻找的是:

bool isMoving = (LdcnGetStat(pico_addr) & MOTOR_MOVING) != 0;

表达方式:

byte isMoving = LdcnGetStat(pico_addr) & MOTOR_MOVING;

可能会给您一个关于隐式转换intbyte. 你必须投它:

byte isMoving = (byte)(LdcnGetStat(pico_addr) & MOTOR_MOVING);

在这种情况下,isMoving将等于0x01电机运动时。

于 2013-07-12T22:17:33.983 回答