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

