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
相关产品推荐
相关产品推荐

