-1

マイクロコントローラー (mbed LPC1768) 用のプログラムを作成していますが、uint8_t へのシリアル入力をデコードするのにいくつか問題があります。

char ackBuffer[20];外部デバイスからの入力がいっぱいです。たとえば、次のようになります。F040A34B6785121\r

私がやりたいことは、各数値が 2 文字の 16 進数値で記号化される uint8_t 配列を取得することです。F は外部デバイスからのメッセージが開始されたことを示し、キャリッジ リターンは各メッセージの終わりです。

したがって、uint8_t 配列に必要なものは次のとおりです。

0x04
0x0A
0x34
...

さらに困難にするために、ackBuffer のサイズが小さい可能性があります。たとえば、これをF04004A\r簡単に修正できる場合は非常に便利ですが、この問題を自分で回避できます。

ありがとうございました!

4

1 に答える 1

0

ackMessageしたがって、は で始まり、'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 に答える