我正在制作一个微控制器程序(mbed LPC1768),并且在将串行输入解码为uint8_t时遇到一些问题。
我收到来自外部设备的输入char ackBuffer[20];
。
我们得到的是例如:F040A34B6785121\r
我想要的是获取一个uint8_t数组,其中每个数字都由2个字符的十六进制值表示。 F用于显示来自外部设备的消息已启动,回车是每条消息的结束。
所以我想要的uint8_t数组是:
0x04
0x0A
0x34
...
为了使它变得更难,ackBuffer可以是更小的尺寸,所以例如只有F04004A\r
(如果这很容易修复那么它非常好,但我可以解决这个问题。
谢谢!
答案 0 :(得分: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
,并且可能需要对代码进行更多的健全性检查。