树莓派机器人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
相关产品推荐
相关产品推荐

