first commit
This commit is contained in:
131
midware/drivers/bus_uart.py
Normal file
131
midware/drivers/bus_uart.py
Normal file
@@ -0,0 +1,131 @@
|
||||
"""
|
||||
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
|
||||
Reference in New Issue
Block a user