我正在尝试通过串行通信与USB加密狗进行通信。我的通信工作,但我不能让设备正确解析通信。我的设备读取消息并将其与硬编码的c-string进行比较。它解析并识别它是正确的字符串,但是当我尝试解析:字符后的值时,它返回0x00000000并且我不知道为什么。我尝试过使用char cast并使用atoi,我尝试使用简单的ascii转换,甚至进行按位添加操作,如下所示:convert subset of vector<uint8_t> to int
例如:
我发送&#34;心率:55&#34;
它解析并认识到&#34;心率:&#34;但是当我告诉它去找55并把它带回去用它做的东西时,它给了我一个0x00000000
这是一个片段:
const uint8_t hrmSet[] = "Heart Rate:";
/** Find the : character in the string and break it apart to find if it matches,
and determine the value of the value of the desired heart rate. **/
int parse(uint8_t *input, uint8_t size)
{
for (uint8_t i = 0; i < size; i++)
{
if (input[i] == ':')
{
if (compare_string(input, hrmSet, i) == 0)
{
int val = 0;
for (int j = i+1; j < size; j++)
{
if (!isdigit(input[j]))
{
for (int k = i; k < j; k++)
{
val <<= 8;
val |= input[k];
}
}
}
return val;
}
return -1;
}
}
return -1;
}
比较字符串函数
/** Compare the input with the const values byte by byte to determine if they are equal.**/
int compare_string(uint8_t *first, const uint8_t *second, int total)
{
for (int i = 0; i < total; i++)
{
if (*first != *second)
{
break;
}
if (*first == '\0' || *second == '\0')
{
break;
}
first++;
second++;
}
if (*first == ':' && *second == ':')
{
return 0;
}
else
{
return -1;
}
}
答案 0 :(得分:1)
int val = 0;
for(int j = i+1; j < size; j++){
if(isdigit(input[j] )){
val = val * 10 + input[j]-'0';// val = (val << 8) | input[j];
}
}
return val;
答案 1 :(得分:1)
这里的问题是您使用嵌套循环来执行应该使用顺序循环完成的任务。
例如,i
循环搜索冒号,然后compare_string
中的循环再次搜索冒号。您可以先运行i
循环,然后在compare_string
循环结束后调用i
。但更好的设计是在比较时compare_string
搜索冒号,然后在冒号后返回字符的索引(如果未找到冒号,则返回-1)。
j
和k
嵌套循环也是如此。 j
循环正在搜索数字的结尾。 k
循环仅在j
循环结束后运行一次,因此k
循环应该在j
循环之后,而不是嵌套。但更好的设计是单个循环,在搜索数字的末尾时转换数字。
下面的代码演示了使用我所描述的技术的一种可能的实现方式。
const uint8_t hrmSet[] = "Heart Rate:";
int compare_string( uint8_t *input, const uint8_t *expected, int size )
{
for ( int i = 0; i < size; i++ )
{
if ( *input != *expected || *expected == '\0' )
return( -1 );
if ( *input == ':' && *expected == ':' )
return( i + 1 );
input++;
expected++;
}
return( -1 );
}
int parse( uint8_t *input, uint8_t size )
{
int i, val;
if ( (i = compare_string( input, hrmSet, size )) < 0 )
return( -1 );
val = 0;
for ( ; i < size && isdigit( input[i] ); i++ )
val = val * 10 + input[i] - '0';
return( val );
}
int main( void )
{
uint8_t input[] = "Heart Rate:75";
int rate = parse( input, sizeof(input) - 1 );
printf( "%d\n", rate );
}