You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派机器人Socket接收数据无法转为float问题求助

问题:Socket传输数值无法转换为float类型

我通过Socket客户端向树莓派机器人发送1.00至-1.00之间的float数值(示例:-0.47、0.23),服务端能在控制台打印接收的内容,但无法将其转换为float类型,报错ValueError: could not convert string to float:。

树莓派服务端代码

import socket

serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM);
serverSocket.bind(("192.168.1.182",9090));
serverSocket.listen();

def main():
    
    (clientConnected, clientAddress) = serverSocket.accept();
    dataFromClient = clientConnected.recv(1024)
    data = dataFromClient.decode()
    curve = float(data)
    print(curve)


if __name__ == '__main__':
    while True:
        main()

客户端代码

import socket

clientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM);
clientSocket.connect(("192.168.1.182", 9090));
clientSocket.send(bytes(curve, "utf-8"));
print(curve)

问题原因

报错核心是服务端接收的字符串并非纯数值格式,常见触发场景:

  • 传输过程中出现粘包/拆包,导致接收内容包含多余字符或不完整片段
  • 客户端发送时未处理数值转字符串的边界,或字符串隐含空白字符(如换行、空格)

解决方案

方案一:基于字符串传输,添加结束标记并清理数据

通过在发送的数值字符串后添加换行符作为结束标记,服务端按标记接收完整数据,同时去除多余空白字符。

修改后的服务端代码:

import socket

serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM);
serverSocket.bind(("192.168.1.182",9090));
serverSocket.listen();

def main():
    (clientConnected, clientAddress) = serverSocket.accept();
    # 循环接收直到获取带换行符的完整数据
    data_from_client = b''
    while b'\n' not in data_from_client:
        chunk = clientConnected.recv(1024)
        if not chunk:
            break
        data_from_client += chunk
    # 解码并去除前后空白字符(换行、空格等)
    data = data_from_client.decode().strip()
    if data:
        curve = float(data)
        print(curve)
    clientConnected.close()

if __name__ == '__main__':
    while True:
        main()

修改后的客户端代码:

import socket

curve = -0.33  # 替换为实际要发送的float数值
clientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM);
clientSocket.connect(("192.168.1.182", 9090));
# 将数值转为字符串并添加换行符作为结束标记
clientSocket.send(f"{curve}\n".encode("utf-8"));
print(curve)
clientSocket.close()

方案二:直接传输二进制float数据

跳过字符串转换环节,直接将float打包为二进制数据传输,彻底避免解析问题,传输效率更高。

修改后的服务端代码:

import socket
import struct

serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM);
serverSocket.bind(("192.168.1.182",9090));
serverSocket.listen();

def main():
    (clientConnected, clientAddress) = serverSocket.accept();
    # 接收4字节的单精度float二进制数据
    data_from_client = clientConnected.recv(4)
    if len(data_from_client) == 4:
        curve = struct.unpack('f', data_from_client)[0]
        print(curve)
    clientConnected.close()

if __name__ == '__main__':
    while True:
        main()

修改后的客户端代码:

import socket
import struct

curve = 0.75  # 替换为实际要发送的float数值
clientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM);
clientSocket.connect(("192.168.1.182", 9090));
# 将float打包为二进制数据发送
clientSocket.send(struct.pack('f', curve));
print(curve)
clientSocket.close()

内容的提问来源于stack exchange,提问作者Electronic_EXE

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 12:40:29