扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
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与以太网的互联。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。