python模拟串口设备-16路灯光模块
·
import socket
from threading import Thread
class LightModuleSimulator:
def __init__(self):
# 初始化16路灯状态(0-7对应1-8路,8-15对应9-16路)
self.light_status = [0] * 16
def add8_checksum(self, data_bytes):
"""计算ADD8校验和(所有字节累加取低8位)"""
return sum(data_bytes) & 0xFF
def process_command(self, command_bytes):
"""处理接收到的命令(带ADD8校验)"""
# 校验命令长度(7字节数据 + 1字节校验和)
if len(command_bytes) != 8:
return self._build_error_response("Invalid length")
# 分离数据和校验和
data_part = command_bytes[:-1]
received_checksum = command_bytes[-1]
# 验证校验和
if self.add8_checksum(data_part) != received_checksum:
return self._build_error_response("Checksum error")
# 解析命令类型
cmd_type = data_part[1]
if cmd_type == 0x10: # 状态查询
return self._build_status_response()
elif cmd_type == 0x30: # 开灯控制
return self._process_control(data_part, 1)
elif cmd_type == 0x40: # 关灯控制
return self._process_control(data_part, 0)
else:
return self._build_error_response("Unknown command")
def _process_control(self, data_part, target_state):
"""处理控制命令"""
xh = data_part[2] # 1-8路控制位
xl = data_part[3] # 9-16路控制位
# 更新灯状态(1表示改变,0表示不变)
for i in range(8): # 处理1-8路
if (xh >> (7 - i)) & 1:
self.light_status[i] = target_state
for i in range(8, 16): # 处理9-16路
if (xl >> (15 - i)) & 1:
self.light_status[i] = target_state
return self._build_status_response()
def _build_status_response(self):
"""构建状态响应包(01 11 XH XL 00 00 + ADD8)"""
# 计算XH(1-8路状态)
xh = sum(bit << (7 - i) for i, bit in enumerate(self.light_status[:8]))
# 计算XL(9-16路状态)
xl = sum(bit << (15 - i) for i, bit in enumerate(self.light_status[8:16]))
response_data = bytes([0x01, 0x11, xh, xl, 0x00, 0x00,0x00])
return response_data + bytes([self.add8_checksum(response_data)])
def _build_error_response(self, error_msg):
"""构建错误响应(可选实现)"""
print(f"Error: {error_msg}")
return b"\x01\xFF" + error_msg.encode()[:5] + bytes([self.add8_checksum(b"\x01\xFF")])
def handle_client(conn, addr, simulator):
print(f"Client connected: {addr}")
try:
while True:
data = conn.recv(1024)
if not data:
break
print(f"Received: {data.hex(' ').upper()}")
response = simulator.process_command(data)
print(f"Respond: {response.hex(' ').upper()}")
conn.send(response)
finally:
conn.close()
print(f"Client disconnected: {addr}")
def run_server(host='0.0.0.0', port=8801):
simulator = LightModuleSimulator()
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((host, port))
s.listen(5)
print(f"Simulator running on {host}:{port}")
while True:
conn, addr = s.accept()
Thread(target=handle_client, args=(conn, addr, simulator)).start()
if __name__ == '__main__':
run_server('192.168.88.116',8801)
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)