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

解决Python TCP传输后字符串转浮点数问题——树莓派温度数据传输

我来帮你排查问题并解决这个浮点数转换错误,顺便优化你的连续温度数据传输逻辑:

问题根源分析

你的报错主要来自两个关键错误,同时连续传输时还要注意TCP的流特性导致的粘包问题:

  1. 服务器端发送逻辑错误:Python3的socket.sendall()仅支持发送字节对象,不能直接传字符串,你之前的代码会隐性报错或发送无效数据
  2. 客户端数据处理错误:你用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:59:08