如何从uart向微控制器发送十六进制字符串并将其存储为整数以用于将来的“if”语句

时间:2016-11-07 03:20:25

标签: c avr

好吧,我真的在这里寻求帮助,因此我的目标就是一块石头。我花了好几个星期才做到这一点,仍然无法做到。

我有一个avr,我将从UART中读取一个包含十六进制值的字符串。

前:

0x3cffaa31

我需要将其拆分为

0x3c
0xff
0xaa
0x31

并将其存储到变量中,以便我可以使用if语句执行。

我怎样才能实现这一目标,请帮助我。我已经在互联网上看到了这里,但我仍然迷失了。

3 个答案:

答案 0 :(得分:0)

如果我解释这个错误,请帮帮我,但听起来你需要这样做;

  1. 将来自UART的传入字符串拆分为不间断的2个字符的字符串,每个字符串代表一个十六进制字节。如果您将始终以您显示的格式拥有4个字节的数据,那么这将很容易。例如你总是知道第一个字节的两个字符位于保持输入字符串的char[]的索引2和3处。

  2. 将每个双字符字符串转换为int,因此您可以将它们用于数值计算。查看strtol,这是AVR libc中可用的strtol 确保为long converted = strtol(digits, NULL, 16); 指定base16 - 例如:

    digits
  3. (其中char[]是包含两个十六进制字符的strtol,以null结尾)

    UPDATE-看起来像0x并不关心字符串是否有前面的 const char *raw = "0x3cffaa31"; char digits[3]; long converted; /* Copy two bytes from 'raw', starting from index 2, * (so we can skip the '0x') to get the string "3c" */ strncpy(digits, raw + 2, 2); /* Make sure the new string is null-terminated */ digits[2] = '\0'; /* Convert hex string to a long. Now you can use it * in an if-statement */ converted = strtol(digits, NULL, 16); ,所以像这样的东西可以从原始字符串中获取第一个十六进制值:

    {{1}}

答案 1 :(得分:0)

uint8_t Values[4]={0};
uint8_t Loc=0;
uint32_t Mask=0xFF; //32 bits UART Rx Buffer size

for(uint8_t i=0;i<=24;i+=8)
{
 Values[Loc]=(((Mask<<i) & UartRxBuf) >> i);
 Loc++;
}

答案 2 :(得分:-1)

我不认为这是一个问题 如果您在8位模式下使用uart,则一次只能接收一个字节数据。 只需在每次收到数据时增加数组索引

for(i = 0; i<4; i++){
while(UART_recieve_not_completed);
arr[i] = UART_RX_BUFF;}

希望这有帮助