""" Tan mingyan 2026/3/9 uart 驱动示例(bus_can.py)—— 补充参考 """ # midware/drivers/bus_can.py from midware.config.base_config import get_device_config from .base_driver import BaseBusDriver from typing import Optional, Dict, Any from loguru import logger import time from .base_driver import BaseBusDriver from .renode_agent import renode from midware.config.base_config import DEVICE_CONFIG_DICT class BusUARTDriver(BaseBusDriver): """uart总线驱动实现(适配)""" def _init_config(self): self.config.setdefault("channel", 0) # CAN通道 self.config.setdefault("baudrate", 500000) # 500kbps self.config.setdefault("frame_format", "standard") # 标准帧/扩展帧 logger.info(f"UART驱动配置初始化完成:{self.config}") def connect(self) -> bool: try: # 实际逻辑:打开CAN通道 time.sleep(0.05) self.is_connected = True logger.info("CAN总线连接成功") return True except Exception as e: logger.error(f"CAN总线连接失败:{str(e)}") return False def disconnect(self) -> bool: try: self.is_connected = False logger.info("CAN总线断开成功") return True except Exception as e: logger.error(f"CAN总线断开失败:{str(e)}") return False def send(self, data: bytes, **kwargs) -> bool: if not self.is_connected: logger.error("UART驱动未连接,发送失败") return False # 查找当前设备的配置 # ========== 核心步骤1:从kwargs提取设备名称 ========== dev_name = kwargs.get("dev_name")#2026/4/10 if not dev_name: logger.error("UART发送失败:kwargs中未传入dev_name(设备名称)") return False device_config = get_device_config().get(dev_name) if not device_config: logger.error(f"UART发送失败:设备 {dev_name} 未在DEVICE_CONFIG_DICT中配置") return False try: #frame_id = kwargs.get("frame_id", 0x123) # CAN帧ID #is_extended = kwargs.get("is_extended", False) # 是否扩展帧 logger.info( #f"UART发送数据|帧ID:0x{frame_id:X}|扩展帧:{is_extended}|" f"UART发送数据:{data.hex()}|长度:{len(data)}字节" ) ## 外设名称+函数名+字符串参数 uart24 WriteRXFIFODataString "0xEB9000C571000827C00000BC1003190000106C02AC020101FF5716"' sysbus_cmd = f'{dev_name} WriteRXFIFODataString "0x{data.hex()}"' #sysbus_cmd = f'can_a GetTxBufferDataString' print(sysbus_cmd) logger.info(f"UART发送指令:{sysbus_cmd}") response = renode.send_sync(sysbus_cmd,timeout_ms=20)#2026/4/10 #response = renode.enqueue_cmd(sysbus_cmd)#2026/6/4 # sysbus_cmd = f'uart24 GetTXFIFODataString' # print(sysbus_cmd) # response = renode.send_sync(sysbus_cmd)#2026/4/10 # 实际逻辑:调用UART驱动发送接口 return True except Exception as e: logger.error(f"UART数据发送失败:{str(e)}") return False def recv(self, timeout: float = 0.1, **kwargs) -> Optional[bytes]: if not self.is_connected: logger.error("UART驱动未连接,接收失败") return None try: #遍历所有UART外设,循环发送读取指令:例如 adc1 ReadAllChannelsToString02 # 模拟接收 time.sleep(0.91) # mock_data = b"\x11\x22\x33\x44" # logger.debug(f"CAN接收数据:{mock_data.hex()}") #logger.info(f"CAN接收数据:") # return mock_data ''' mock_data = b"\x11\x22\x33\x44" logger.debug(f"AD接收数据:{mock_data.hex()}") #2026/4/10 dev_name = kwargs.get("dev_name") if not dev_name: logger.error("AD接收失败:kwargs中未传入dev_name(设备名称)") return None cfg = DEVICE_CONFIG_DICT[dev_name] base = int(cfg["内存基地址"], 16) offset = int(cfg["内存偏移地址"], 16) addr = base + offset # ====================== # 调用 Renode 读取数据 # ====================== cmd = f"read 0x{addr:X}" hex_str = renode.send_sync(cmd) #return bytes.fromhex(hex_str.strip()) logger.info(f"AD接收数据:{mock_data.hex()}") #return mock_data ''' return None except Exception as e: logger.error(f"UART数据接收失败:{str(e)}") return None