基于CANoe仿真GW实现Ethernet和CAN报文互转.doc

基于CANoe仿真GW实现Ethernet和CAN报文互转.doc

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
基于CANoe仿真GW实现Ethernet和CAN报文互转 在日常工作中,经常会遇到需要网关(GW)进行数据转换在车载不同的网络中,如本文分享内容: 1、实现以太网帧(以UDP数据包发送)转CAN报文帧; 2、以CAN报文转以太网帧报文。 转换功能由网关GW承载。 如下是具体步骤: 1、基于CAN总线新建CANoe工程: 在CAN网络上添加添加Ethernet网络: 2、在CAN网络中添加节点: 并命名:EthernetCanGW。 进行如下操作进行合并: 3、分别在CAN/Ethernet网络添加IG模块,用于发送待验证的数据: 4、在GW仿真节点编辑CAPL脚本实现CAN与Ethernet车载网络的转换。 在CAPL Browser进行编辑: 变量声明: variables { constWORD kPort = 23; constWORD kRxBufferSize = 1500; constWORD kTxBufferSize = 1500; _align(1) struct CANData { BYTE dlc; BYTE flags; DWORD canId; BYTE canData[8]; }; UdpSocket gSocket; CHAR gRxBuffer[kRxBufferSize]; CHAR gTxBuffer[kTxBufferSize]; DWORD gOwnAddress; DWORD gModuleAddress= 0xFFFFFFFF; } on start运行内容 onstart { DWORD addresses[1]; IpGetAdapterAddress( 1, addresses, elcount(addresses) ); gOwnAddress = addresses[0]; gSocket = UdpSocket::Open( 0, kPort ); if (gSocket.GetLastSocketError() != 0) { write( %base_file_name% Open UDP socket failed, result %d. Measurement stopped!, gSocket.GetLastSocketError() ); stop(); return; } if (gSocket.ReceiveFrom( gRxBuffer, elcount(gRxBuffer) ) != 0) { if (gSocket.GetLastSocketError() != 997) { write( %base_file_name% UDPReceive failed, result %d. Measurement stopped!, gSocket.GetLastSocketError() ); stop(); return; } } } 在总线上on触发如下: (1)对于以太网: void OnUdpReceiveFrom( dword socket, long result, dword address, dword port, char buffer[], dword size) { DWORD dataOffset; struct CANData canData; message * canMsg; if (address == gOwnAddress) return; if (gModuleAddress == 0) { gModuleAddress = address; } dataOffset = 0; while (dataOffset + __size_of(struct CANData) = size) { memcpy( canData, buffer, dataOffset ); canMsg.id = (canData.canId 0x1FFFFFFF) | ((canData.flags 0x80) ? 0: 0); canMsg.dlc = canData.dlc 0x0f; canMsg.rtr = ((canData.flags 0x40) ? 1 : 0); canMsg.byte(0) =

文档评论(0)

play + 关注
实名认证
内容提供者

分享有帮助的文档

1亿VIP精品文档

相关文档