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

Python3.6 UDP客户端发送数据遇类型错误及串口数据处理问题

解决串口数据处理与UDP发送的TypeError问题

咱们来逐个拆解你遇到的两个类型错误,一步步搞定:

1. 串口数据处理的TypeError问题

你原代码里的串口数据处理逻辑太绕了——ser.read(7)返回的是bytes类型,直接反复转字符串再截取替换,很容易把b'、\\r、\\n这些转义字符混进数据里,后续做数学运算时自然会触发类型错误。

正确的串口数据处理姿势:

先把bytes解码成字符串,再做清洗,最后转成数字类型再运算:

# 读取串口原始bytes数据
raw_data = ser.read(7)
if raw_data:  # 确保读到有效数据再处理
    # 解码为UTF-8字符串,忽略无法解码的乱码
    data_str = raw_data.decode('utf-8', errors='ignore')
    # 去掉换行、回车和首尾空白
    cleaned_data = data_str.strip().replace('\r', '').replace('\n', '')
    # 转成数字才能做数学运算
    try:
        # 根据你的数据类型选float或int
        numeric_data = float(cleaned_data)
        # 这里替换成你的运算逻辑,比如乘以系数
        processed_data = numeric_data * 2.5
    except ValueError:
        print(f"跳过无效数据:{cleaned_data}")
        continue

2. UDP发送的"bytes-like object required"错误

Python3的socket发送方法(比如sendto())只认bytes类型数据,直接传字符串肯定会报错,必须先把字符串编码成bytes。

正确的UDP发送方式:

# 先把处理后的数字转成字符串,再编码成UTF-8 bytes
send_content = str(processed_data).encode('utf-8')
# 发送到目标服务器
udp_socket.sendto(send_content, (IP, PORT))

整合后的完整代码示例

把两部分逻辑结合起来,完整可运行的代码大概是这样:

import socket
import serial
from time import sleep

IP = "192.168.1.1"
PORT = 3553

# 初始化串口
ser = serial.Serial('/dev/ttyUSB0', 115200, timeout=1)
print(f"已打开串口:{ser.name}")

# 初始化UDP Socket
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

try:
    while True:
        raw_data = ser.read(7)
        if not raw_data:
            sleep(0.1)
            continue
        
        # 处理串口数据
        data_str = raw_data.decode('utf-8', errors='ignore').strip()
        cleaned_data = data_str.replace('\r', '').replace('\n', '')
        
        # 转换数字并运算
        try:
            numeric_data = float(cleaned_data)
            # 自定义你的数学运算
            processed_data = numeric_data * 1.2
            print(f"原始数据:{numeric_data} → 处理后:{processed_data}")
        except ValueError:
            print(f"无效数据,跳过:{cleaned_data}")
            continue
        
        # 发送到UDP服务器
        send_bytes = str(processed_data).encode('utf-8')
        udp_socket.sendto(send_bytes, (IP, PORT))
        sleep(0.1)
except KeyboardInterrupt:
    print("程序终止")
finally:
    # 关闭资源
    ser.close()
    udp_socket.close()

额外小提示

  • 如果Arduino发送的是整行数据(带换行符),用ser.readline()代替ser.read(7)会更可靠,不用纠结固定长度
  • 解码时如果出现乱码,可以试试'ascii'编码,或者确认Arduino端的串口输出编码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:27:48