Files
virtual_simulation_midware/midware/drivers/bus_uart.py
2026-06-16 15:40:19 +08:00

131 lines
4.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
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发送数据帧ID0x{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