如何解析通过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,因为我不需要阅读更多,我甚至不知道总共多长时间,来自传感器的字符串是。
你需要将其分解为更小的步骤。 例如:
- 从套接字接收任意大小的数据包。
- 在数据包缓冲区(
recvbuf
)中搜索数据开始标记'<'
。 - 将所有以下字符从数据包缓冲区复制到解析缓冲区(您需要创建它。使其大到足以保存6个数据点的最长数据表示)。
- 3A。 如果您找到数据结束标记
'>'
,请转到步骤4。 - 3B。 如果数据用完,请接收下一个数据包并重复步骤3。
- 3A。 如果您找到数据结束标记
- 将逗号分析缓冲区分成N个值字符串。
- 将每个值字符串转换为带有
atof
或fscanf
。 - 转到步骤2,从最后一个数据结束后的字符开始。
您在数据流中的任意点调用atof
。 那样不行。
可靠地执行此操作需要几个步骤。
-
从
recv
获得的数据可以是需要附加到前面和后面的recv
调用数据的部分数据集。 这有时是以管道方式完成的,recvbuf
字符读入parsebuf
。 -
您的数据看起来是
(
和)
框架,因此您的复制例程可以跳到第一个(
然后将数据复制到以下)
-
当复制例程到达
recvbuf
的末尾时,它应该再次调用recv
来填充recvbuf
并继续从recvbuf
的开始构建数据,它在parsebuf
中parsebuf
-
在每个
)
parsebuf
的数据将始终是
所以你的, , , ... atof
调用有一些合理的处理。 考虑使用fscanf
-
每次转换后重置指向
parsebuf
的指针。