我有一个avr,我将从UART中读取一个包含十六进制值的字符串。
前:
0x3cffaa31
我需要将其拆分为
0x3c
0xff
0xaa
0x31
并将其存储到变量中,以便我可以使用if语句执行。
我怎样才能实现这一目标,请帮助我。我已经在互联网上看到了这里,但我仍然迷失了。
答案 0 :(得分:0)
如果我解释这个错误,请帮帮我,但听起来你需要这样做;
将来自UART的传入字符串拆分为不间断的2个字符的字符串,每个字符串代表一个十六进制字节。如果您将始终以您显示的格式拥有4个字节的数据,那么这将很容易。例如你总是知道第一个字节的两个字符位于保持输入字符串的char[]
的索引2和3处。
将每个双字符字符串转换为int,因此您可以将它们用于数值计算。查看strtol
,这是AVR libc中可用的strtol
确保为long converted = strtol(digits, NULL, 16);
指定base16 - 例如:
digits
(其中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;}
希望这有帮助