-1

我正在为微控制器(mbed LPC1768)编写程序,并且在将串行输入解码为 uint8_t 时遇到了一些问题。

我收到了char ackBuffer[20];来自外部设备的大量输入。例如,我们得到的是:F040A34B6785121\r

我想要做的是得到一个 uint8_t 数组,其中每个数字都由 2 个字符的十六进制值表示。F 表示来自外部设备的消息开始,回车是每条消息的结尾。

所以我在 uint8_t 数组中想要的是:

0x04
0x0A
0x34
...

为了让它更难,它可能是 ackBuffer 的尺寸更小,所以仅作为示例F04004A\r(如果这可以很容易修复,那么它非常好,但我可以自己解决这个问题。

谢谢!

4

1 回答 1

0

所以我假设 aackMessage必须以 . 开头'F'和结尾'\r'。而且我什至假设,由于您在微控制器上工作,因此应该避免做任何超出要求的事情(例如库函数)。鉴于您只需要遍历缓冲区:

uint8_t charToHex(unsigned char value)
{
  if (value >= '0' && value <= '9') return value - '0';
  else if (value >= 'A' && value <= 'F') return value - 'A' + 10;
  else if (value >= 'a' && value <= 'f') return value - 'a' + 10;
  assert(false);
}

#define BUFFER_SIZE (20)

int main(void)
{
  char ackBuffer[BUFFER_SIZE] = "F12345890AB\r";
  uint8_t result[(BUFFER_SIZE-2)/2]; // at most 9 bytes since it's 20 - 2 / 2

  char* ptr = ackBuffer;

  assert(*ptr == 'F');
  ++ptr;

  int count = 0;
  while(*ptr != '\r')
  {
    uint8_t value = charToHex(*ptr) << 4 | charToHex(*(ptr+1));
    result[count++] = value;
    ptr += 2;
  }

  int i;
  for (i = 0; i < count; ++i)
    printf("%x\n", result[i]);

  return 0;
}

请注意,您必须charToHex与使用的编码保持一致,并且可能需要对代码进行更多的完整性检查。

于 2013-12-20T18:38:39.183 回答