如何解析通过 TCP 收到的数字字符串

How to parse numeric strings recieved over TCP

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

这是一个 6 倍的双倍值。我只需要前三个。 X、Y 和 Z 方向的力,以获得它们的合力。有人告诉我我正在恢复 'sensor streams string representation of double' 并且我应该使用 atof 函数,该函数采用表示浮点数的字符串和 returns 双精度数。

那么,问题来了。我正在使用以下代码从传感器接收数据

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,因为我不需要阅读更多内容,我什至不知道来自传感器的字符串总共有多长。

您需要将其分解成更小的步骤。例如:

  1. 从套接字接收任意大小的数据包。
  2. 在数据包缓冲区 (recvbuf) 中搜索数据起始标记 '<'
  3. 将以下所有字符从数据包缓冲区复制到解析缓冲区(您需要创建它。使其足够大以容纳 6 个数据点的最长可能数据表示)。
    • 3A。如果找到数据结束标记 '>',请转到步骤 4。
    • 3B。如果您 运行 没有数据,请接收下一个数据包并重复步骤 3。
  4. 将逗号处的解析缓冲区分成 N 个值字符串。
  5. 使用 atoffscanf.
  6. 将每个值字符串转换为数字
  7. 转到Step2,从最后一个数据结束后的字符开始。

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

要可靠地执行此操作需要几个步骤。

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

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

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

  4. 中停止的地方
  5. 在每个 ) 中,parsebuf 中的数据将始终是 <x> , <y> , <z> , ...,因此您的 atof 调用有一些合理的处理。考虑使用 fscanf

  6. 每次转换后重置指向parsebuf的指针。