1

我不是来自低级开发背景,所以我不确定如何将以下指令转换为整数......

基本上我有一个微处理器,它告诉我哪些 IO 处于活动状态或处于非活动状态。我向设备发送一个 ASCII 命令,它会回复一个 WORD,说明 15 个 I/O 中的哪一个是打开/关闭的……指令如下:

  • 单元回答“A0001/”仅用于 DIn0 开启,“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 处理器是 little-endian。您可以使用BitConverter.IsLittleEndian了解平台的字节序。如果运行 .NET 的计算机和提供数据的硬件不具有相同的字节序,则必须交换两个字节。

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

15 个(或 16 个?)输入中的哪一个处于活动状态

如果这些位是硬件标志,那么所有 16 位都用于表示某事是合理的。当位用于表示有符号数时,其中一位用于表示正与负。由于硬件提供状态位,因此不应将任何位解释为符号。

如果您想知道特定位是否处于活动状态,您可以使用位掩码和&运算符。例如,二进制掩码

0000 0000 0000 0100

对应十六进制数

0x0004

要了解右侧第三位是否打开,请使用

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

更新

如果制造商说值 8000(我假设为十六进制)表示通道 15 处于活动状态,请查看如下:

你的位掩码

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

根据制造商提供的信息,最左边的位对应于通道 15。

您可以使用该掩码,例如:

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

第二个选择(但仅适用于 Nibbles)是像这样使用数学库:

  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 回答