【问题标题】:making OBD-II reader using STM32F3使用STM32F3制作OBD-II阅读器
【发布时间】:2019-10-21 07:10:29
【问题描述】:
我开始使用 stm32f303k8 和 MCP2551 收发器 CAN BUS 制作自己的 obd2 阅读器。
为此,我从 CubeMX 开始使用 Hal 函数进行配置和 Keil,但我仍然试图从汽车中获取数据.. 直到我找到替换 elm327 函数并使用 AT 命令但使用标准外围库创建的 stm32f10x 代码..
这里是代码https://github.com/ARoozitalab/ELM327-OBDII-STM32
现在我只想知道如何用 stm32f3 的 hal 库替换这段代码,因为 ST 删除了 stm32f3 的标准外设库
我可以在 CMSIS 库和 Hal 函数之间合并吗?
我尝试使用 hal 库重建项目并在我的代码中添加副本 OBD.C,但我认为我需要在 Config.h 中进行一些更改
【问题讨论】:
标签:
stm32
can-bus
keil
obd-ii
【解决方案1】:
我将帮助您学习 OBDII 协议
首先您应该了解您汽车的ECU。
也许那个 ECU 不支持 CAN 端口(ISO 15765),所以你不能用 CAN 读取你的 ECU
你的 ecu 型号是什么?
我建议你先在cube mx中建一个项目,启用一个串口就可以了
然后启用您的 CAN 协议中断
在 CAN 中断处理程序中使用此示例代码:
CanRxMsg RxMessage;
CanTxMsg TxMessage;
/* receive */
CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
printf("idv: %u ",RxMessage.IDE);
printf("exID: %04X ",RxMessage.ExtId);
printf("ID: %03X ",RxMessage.StdId);
printf("DLC: %02X ",RxMessage.DLC);
printf("DATA:");
for(i=0;i<RxMessage.DLC;i++)
{
printf(" %02X ",RxMessage.Data[i]);
}
printf("\r\n");
此代码将 CAN 接收到的消息转换为串行(您的串行波特率应为 115200)(并且您的 CAN 波特率必须为 500k)
然后将开发板连接到 PC 上的串行监视器
您应该会看到内部汽车发送接收消息,例如:
idv: 0 exID: 80012CC ID: 43F DLC: 08 DATA: 00 40 60 FF 68 48 09 00
idv: 0 exID: 80012CC ID: 580 DLC: 08 DATA: 00 00 00 00 00 00 00 00
idv: 0 exID: 80012CC ID: 440 DLC: 08 DATA: FF 00 00 00 FF 47 09 00
idv: 0 exID: 80012CC ID: 580 DLC: 08 DATA: 00 00 00 00 00 00 00 00
idv: 0 exID: 80012CC ID: 545 DLC: 08 DATA: 80 47 00 8B 00 00 00 00
idv: 0 exID: 80012CC ID: 690 DLC: 08 DATA: 00 00 00 00 00 00 0C 00
idv: 0 exID: 80012CC ID: 7DF DLC: 08 DATA: 02 01 0C 00 00 00 00 00
idv: 0 exID: 80012CC ID: 7E8 DLC: 08 DATA: 04 41 0C 09 C8 00 00 00
idv: 0 exID: 80012CC ID: 545 DLC: 08 DATA: 80 00 00 8A 00 00 00 00
idv: 0 exID: 80012CC ID: 580 DLC: 08 DATA: 00 00 00 00 00 00 00 00
idv: 0 exID: 80012CC ID: 440 DLC: 08 DATA: FF 00 00 00 FF 4D 09 00
idv: 0 exID: 80012CC ID: 580 DLC: 08 DATA: 00 00 00 00 00 00 00 00
idv: 0 exID: 80012CC ID: 545 DLC: 08 DATA: 80 00 00 8C 00 00 00 00
idv: 0 exID: 80012CC ID: 440 DLC: 08 DATA: FF 00 00 00 FF 4F 09 00
idv: 0 exID: 80012CC ID: 580 DLC: 08 DATA: 00 00 00 00 00 00 00 00
idv: 0 exID: 80012CC ID: 440 DLC: 08 DATA: FF 00 00 00 FF 52 09 00
idv: 0 exID: 80012CC ID: 545 DLC: 08 DATA: 80 00 00 8A 00 00 00 00
idv: 0 exID: 80012CC ID: 580 DLC: 08 DATA: 00 00 00 00 00 00 00 00
idv: 0 exID: 80012CC ID: 690 DLC: 08 DATA: 00 00 00 00 00 00 10 00
idv: 0 exID: 80012CC ID: 7DF DLC: 08 DATA: 02 01 0C 00 00 00 00 00
idv: 0 exID: 80012CC ID: 329 DLC: 08 DATA: 86 BD 6B 10 11 20 00 14
idv: 0 exID: 80012CC ID: 7E8 DLC: 08 DATA: 04 41 0C 09 DC 00 00 00
...
【解决方案2】:
非常感谢您的回复!我确定我的车有 CAN-BUS .. 我会试试你的例子,看看串行中是否有数据 .. 我还想知道为什么在你的 Main.C 中你需要蓝牙和 K-Line 功能 ..但是你不调用 CAN 函数?
【解决方案3】:
您可以在 OBDII.C 上查看 CAN 功能
在第一个 src 检测 OBDII 协议并初始化端口
之后,当您要发送或接收OBDII数据时,src使用检测到的协议连接OBDII
所以CAN功能在OBDII.C的低层