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

Python串口写入打印数据报TypeError:int对象不可下标错误

错误触发原因

pyserial库的ser.write()方法返回值是成功写入串口的字节数,数据类型为整数,并非从串口读取到的返回数据。你的代码将这个整数返回值赋值给ser_bytes变量后,直接对其执行切片操作ser_bytes[0:len(str(ser_bytes))-2],而整数类型不支持下标索引访问,因此触发TypeError: 'int' object is not subscriptable报错。

原代码还存在三个逻辑问题:

  • 写入数据后未调用任何串口读取方法,完全没有获取串口设备的返回数据,解码操作无合法数据源
  • 后两次写入数值后没有更新decoded_bytes变量,即使不报错,三次打印的也永远是第一次计算的结果,无法输出对应写入值的相关结果
  • 未给串口设置读超时,后续读取数据时容易出现永久阻塞的问题
修正后代码

根据需求分两种场景提供可运行代码:

场景1:写入数值后需要读取串口设备返回值,打印返回的解析结果

import serial
from time import sleep

# 初始化串口,timeout设置读超时时间,避免永久阻塞
ser = serial.Serial(port='COM4', baudrate=19600, timeout=1)
# 按顺序定义要写入的三个数值
value_list = [80, 10, 150]

while True:
    for target_val in value_list:
        # 写入数值,返回值为写入字节长度,不需要赋值给读数据变量
        ser.write(str(target_val).encode('utf-8'))
        sleep(1)
        # 显式读取串口返回数据,按行读取适配大部分换行结尾的串口协议,可根据设备协议调整读取方式
        recv_bytes = ser.readline()
        # 去除首尾空白字符后解码转浮点数
        decoded_val = float(recv_bytes.decode('utf-8').strip())
        print(decoded_val)

场景2:仅需要写入数值,打印当前写入的数值本身,不需要读取设备返回

import serial
from time import sleep

ser = serial.Serial(port='COM4', baudrate=19600)
value_list = [80, 10, 150]

while True:
    for target_val in value_list:
        ser.write(str(target_val).encode('utf-8'))
        sleep(1)
        print(target_val)
关键注意事项
  • 严格区分串口读写操作:write()负责发数据,返回写入字节长度;read()/readline()负责收数据,返回接收到的字节串
  • 不要对整数、None这类非序列类型的变量执行切片、下标索引操作
  • 串口通信需要提前核对波特率、数据位、校验位、停止位参数,和对接设备保持一致才能正常通信
  • 如果不需要无限循环写入三个数值,直接去掉外层while True即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 10:01:46