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

我通过TCP从传感器接收数据,输出如下:

它是双倍价值的6倍。 我只需要前三个。 在X,Y和Z方向上的力可以获得合力。 我被告知我正在回收’传感器流的双字符串表示’并且我应该使用atof函数,该函数接受表示浮点数的字符串并返回double。

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

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. 转到步骤2,从最后一个数据结束后的字符开始。

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

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

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

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

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

  4. 在每个) parsebuf的数据将始终是 , , , ...所以你的atof调用有一些合理的处理。 考虑使用fscanf

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