0

我通过 TCP 从传感器接收数据,输出如下所示: <-0.040000 , -0.005000 , 0,025000 , 0,990000 , -0,000500 , 0.033000 >

这是6倍的价值。我只需要前三个。X、Y 和 Z 方向的力以获得它们的合力。有人告诉我,我正在接收“双精度的传感器流字符串表示”,并且我应该使用 atof 函数,该函数接受一个表示浮点数的字符串并返回一个双精度。

所以,问题是。我正在使用以下代码从传感器接收数据

char recvbuf[DEFAULT_BUFFER_LENGTH];
int iResult = recv(ConnectSocket, recvbuf, DEFAULT_BUFFER_LENGTH, 0);

double n;
n = atof (recvbuf);

输出总是错误的,要么我得到错误的数据,30000 而不是 0.1414,要么我将 0.15 读为 0。关于如何获取所有 3 个数据的任何提示?我使用 BUFFER=50,因为我不需要阅读更多内容,而且我什至不知道传感器的字符串总共有多长。

4

2 回答 2

2

你需要把它分解成更小的步骤。例如:

  1. 从套接字接收任意大小的数据包。
  2. 在数据包缓冲区 ( recvbuf) 中搜索数据开始标记'<'
  3. 将以下所有字符从数据包缓冲区复制到解析缓冲区(您需要创建它。使其足够大以容纳 6 个数据点的最长可能数据表示)。
    • 3A。如果找到数据结束标记'>',请转到步骤 4。
    • 3B。如果数据用完,则接收下一个数据包并重复步骤 3。
  4. 将逗号处的解析缓冲区分解为 N 个值字符串。
  5. atof使用或将每个值字符串转换为数字fscanf
  6. 转到第 2 步,从最后一个数据结束后的字符开始。
于 2015-11-09T21:57:53.750 回答
2

您正在atof数据流中的任意点调用。那不管用。

需要几个步骤才能可靠地做到这一点。

  1. 您从中获取的数据recv可以是需要附加到前面和后面recv调用的数据的部分数据集。这有时以管道方式完成,将字符从 读取recvbufparsebuf.

  2. 您的数据看起来是框架的()因此您的复制例程可以跳到第一个(,然后将数据复制到以下)

  3. 当复制例程到达末尾时,recvbuf它应该recv再次调用以填充recvbuf并继续从recvbuf它停止的位置开始构建数据parsebuf

  4. 每次调用)中的数据都parsebuf将始终<x> , <y> , <z> , ...如此,因此您的atof通话有合理的处理方式。考虑使用fscanf

  5. parsebuf每次转换后将指针重置为。

于 2015-11-09T21:59:24.930 回答