微波EDA网,见证研发工程师的成长!
首页 > 通信和网络 > 通信网络技术文库 > 嵌入式CAN-Ethernet接入网关的设计与实现

嵌入式CAN-Ethernet接入网关的设计与实现

时间:10-22 来源:C114 点击:



3.2协议转换及以太网通信程序

我们知道,CAN协议为了提高实时性采用了短帧结构,而以太网帧相对要长得多;CAN协议采用载波侦听多路存取/消息优越仲裁(CSMA/AMP)机制解决冲突,而以太网帧采用CSMA/CD机制。这两点构成了 CAN与以太网之间的主要差异,也使得 CAN-Ethernet网关的转换协议复杂度提高,但由于本系统中采用了 Server/Client的通信服务模式,网关即作为服务端,相对于文献[4]省去了网关与服务器通信这一过程,所以转换协议也相对较简单。

在本系统中,由于网关实现的是 CAN总线报文和 UDP报文的数据转发,任务相对简单,因此传输层协议选择较为简洁的 UDP协议,建立无连接的服务端。服务端首先确立端口号,通过调用 socket建立套接字,然后使用 bind绑定本地地址,通过调用 sendto()和 recvfrom()就可以向以太网发送和接收数据。 定义 Socket地址常用的是 sockaddr_in结构,该结构如下所示: struct sockaddr_in {

在本系统中,Socket地址定义为gatewayAddr,端口号设置为8888。不同的计算机存放多字节值的顺序不同,有的计算机在起始地址存放低字节,有的则起始存放高字节,为了程序的可移植性,需要将主机字节顺序转换成网络字节顺序。调用htons()将端口号 8888转换成网络字节顺序,然后赋值给 gatewayAddr.sin_port。gatewayAddr.sin_addr. s_addr定义了主机的 IP地址,在本系统中并不关心主机的 IP地址,故将主机的 IP设置为INADDR_ANY,即可以侦听局域网内的任一主机的报文。

协议转换与以太网通信程序流程如图 3所示。



if有udp报文到达{ recvfrom(gatewayfd,&rcvbuf1,sizeof(rcvbuf1),0,(structsockaddr *)&cliaddr, &clilen);//接收以太网报文

将rcvbuf1内数据放入消息队列msg1.buffer;}

else if 消息队列 0有 CAN报文 //通过判断 CAN报文标志位来实现

{ msgrcv(msgid,&msg0,sizeof(struct msgtype0),1,0);//接受消息队列 0中数据

置位 CAN报文标志位;

将消息队列值读入rcvbuf0;

sendto(gatewayfd,rcvbuf0,sizeof(struct rcvbuf0),(struct sockaddr *)&cliaddr,clilen); }//将 UDP报文发送到以太网

else return;

4应用

该网关应用于基于 CAN总线的监测监控系统和测控设备接入以太网的场合,已经在江苏徐州大屯煤电公司姚桥煤矿得到了应用,目前设备运行良好。应用本网关可以解决现场总线设备接入以太网的问题,真正实现了大范围的数据采集和管理,满足了煤矿企业的现代化管理要求。CAN-Ethernet网关在井下监测监控系统中的位置如图 4所示。



5结束语

本文的创新点:本文设计的 CAN-Ethernet网关,采用ARM 处理器,软件上采用消息队列机制实现不同进程间通信,实现了基于CAN总线的煤矿井下监控系统与矿井综合业务数字网的互联,为煤矿企业信息化建设奠定了基础。本设计实现的 CAN-Ethernet通信程序,无须另外添加转换接口设备,在原有硬件基础上仅通过软件修改即可实现 CAN与以太网的互联。



Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top