我是一名学生正在为我的大学化学系工作。去年我编写了一个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,当它们运动时isMoving为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是否返回正确的数值,但这似乎不是处理它的正确方法,特别是因为值似乎在移动后会发生变化。
由于
答案 0 :(得分:2)
C / C ++中的条件有效地编译为零比较。因此,LdcnGetStat(pico_addr) & MOTOR_MOVING
表达式等同于(LdcnGetStat(pico_addr) & MOTOR_MOVING) != 0
。但是在C#中,条件语使用实际的bool
来完成,所以你只能使用第二个表达式。
如果你需要我,我可以解释更多。
答案 1 :(得分:1)
我认为您正在寻找的是:
bool isMoving = (LdcnGetStat(pico_addr) & MOTOR_MOVING) != 0;
表达式:
byte isMoving = LdcnGetStat(pico_addr) & MOTOR_MOVING;
可能会错误地将int
隐式转换为byte
。你必须施展它:
byte isMoving = (byte)(LdcnGetStat(pico_addr) & MOTOR_MOVING);
在这种情况下,当电机移动时,isMoving
将等于0x01
。