解决Python TCP传输后字符串转浮点数问题——树莓派温度数据传输
我来帮你排查问题并解决这个浮点数转换错误,顺便优化你的连续温度数据传输逻辑:
问题根源分析
你的报错主要来自两个关键错误,同时连续传输时还要注意TCP的流特性导致的粘包问题:
- 服务器端发送逻辑错误:Python3的
socket.sendall()仅支持发送字节对象,不能直接传字符串,你之前的代码会隐性报错或发送无效数据 - 客户端数据处理错误:你用
repr()处理收到的字节数据,会把b'25.69'转换成带格式的字符串"b'25.69'",这种包含额外符号的字符串自然无法转成浮点数
解决方案一:字符串编码传输(易实现,适合小数据量)
修正后的树莓派服务器代码
def dataTransfer(conn): # 持续发送温度数据直到连接断开 while True: try: temp = GET_OBJ_TEMP() # 获取原始浮点数温度 temp_str = str(temp) + "\n" # 添加换行符作为数据分隔符,避免粘包 conn.sendall(temp_str.encode('utf-8')) # 必须编码为字节再发送 print(f"已发送温度数据: {temp}") except Exception as e: print(f"发送出错: {e}") break s = setupServer() conn = setupConnection() dataTransfer(conn)
修正后的PC客户端代码
import socket host = '10.0.0.94' port = 5560 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((host, port)) try: buffer = "" # 用于缓存不完整的接收数据 while True: data = s.recv(1024) if not data: break # 连接断开时退出循环 buffer += data.decode('utf-8') # 按换行符拆分出完整的温度数据 while "\n" in buffer: temp_str, buffer = buffer.split("\n", 1) temp_str = temp_str.strip() # 去除多余空格 if temp_str: temp = float(temp_str) print(f"收到温度: {temp}") print(f"温度数据类型: {type(temp)}") # 这里可以加入你的阈值判断逻辑 if temp > 30.0: print("警告:温度超过阈值!") except Exception as e: print(f"接收出错: {e}") finally: s.close()
解决方案二:直接发送浮点数(效率更高,适合频繁传输)
如果想跳过字符串转换环节,可以用struct模块把浮点数打包成字节直接传输:
服务器端代码
import struct def dataTransfer(conn): while True: try: temp = GET_OBJ_TEMP() # 把浮点数打包成4字节的网络字节序(大端)数据 temp_bytes = struct.pack('!f', temp) conn.sendall(temp_bytes) print(f"已发送温度: {temp}") except Exception as e: print(f"发送出错: {e}") break
客户端代码
import struct import socket host = '10.0.0.94' port = 5560 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((host, port)) try: while True: # 单精度浮点数占4字节,固定接收4字节数据 data = s.recv(4) if not data: break # 解包字节为浮点数 temp = struct.unpack('!f', data)[0] print(f"收到温度: {temp}") print(f"温度数据类型: {type(temp)}") except Exception as e: print(f"接收出错: {e}") finally: s.close()
注意:打包和解包的格式必须完全一致,
!f表示网络字节序的单精度浮点数,如果用双精度浮点数(!d),需要对应接收8字节数据。
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

