我的外部设备每5秒向我发送一次数据,如下所示:

+DATA: 43 BYTES FROM 0000:0000 (043)
Nodo_8:(T=21.45,HR=45.65,DW=9.34,Vcc=3.46V)

我需要这里的一些值来将它们保存在mysql数据库中。所以使用strtok,我想得到043,21.45,45.65,9.34,3.46的值。
我编写了以下代码从设备读取缓冲区:
int learn_port(int fd)
{
   int n;
   char buff[83];

 for (;;)
  {
    n=read(fd,buff,83);
    printf("%s", buff);
    char dev_a[25] = "", temp_a[25] = "", hr_a[25] = "", dw_a[25] = "", vcc_a[25] = "";
    char* ptr;

    ptr = strtok(buff, "+DATA:BYTESFROM()\nNodo_ ,=T:HR:DW:Vcc()");
    int i = 0;
   while (ptr != NULL)
   {
     ptr = strtok(NULL, "+DATA:BYTESFROM()\nNodo_ ,=T:HR:Dw:Vcc()");
     if (i == 2)
      strcat(dev_a, ptr); // copies device
     if (i == 5)
      strcat(temp_a, ptr); // copies T
     if (i == 6)
        strcat(hr_a, ptr); // copies HR
     if (i == 7)
        strcat(dw_a, ptr); // copies DW
     if (i == 10)
        strcat(vcc_a, ptr);
    i++;
    }
    sleep(1);
    printf("%s, %s, %s, %s, %s\n", dev_a, temp_a,hr_a,dw_a,vcc_a);
 }

但我有一些奇怪的结果,我不知道哪里有问题。终端第一次返回我:
+DATA: 43 BYTES FROM 0000:0000 (043)
Nodo_8:(T=21.45,HR=45.65,DW=9.34,Vcc=3.46V)
??,??043, 21.45, 45.65, 9.34, 3.46

5秒后
+DATA: 43 BYTES FROM 0000:0000 (043)
Nodo_8:(T=21.23,HR=42.65,DW=9.45,Vcc=3.46V)
?3.46043, 21.23, 42.65, 9.45, 3.46

5秒后
+DATA: 43 BYTES FROM 0000:0000 (051)
Nodo_8:(T=21.67,HR=42.45,DW=9.23,Vcc=3.46V)
?3.46051, 21.67, 42.45, 9.23, 3.46

等。
有人知道我和问题在哪里吗?051前3.46?史崔克有什么问题吗?
我的结果是043,21.67,42.45,9.23,3.46

最佳答案

在这件事上,我以前也帮过忙,我觉得我有责任介入并尝试整理出我的代码,这些代码已经停止了我应该做的事情:)
好的,我建议您有两个单独的输入案例,我将它们分成两个以“+”开头的案例,分别代表“+DATA”和“N”开头的案例,分别代表“Nodo-8”(这是非常原始的,请确保确实如此,否则需要进一步验证)。
我已经将调用从循环的开始移动到结束,因为它可能在第一次迭代时“标记”字符串两次,然后我们才有机会提取任何内容。我刚刚把它放在递增strok之前。如果你想让它保持在开始的位置,只要从我们检查的i中减去1。
然后,只需要找出循环的哪个迭代将吐出正确的值。

#include <stdio.h>
#include <string.h>

int main()
{
    /* dev_a and dev_b could be the same source in your case, modify accordingly */
    char dev_a[] = "+DATA: 43 BYTES FROM 0000:0000 (043)";
    char dev_b[] = "Nodo_8:(T=21.23,HR=42.65,DW=9.45,Vcc=3.46V)";

    char out0[35] = "";
    char out1[35] = "";
    char out2[35] = "";
    char out3[35] = "";
    char out4[45] = "";

    char* ptr;
    int i;

    if (dev_a[0] == '+')
    {
        ptr = strtok(dev_a, "+DATA: BYTES FROM ()");

        i = 0;

        while (ptr != NULL)
        {
            if (i == 3)
                strcat(out0, ptr); /* copies DATA (value in brackets) */

            ptr = strtok(NULL, "+DATA: BYTES FROM ()");

            i++;
        }

        printf("+DATA: %s\n", out0);
    }
    if (dev_b[0] == 'N')
    {
        ptr = strtok(dev_b, "Nodo_,=T:HR:DW:Vcc()");

        i = 0;

        while (ptr != NULL)
        {
            if (i == 1)
                strcat(out1, ptr); /* copies T */
            if (i == 2)
                strcat(out2, ptr); /* copies HR */
            if (i == 3)
                strcat(out3, ptr); /* copies DW */
            if (i == 4)
                strcat(out4, ptr); /* copies Vcc */

            ptr = strtok(NULL, "Nodo_,=T:HR:DW:Vcc()");

            i++;
        }

        printf("Nodo_8: %s, %s, %s, %s\n", out1, out2, out3, out4);
    }

    return 0;
}

通过这段代码,我得到了以下输出(对于“Nodo”有三种情况):
$ ./a.out
+DATA: 043
Nodo_8: 21.45, 45.65, 9.34, 3.46

$ ./a.out
+DATA: 043
Nodo_8: 21.67, 42.45, 9.23, 3.46

$ ./a.out
+DATA: 043
Nodo_8: 21.23, 42.65, 9.45, 3.46

“043”对应于“+DATA”部分,其余对应于“Nodo”位。
我有正确的价值观吗?我从你的职位上做了一个假设。我已经用你提供的三个“Nodo”样品进行了测试。

08-07 04:02