一,前言
基于stm32的uds Boot调试成功--Apple的学习笔记已经实现了单片机bootloader代码,测试用自己写的canoe CAPL脚本对bootloader进行测试。但是我的目的是玩玩QT上位机工具制作,那么每个主机厂bootloader都不太一样,我的目标是做一个通用的boot上位机工具。
二,代码架构设计
首先uds按顺序发命令,而这个顺序应该通过配置文件可以设置,那么首先想到的就是xml,一般游戏开发或工具类的等都喜欢用此小型数据库。而且还能专门做工具界面来生成xml文件。
接着就是按顺序发命令,这个顺序理解为状态机,通过状态机不断运行,从开始直至结束。那么在c++中常用的就是map依次扫描,而xml的信息就可以存储到map中。那么就变成了命令可以动态可配置,符合我要做一个通用的boot上位机的功能需求。
三,xml结构体设计
写代码无非就是数据结构设计加逻辑,我现在等于用了数据和逻辑分离的设计思想来解决bootloader工具可以支持任意主机厂,因为uds和tp协议是一样的,主要是数据内容不同。暂时xml设计为如下样式,ServiceType就是我代码要实现的每个独立的类。
<Step1>
<CanID>F_ID</CanID>
<ServiceType>SID10</ServiceType>
<Request>10,03</Request>
<Response>50,03</Response>
<Delay_ms>0</Delay_ms>
</Step1>
<Step2>
<CanID>P_ID</CanID>
<ServiceType>SID10</ServiceType>
<Request>10,02</Request>
<Response>50,02</Response>
<Delay_ms>0</Delay_ms>
</Step2>
<Step3>
<CanID>F_ID</CanID>
<ServiceType>SID27</ServiceType>
<Request>27,09</Request>
<Response>67,09,seed</Response>
<Delay_ms>0</Delay_ms>
</Step3>
四,c++状态机设计
至于c++状态机设计网上太多了,这是经典的。主要用context上下文调度来切换state到下一个state,这个看上去有点像单片机的FreeRTOS切换任务一样。
我先加入了3条服务,用来搭建和验证框架的。如下为读取xml的ServiceType来创建任务类的map数组。context start后,则调用_context->Update(msg);
按map顺序调用状态机了。
void CanListener::contextEnable()
{
_context = new FsmState::Context();
// 根据xml创建状态机
getXMLandCreateState();
// 开始状态机
_context->Start(_startType);
}
void CanListener::getXMLandCreateState()
{
QMap<QString, Cmd>::iterator iter = xmlreader::instance().getCmdInfBegin();
_startType = iter.key().toStdString();//iter.value().ServiceType.toStdString();
while (iter != xmlreader::instance().getCmdInfEnd())
{
// 通过xml的ServiceType来创建任务类的map数组
_step = iter.key();
QString ServiceType = iter.value().ServiceType;
if(ServiceType == "SID10")
{
_context->CreateState(new SID10(), "SID10","",_step.toStdString());
}
else if(ServiceType == "SID27")
{
_context->CreateState(new SID27(), "SID27","",_step.toStdString());
}
else if(ServiceType == "SID31")
{
_context->CreateState(new SID31(), "SID31","",_step.toStdString());
}
else
{
//add later
}
iter++;
}
}
五,验证截图
如下截图,解析xml成功,且报文发送的顺序正确,但是rx报文的时间不会更新,之后要修改的。
![](https://img.haomeiwen.com/i12010880/a46b2b0295be58e2.png)
六,小结
闲着没事,就喜欢创造发明小工具,还有很多功能没加,且听下回分解~
网友评论