【发布时间】:2014-10-22 22:49:16
【问题描述】:
我正在尝试通过串行通信与 USB 加密狗进行通信。我的通信正常,但是我无法让设备正确解析通信。我的设备读取消息并将其与硬编码的 c 字符串进行比较。它解析并识别出它是正确的字符串,但是当我尝试解析 : 字符之后的值时,它返回 0x00000000 我不知道为什么。我尝试过使用 char cast 和 atoi,我尝试过使用简单的 ascii 翻译,甚至还进行了按位加法运算,如下所示:convert subset of vector<uint8_t> to int
例如:
我发送“心率:55”
它解析并识别出“心率:”但是当我告诉它去找 55 并把它带回来做一些事情时,它给了我一个 0x00000000
这是一个sn-p:
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;
}
}
【问题讨论】:
-
为什么要在 找到冒号后进行字符串比较?
-
你为什么要检查 not
isdigit,k循环的目的是什么? -
您的
compare_string每次调用时都会从两个字符串(input和hrmSet)的开头进行迭代。 -
compare_string函数可以通过break在任一字符串中找到冒号时循环来改进。这样,您就不必在调用compare_string之前搜索冒号,也不需要total作为参数。 -
我找到了冒号,用来设置 compare_string 测试的界限。因为我不知道价值会持续多久。将来,这将检查多个不同的字符串是否匹配。
我再次检查 not isdigit 以找到字符串的结尾,因为我不知道每次会多长时间。
因为这个相关的问题,所以出现了 K 循环:stackoverflow.com/questions/17813350/…
标签: c serial-communication rs485