我开始用stm32f303k8和MCP2551收发器CAN BUS制作自己的obd2阅读器。 为此,我首先使用CubeMX进行配置,并使用Hal函数使用Keil,但我仍然尝试从汽车中获取数据。.直到找到stm32f10x代码,它们替换了elm327功能并使用AT Command,但使用标准外围设备库创建了..
这是代码https://github.com/ARoozitalab/ELM327-OBDII-STM32
现在我只想知道如何用stm32f3的hal库替换此代码,因为ST删除了stm32f3的标准外设库
我可以在CMSIS库和Hal函数之间合并吗?
我试图用hal库重建项目,并在代码中添加副本OBD.C,但我认为我需要在Config.h中进行一些更改
答案 0 :(得分:1)
我将帮助您学习OBDII协议的顺序
首先,您应该了解汽车的ECU。 也许ECU不支持CAN portocol(ISO 15765),所以您无法使用CAN读取您的ecu
您的ecu模型是什么?
我建议您首先在多维数据集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
...
答案 1 :(得分:0)
您可以在OBDII.C上看到CAN功能 在第一个src处检测OBDII协议并初始化端口 之后,当您要发送或接收OBDII数据时,src使用检测到的协议来连接OBDII
因此CAN功能处于OBDII.C的较低级别
答案 2 :(得分:-1)
非常感谢您的回复!我确定我的车上有CAN总线..我将尝试您的示例,看看串行中是否有数据..我也想知道为什么在Main.C中您需要蓝牙和K线功能..但是您不调用CAN函数吗?