使用STM32F3制作OBD-II阅读器

时间:2019-06-05 18:31:47

标签: stm32 can-bus keil obd-ii

我开始用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中进行一些更改

3 个答案:

答案 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函数吗?