首页 > 其他分享 >手把手教你学AUTOSAR(四)--AUTOSAR通信机制

手把手教你学AUTOSAR(四)--AUTOSAR通信机制

时间:2024-10-02 13:47:36浏览次数:9  
标签:AUTOSAR -- 手把手 void 通信 uint8 发送 data LIN

目录

AUTOSAR通信机制

1. 通信层(Communication Layer)

1.1 网络管理(Network Management)

1.2 协议栈实现

1.3 消息传输

1.4 数据交换

2. 应用层(Application Layer)

2.1 运行时环境(Runtime Environment, RTE)

2.2 应用层通信接口

3. 典型通信场景

3.1 CAN通信示例

3.2 LIN通信示例

总结


 

AUTOSAR通信机制

AUTOSAR(Automotive Open System ARchitecture)为了实现ECU(Electronic Control Units)之间的有效通信,设计了一套全面的通信机制。这些机制覆盖了从底层硬件抽象到高层应用软件的多个层面,支持多种网络技术和协议栈。以下是AUTOSAR通信机制的详细介绍:

1. 通信层(Communication Layer)

通信层位于基础软件(BSW)之中,负责实现ECU之间的数据交换。它主要包括以下几个子层:

1.1 网络管理(Network Management)

网络管理负责管理和配置ECU内部及ECU之间的网络连接,包括网络初始化、网络配置、网络监控和网络路由等。

  • 网络初始化:初始化网络接口和配置参数。
  • 网络配置:配置网络参数,如波特率、网络拓扑等。
  • 网络监控:监控网络状态,检测网络故障。
  • 网络路由:管理网络数据包的路由。

1.2 协议栈实现

协议栈实现了多种通信协议,支持不同的网络技术和通信要求。常见的协议栈包括:

  • CAN(Controller Area Network)
    • 消息发送与接收:实现CAN消息的发送和接收。
    • 错误处理:处理CAN通信中的错误情况。
    • 仲裁机制:处理多个节点同时发送消息时的冲突。
  • LIN(Local Interconnect Network)
    • 消息发送与接收:实现LIN消息的发送和接收。
    • 主从通信:管理LIN网络中的主从关系。
  • FlexRay
    • 周期性通信:支持FlexRay的周期性通信。
    • 非周期性通信:支持FlexRay的非周期性通信。
  • Ethernet
    • TCP/IP协议栈:实现TCP/IP协议栈的功能。
    • 以太网通信:实现以太网通信功能。

1.3 消息传输

消息传输组件负责实现消息的发送和接收功能,包括消息的编码、解码、路由等。

  • 消息编码与解码:将应用层的数据转换成网络协议所需的数据格式。
  • 消息路由:根据网络配置将消息发送到正确的接收者。
  • 消息确认与重传:处理消息确认和重传机制,确保消息的可靠传输。

1.4 数据交换

数据交换组件负责管理数据在不同节点之间的交换,确保数据在正确的节点之间传输。

  • 数据缓冲:为数据传输提供缓冲机制。
  • 数据同步:确保数据在多个节点之间同步。
  • 数据过滤:根据需求过滤不需要的数据。
  • 数据压缩与加密:提供数据压缩和加密功能,提高传输效率和安全性。

2. 应用层(Application Layer)

应用层负责实现具体的应用功能,通过运行时环境(RTE)与通信层交互。

2.1 运行时环境(Runtime Environment, RTE)

RTE作为应用层和基础软件之间的桥梁,提供了以下功能:

  • 数据交换:负责应用层与通信层之间的数据交换。
  • 服务调用:提供应用层调用通信层服务的接口。
  • 配置管理:管理应用层与通信层之间的配置信息。

2.2 应用层通信接口

应用层通过特定的接口与通信层交互,实现数据的发送和接收。常见的应用层通信接口包括:

  • 信号发送(Signal Send):用于发送信号数据。
  • 信号接收(Signal Receive):用于接收信号数据。
  • 服务调用(Service Call):用于调用通信层提供的服务。

3. 典型通信场景

以下是一些典型的通信场景,展示了AUTOSAR通信机制的应用实例:

3.1 CAN通信示例

假设在一个车辆中,有两个ECU:发动机控制单元(ECU1)和仪表盘显示单元(ECU2)。ECU1需要向ECU2发送发动机转速信号。

 

c

深色版本

// 初始化CAN通信
void Can_Init(uint8_t canId, uint32_t baudrate) {
    // 设置CAN控制器的波特率
    Can_SetBaudRate(canId, baudrate);

    // 初始化CAN控制器
    Can_ControllerInit(canId);

    // 启动CAN控制器
    Can_Start(canId);
}

// 注册CAN发送回调函数
void RegisterCanSendCallback(void (*callback)(uint32_t id, const void* data, uint8_t len)) {
    Can_RegisterSendCallback(callback);
}

// 注册CAN接收回调函数
void RegisterCanRecvCallback(void (*callback)(uint32_t id, const void* data, uint8_t len)) {
    Can_RegisterRecvCallback(callback);
}

// CAN发送回调函数
void MyCanSendCallback(uint32_t id, const void* data, uint8_t len) {
    // 发送CAN数据
    Can_Send(id, data, len);
}

// CAN接收回调函数
void MyCanRecvCallback(uint32_t id, const void* data, uint8_t len) {
    // 接收CAN数据
    Can_Receive(id, data, len);
}

// 主函数
int main(void) {
    // 初始化CAN通信
    Can_Init(CAN_ID_1, CAN_BAUDRATE_125K);

    // 注册CAN发送和接收回调函数
    RegisterCanSendCallback(MyCanSendCallback);
    RegisterCanRecvCallback(MyCanRecvCallback);

    // CAN通信循环
    while (true) {
        // 发送发动机转速信号
        uint8_t rpm_data[2] = {0x12, 0x34};
        Can_Send(CAN_ENGINE_RPM_ID, rpm_data, sizeof(rpm_data));

        // 接收仪表盘显示单元返回的确认信号
        uint8_t confirm_data[2];
        Can_Receive(CAN_INSTRUMENT_CONFIRM_ID, confirm_data, sizeof(confirm_data));
        
        // 其他CAN通信相关操作
        // ...
    }

    return 0;
}

3.2 LIN通信示例

假设在一个车辆中,有一个车门控制单元(ECU1)和一个车窗控制单元(ECU2)。ECU1需要向ECU2发送车窗开关指令。

 

c

深色版本

// 初始化LIN通信
void Lin_Init(uint8_t linId, uint32_t baudrate) {
    // 设置LIN控制器的波特率
    Lin_SetBaudRate(linId, baudrate);

    // 初始化LIN控制器
    Lin_ControllerInit(linId);

    // 启动LIN控制器
    Lin_Start(linId);
}

// 注册LIN发送回调函数
void RegisterLinSendCallback(void (*callback)(uint32_t id, const void* data, uint8_t len)) {
    Lin_RegisterSendCallback(callback);
}

// 注册LIN接收回调函数
void RegisterLinRecvCallback(void (*callback)(uint32_t id, const void* data, uint8_t len)) {
    Lin_RegisterRecvCallback(callback);
}

// LIN发送回调函数
void MyLinSendCallback(uint32_t id, const void* data, uint8_t len) {
    // 发送LIN数据
    Lin_Send(id, data, len);
}

// LIN接收回调函数
void MyLinRecvCallback(uint32_t id, const void* data, uint8_t len) {
    // 接收LIN数据
    Lin_Receive(id, data, len);
}

// 主函数
int main(void) {
    // 初始化LIN通信
    Lin_Init(LIN_ID_1, LIN_BAUDRATE_19K);

    // 注册LIN发送和接收回调函数
    RegisterLinSendCallback(MyLinSendCallback);
    RegisterLinRecvCallback(MyLinRecvCallback);

    // LIN通信循环
    while (true) {
        // 发送车窗开关指令
        uint8_t window_cmd[1] = {0x01}; // 假设0x01代表开窗命令
        Lin_Send(LIN_WINDOW_CMD_ID, window_cmd, sizeof(window_cmd));

        // 接收车窗控制单元返回的状态
        uint8_t window_status[1];
        Lin_Receive(LIN_WINDOW_STATUS_ID, window_status, sizeof(window_status));
        
        // 其他LIN通信相关操作
        // ...
    }

    return 0;
}

总结

通过上述介绍,你已经详细了解了AUTOSAR通信机制的各个方面,包括通信层的功能、应用层的通信接口以及典型的通信场景。AUTOSAR通过标准化的通信机制,使得ECU之间的通信更加高效、可靠和可重用

 

标签:AUTOSAR,--,手把手,void,通信,uint8,发送,data,LIN
From: https://blog.csdn.net/MHD0815/article/details/142654253

相关文章

  • 微信小程序-微信支付功能接入步骤,适用所有编程语言,附源码
    微信支付作为中国最流行的移动支付方式之一,在微信小程序中集成微信支付功能可以极大的提升用户体验和业务转换率。那么如何在微信小程序实现微信支付的功能呢?(该文章通过nodejs接入,其他编程语言接入的步骤也是一样的哦!)请看下文步骤:demo源码地址:小程序支付:微信小程序支付demo......
  • 实验一
    实验一:1#include<stdio.h>2intmain()3{4printf("o\n");5printf("<h>\n");6printf("II\n");78return0;9}结果:实验二:1#include<stdio.h>23intmain()4{5......
  • INCS 775 – Data Center Security
    INCS775–DataCenterSecurityContent:OracleVirtualBoxor/andVMwareWorkstationPlayerinstallationPythonUserisnotinthesudoersfileMininetInstallationInstallingiPerf3onUbuntuStartMininetMininetHostsMininetMininetBuilt-inTopologi......
  • 痞子衡嵌入式半月刊: 第 108 期
    痞子衡嵌入式半月刊:第108期这里分享嵌入式领域有用有趣的项目/工具以及一些热点新闻,农历年分二十四节气,希望在每个交节之日准时发布一期。本期刊是开源项目(GitHub:JayHeng/pzh-mcu-bi-weekly),欢迎提交issue,投稿或推荐你知道的嵌入式那些事儿。上期回顾:《痞子衡嵌入式半月......
  • C#代码事件
    给按钮添加点击事件给Button添加属性Click,在button后任意地方输入Click,在选择,创建Button_Click事件(将事件绑定到新创建的名为Button_Click)privatevoidButton_Click(objectsender,RoutedEventArgse){}设置TextBlock的隐藏与实现(Visibility)Visibility有三种用法,第......
  • 美食食谱
    手抓饼500g面粉150g热水,150g凉水,20g黄油或者猪油,5g盐,揉好,分成6个剂子,喷油醒发一个小时,擀成长方形,抹上油酥(50g黄油,25g面粉,一点儿盐),提起来折扇子折起来,撑长,卷起来,醒发10分钟,擀开就行馄饨馅料500g前腿肉(450g瘦肉,50g肥肉),冷冻一到2个小时,加入调料,8g盐,8g糖,5g味精,1g胡椒粉,150g葱姜水......
  • 66_索引管理_复杂上机实验:基于scoll+bulk+索引别名实现零停机重建索引
    课程大纲1、重建索引一个field的设置是不能被修改的,如果要修改一个Field,那么应该重新按照新的mapping,建立一个index,然后将数据批量查询出来,重新用bulkapi写入index中批量查询的时候,建议采用scrollapi,并且采用多线程并发的方式来reindex数据,每次scoll就查询指定日期的一段数据......
  • 53_初识搜素引擎_上机动手实战如何定制搜索结果的排序规则
    1、默认排序规则默认情况下,是按照_score降序排序的然而,某些情况下,可能没有有用的_score,比如说filterGET/_search{"query":{"bool":{"filter":{"term":{"author_id":1}}}}}当然,也可以是constant_scoreGET/_search{"query"......
  • 【THM】Git Happens练习
    【THM】GitHappens练习与本文相关的TryHackMe实验房间链接:TryHackMe|GitHappens简介:老板让我创建一个原型代码,所以它就在这里!我们甚至使用了一种叫做“版本控制”的东西,使部署变得非常容易!你能找到应用程序的密码吗?第一题:找到超级机密的密码第一步端口扫描首先使......
  • 52_初识搜索引擎_上机动手实战如何定位不合法的搜索以及其原因
    GET/test_index/test_type/_validate/query?explain{"query":{"math":{"test_field":"test"}}}{"valid":false,"error":"org.elasticsearch.common.ParsingException:no[query]register......