首先,什么是CAN呢。
学过散装英语的人,应该都有知道有一个单词叫can 。
那我们要讲的这个CAN,很多时候,发音可以和can一样。
这么说来,CAN通信的CAN,并不是一个单词,而是缩写了。
那这个CAN是由什么缩写的呢。
Controller
Area
Network
组合起来就是CAN了。接触过CAN的读者应该了解,CAN应用在汽车总线比较多。
一开始我也以为CAN里的C,指的是Car。Car Area Network ,唉,好像也可以哦。
抛开散装英语,这那个CAN,大意就是一种控制器的局域(区域)网络总线了。
就是支持CAN通信的设备,通过总线接到一个通信局域网络里。这个局域网和我们说的以太网的局域网不是一回事。
实际上,在控制器通信数据采集领域,其实应该是由以太网,串口和CAN三分天下的局面。
三者都支持总线。但是我们常见的主要是以太网和串口的控制器居多。高端点的主要是以太网,低端的设备主要就是串口。可能也和易用性,成本等原因,当然也有领域的不同吧。
像CAN主要在于汽车领域为主。
那些说还有什么SPI,IIC,IIS,1-Wire之类的,你出去。此总线非彼总线。
那么CAN不是以太网,它是什么呢。
请看。
在笔者报名参加了88块学画画培训班之后,画下了如下不是很严谨的CAN总线图。
为什么说不严谨呢。因为没有画上地线,还在终端电阻之类的。
眼力好的同学呢,很快就发现了,CAN总线,其实就是由H线和L线组成的。
似乎有一种似曾相识的感觉,却又说不上为什么,这么咋一看,说它是485总线都会有人信。
单纯从线来看,确实和485总线很相似。所以接下来介绍CAN,会尽量和我们熟悉的485总线类比。
CAN总线的这两根线呢,一般叫做CAN-High和CAN-Low。简称嘛就是CAN-H和CAN-L .
再简一点就是H和L了。
会有同学问了,可以再简一些嘛。这个问题问得好。
据悉,有些485设备已经可以不区分+和-,也就是485的A和B两根线可以反着接也能自动识别和适应。
但是在CAN设备上,这个不是很成熟,所以,还是尽量要区分H和L。
同样的,CAN的通信,也是靠H和L两根线的差分信号进行传输信号的。这点和485很类似了。
(图片来源于网络)
通过不同的电平组合信号,就能传输0和1信号,也就是一个位的信号。
8个位就组成一个字节。N个字节就组成了CAN协议了。
(图片来源于网络)
(图片来源于网络)
CAN的通信和485(也就是串口通信)很类似,也是有什么起始位,停止位之类的。
只是CAN会复杂一些,多了很多段。
其实多出来的内容,无非就是增加CAN通信的各种稳定性,协议可靠性等等。
对用户来说,那个起始位停止位其实不关心的。
只需要CAN设备双方通信参数匹配,就可以用来传输应用层数据了。
所以应用层数据才是我们比较关心的,也是我们使用中用到的。
刚才也提到了,CAN通信双方参数匹配,主要是要适配哪些呢。
像串口通信,要设置的波特率,数据位,停止位,校验位。
但是CAN呢,很多时候,只需要设置波特率就可以了。
毕竟波特率也是影响传输速度和距离的关键因素,至于什么数据位,校验位,CAN通信懒得去让用户设置,全都统一多好。省得用户一个个去操心了,是吧。
与其叫波特率,其实叫比特率更为合适。不同的比特率,能支持的通信线长度也不一样。具体根据需要匹配即可。
超过500米的通信线通信,笔者还没有尝试过,有条件的同学,可以去购买繁易支持CAN通信的FBox网关或者触摸屏去使用。
前面介绍了一大堆,简单用几句话概括就是:
CAN通信只需要两根线(H,L),双方设置同样的波特率,就可以进行收发数据。
CAN收发数据,收的是什么,发的又是什么呢。
这应该是CAN通信关键的内容了。
CAN通信和串口通信不一样。
串口通信至少要发送一个字节,通信双方需要约定好通信内容格式长度等,比较著名的就是modbus协议,当然还有各种PLC协议的串口协议,也都是约定好格式。
而CAN通信,在这点就稍微好一些,只要是CAN通信的,都是标准的。
不管是哪一家的CAN设备,通信双方收发的内容格式,就是统一的。
就像串口通信,都规定使用modbus rtu协议一样。
那我们这个CAN协议报文,就和modbus 类比一下。
modbus的通信,主要是读取位和字变量。位有0x,1x,字有3x,4x。地址访问都是65535个。
就拿4x地址来说,就是有65535个字。一个字是16个位。
可以把modbus理解为16位数据宽度的协议。modbus就类比于16位系统电脑。
看看CAN报文。CAN_ID如果类比于4X这样的寄存器地址的话,地址是有536870911个地址,5亿个地址。
然后每个地址能表示的数据是8个字节,也就是4个字。64个位。
那CAN就是64位系统了。
modbus为6万个字。
CAN为5亿个4字,10亿个双字,20亿个字。地址表示空间范围远超串口的modbus 。
在CAN报文里,最前面三个位,主要是标志位。用于表示不同的通信类型。
就刚才的报文格式来看,好像说不上为什么,感觉看得懂,但又哪里不太明白,也不知道怎么问。
学过modbus报文的人都知道,modbus报文呢,有主站发送方和从站回复方的。主站请求数据,从站回复数据。主从站报文不一样的。。
这就对了,从报文上,没有提到谁是主,谁是从哦。难道主从发送的都是同样的报文。
没错,就是这么大胆。
比如0000 0012 08 00 01 02 03 04 05 06 07 这个CAN报文,
指就是帧ID地址为0x12,发送8个数据长度,数据内容是00 01 02 03 04 05 06 07 。
主站可以发送给从站,从站也可以发送给主站。
CAN报文可以没有主从概念。但是我们从使用上,可以分主从。
从站发这个报文给主站,相当于上报从站的数据给主站,比如温度,湿度等变量。
如果是主站发送这个报文给从站,相当于主站给从站发送写命令或者控制命令。
思维敏捷的同学马上就反应过来了。
我主站都没有问呢,你个从站就给我发内容,你知道我要读什么内容了吗?
刚才提到,CAN总线的地址负载能力大概在5亿个左右。如果是标准帧,只有0x7FF个。
那么就需要使用CAN通信设备的人,进行地址规划,什么地址内容代表什么。
话是这么说了,但是一想,好像哪里不对。modbus是可以主动请求数据的。难道CAN也不行吗?
这就是所谓的远程帧了。
远程帧呢,大概意思就是,主站如果想请求某个帧ID(地址)的数据,刚向总线发送一个远程帧。也就是这个报文上,某个标志位置1的事。这时候对方设备向总线发送数据帧,就完成一次主动请求数据了。
补充一下,另一个设备收到远程帧呢,在CAN里面,并不会要求其它设备一定要回复。回复不回复远程帧,取决于这个CAN设备的程序,可以回,可以不回,爱回不回。
以上就是通俗的介绍一些CAN通信的内容了,抛开那些繁琐的细节。毕竟对我们CAN的使用者来说,不需要深入了解CAN里的每一个细节。
有时候就是把CAN设备拿出来,把两根线接好,上电,通信进行通信,看到数据即可。大不了就是设置了一个波特率。
双方再维护一下数据点表,哪个地址代表什么意思。对着数据点表添加数据,调试,通信正常,关机,走人。
CAN通信只是一个基本的通信接口或者协议。
在CAN之后,还有CANOpen之样的二次协议。
评论
查看更多