栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

CANoe与外界的信息交互-UDP实现

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

CANoe与外界的信息交互-UDP实现

        CANoe本身预留了许多与外界实现信息交互的接口,例如用户可以在Python中使用COM Server服务轻松调用CANoe及其工程运行的各种功能(可参考《CANoe开发从入门到精通》中的扩展话题部分)。但这种方法并不适用于使用CAPL语言进行自动化测试脚本开发的情况。本文将使用UDP通信的方式,将CANoe作为客户端,Python作为服务器端,完成两者之间的信号传输。

准备工作

CANoe(版本10.0以上,10.0以下的没有确认过)

License(要求CANoe PRO,带Option Ethernet)

Python(版本没有特殊要求,能用socket就行,本文使用Python 3.8)

服务器端

        服务器端的建立比较简单。关于socket的内容这里就不进行说明了,网上相关资料很多,有兴趣的可以自己去查一查。 

import socket

def main():
    ip_port = ('127.0.0.1', 2022)
    server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # udp协议
    server.bind(ip_port)
    print('Bind UDP on 127.0.0.1:2022')
    while Ture:
        data, client_addr = server.recvfrom(BUFSIZE)
        print('server收到的CANoe数据', data)
        reply = "get over"
        server.sendto(bytes(str(reply), encoding='utf-8'), client_addr)

if __name__ == '__main__':
    main()
    print('程序结束')

        服务器端建立完成后保持运行即可,等待客户端发送数据后做出回应。 

客户端

        在CANoe搭建客户端要相对复杂一点,这里我们一步一步来。

        首先,我们需要新建一个txt文件,内容如下

includes
{
  
}

variables
{
  UdpSocket gSocket;
  char gRxBuffer[1500];
  dword Server;
  dword Client;
  char client_char[16] = "127.0.0.1";
  char server_char[16] = "127.0.0.1";
  dword ClientPort = 2021;
  dword ServerPort = 2022;
}

on start
{
  Client = ipGetAddressAsNumber(client_char);
  Server = ipGetAddressAsNumber(server_char);
  gSocket = UdpSocket::Open( Client , ClientPort );
  
  if (IpGetLastError() != 0)
  {
    // if UdpSocket::Open fails, we print a message to the write window
    write( "<%BASE_FILE_NAME%> UdpSocket::Open failed with result %d", IpGetLastError() );
  }
  
  gSocket.ReceiveFrom( gRxBuffer, elcount(gRxBuffer) );
}

on preStop
{
  gSocket.Close();
}

on key 's'
{
  char text[200] = "hello world";
  gSocket.SendTo( Server,ServerPort,text,strlen(text) );
}
//此处声明了通过键盘按键s触发客户端向服务器端发送数据

void OnUdpReceiveFrom( dword socket, long result, IP_Endpoint remoteEndpoint, char buffer[], dword size)
{
  write(buffer);
  gSocket.ReceiveFrom( gRxBuffer, elcount(gRxBuffer) );
}

        将该文件拓展名改为.can,并保存。

        然后,打开CANoe(要有以太网License,Demo的是无法使用本文方法与外界信息交互的),从模板库新建一个以太网工程文件

         建立后的界面应如图所示(各版本界面可能不一样)

        进入Simulation界面

       调出Simulation Setup窗口

        右键单击窗口内的拓扑线,并选择插入一个网络节点

        编辑网络节点并选择前文中建立的can文件,打开,确认编译正常

        返回CANoe,选择TCP/IP Stack设置并将插入的节点设置为使用操作系统的网络

         点击运行工程,并按下键盘上的‘s’键(此处已在can文件中进行说明,请自行查阅)

        可以看到,write界面打印出了从服务器端收到的数据。

注意事项 

        不知道为啥,一开始用专业版的Windows11做CANoe与外界信号交互的时候一直报错,后来换成家庭中文版的就正常了。

        另外,服务器端和客户端的ip地址只能使用127.0.0.1作为本地测试地址,其余地址是无法进行通信的。 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/982075.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号