在 Talking Car 这种场景下,Car 1 和 Car 2 就像是一对老搭档,中间隔着一堵庞大的、跑得飞快的墙。Car 1 想跟 Car 2 讲话,但墙忒快了,它得先跑起来再撞墙,撞墙了才有“声音”传那会儿。
这种机制核心就是 CAN 总线。 CAN 总线这东西,名字听着挺唬人,本来是军用的,后来才搞民用。它本质上就是一个长长的金属线,线两头接个管住器,中间塞满数据。
这线本身没啥信号,全是空的。数据得靠物理信号传过来,比如电压高低要么电流强弱,就像走在路上扔纸片,纸片在空气里是看不见的,你得靠眼(传感器)看到它。CAN 就是让这根金属线变成真正的“信号线”,把电压的高低直接变成“有”和“没”的信号,然后电子手(管住器)能直接看懂。 说个具体的例子。你设个信号,说“我要说‘你好’",管住器就在总线里插了一个开关,由开关拍板线电压变成 2.5V。
这时候线里全是高压或低压,空气里全是静默。电子手自然是看不见“你好”的,它不知道你刚刚说了啥。你得靠接收这段高压/低压信号,把它变成 1 和 0 这种数字算出来,才认识你是哪位。
这就是二进制。 那为啥不能直接让电子手看到你设定的 1 和 0 呢?出于电子手会乱猜。
没有背板(总线)的约束,电子手可能会想:“哦,这个电压高,那就是 1,电压低就是 0,那不管我如何改逻辑,它总能算出 1 和 0 对吧?”这就成了海盗逻辑。CAN 总线就是给电子手装了一个黑板,画着红线画着绿灯,告诉它“红线代表 1,绿线代表 0"。电子手得信守这个规矩,不然通信就彻底搞砸了。 这规矩是如何画出来的呢?通过纠正逻辑。
比如车 1 想跟车 2 讲话,车 1 管住器知道车 2 的引脚号是 2,它就设计个逻辑,让车 1 的引脚 2 一辈子保持高电平(电压高),作为底线。车 2 知道这个底线后,再设计逻辑:要是车 1 的引脚 2 是低电平,那就是车 1 想跟车 2 讲话,发送数据;要是车 1 的引脚 2 是高电平,那就是车 2 想跟车 3 讲话,发送数据。 这就怪了,为啥车 1 的引脚 2 需求一直维持高电平?出于要是它时刻跳来跳去,电子手就会感到困惑,不知道哪条线该当底线。CAN 协议规定,底线务必保持高电平。车 1 发大量数据时,它会不断把引脚 2 拉低,拉到底限。一旦车 2 的引脚 2 也拉到底限,这时候号角响起来,说:“嘿,车 1,你刚刚拉到底限了,说明你想跟我讲话,把数据发过来。” 这就解释了为啥喊话如此关键。喊话(号角)是物理信号,告诉车 2 该行动。当车 2 收到号角,它记得车 1 的引脚 2 是底线,就把它自己的引脚 2 拉高。
这时候,车 1 的引脚 2 低,车 2 的引脚 2 高,中间断开了。电子手看着这根断开的线,又想起喇叭号角,就知道这是车 1 在跟车 2 讲话,数据一定在中间某处。 再详细点说,车 2 的号角(引脚 2)本来是跟车 2 的引脚 2 连着的,车 2 想跟车 1 讲话,它就拉车 1 的引脚 2 到底线。车 1 的引脚 2 本来跟车 3 连着的,车 1 拉车 3 的引脚 2 到底线。车 2 的引脚 2 收到车 1 的号角,再拉车 3 的引脚 2 到底线。车 3 的引脚 2 收到车 2 的号角,再拉车 4 的引脚 2 到底线。
以此类推,直到车 N 的引脚 2 收到号角,拉车 N+1 的引脚 2 到底线。 可是,车 N+1 的引脚 2 本来是想跟车 N 讲话,要是车 N+1 也拉车 N 的引脚 2 到底线,那车 N 的引脚 2 就变成了“双底线”(高低都拉了,连底线都不是了)。
这时候电子手就懵了,它不知道车 N 到底想跟哪位讲话。
故此,车 N+1 的引脚 2 务必保持高电平,不能拉车 N 的引脚 2 到底线。
这就是为啥总线线越长,信号传得越久,越好办出错,需求更多的号角来维持秩序。 这种“拉底线”的操作,全车只有车 1 能执行。车 3 到车 N 只能执行“拉号角”的操作,也就是拉旁边人的脚丫。车 1 拉底线,车 2 拉脚丫,车 3 拉脚丫,车 4 拉脚丫……车 N 拉脚丫。车 N 拉脚丫后,它的脚丫就被拉低了,但它不能拉车 N+1 的脚丫,出于它得保持高电平。车 N+1 就保持高电平,车 N+2 就拉脚丫。
就这样,车 1 一直拉底线,车 N 一直拉脚丫,中间形成了一条高低波动的链条,把数据从车 1 传到了车 N。 这就是标准的“拉底线”和“拉号角”逻辑。车 1 拉底线,车 2 拉脚丫,车 3 拉脚丫……车 N 拉脚丫。车 N 的脚丫被拉低,但它不能拉车 N+1 的脚丫,它务必保持高电平。车 N+1 保持高电平,车 N+2 拉脚丫……车 N+1 拉脚丫后,它的脚丫被拉低,但它不能拉车 N+2 的脚丫,它务必保持高电平。车 N+2 保持高电平,车 N+3 拉脚丫。 这个过程一直重复,直到车 1 把脚丫拉低(拉号角),车 N+1 收到号角,把脚丫拉低(拉号角),然后车 N+2 拉脚丫,车 N+3 拉脚丫,直到车 N+3 拉号角。
这时候,车 N+3 的脚丫被拉低,但它不能拉车 N+4 的脚丫,它务必保持高电平。车 N+4 保持高电平,车 N+5 拉脚丫……车 N+3 拉号角后,它的脚丫被拉低,但它不能拉车 N+4 的脚丫,它务必保持高电平。车 N+4 保持高电平。 故此,车 1 的脚丫一直是底线,车 2 到车 N 的脚丫形成了一条高低交替的链条。车 N 的脚丫被拉低,但它不能拉车 N+1 的脚丫。车 N+1 保持高电平。车 N+2 拉脚丫,车 N+3 拉脚丫,车 N+3 拉号角。车 N+3 的脚丫被拉低,但它不能拉车 N+4 的脚丫,它务必保持高电平。车 N+4 保持高电平。
以此类推,一直传到车 N+1。 什么的,这里有个小难题。车 1 一直拉底线,车 N 一直拉脚丫。车 N 的脚丫被拉低,但它不能拉车 N+1 的脚丫。车 N+1 保持高电平。车 N+2 拉脚丫,车 N+3 拉脚丫,车 N+3 拉号角。车 N+3 的脚丫被拉低,但它不能拉车 N+4 的脚丫,它务必保持高电平。车 N+4 保持高电平。 这意味着,车 1 拉底线,车 N 拉脚丫,车 N+1 保持高电平,车 N+2 拉脚丫,车 N+3 拉脚丫,车 N+3 拉号角,车 N+4 保持高电平……车 N+1 拉脚丫。车 N+1 拉脚丫后,它的脚丫被拉低,但它不能拉车 N+2 的脚丫,它务必保持高电平。车 N+2 保持高电平。车 N+3 拉脚丫,车 N+3 拉号角。车 N+3 的脚丫被拉低,但它不能拉车 N+4 的脚丫,它务必保持高电平。车 N+4 保持高电平。 这逻辑有点绕,我们换个说法。车 1 的脚丫是底线。车 2 的脚丫被车 1 拉低,故此车 2 的脚丫也是底线。车 3 的脚丫被车 2 拉低,故此车 3 的脚丫也是底线。车 4 的脚丫被车 3 拉低,故此车 4 的脚丫也是底线。……车 N 的脚丫被车 N-1 拉低,故此车 N 的脚丫也是底线。车 N+1 的脚丫被车 N 拉低,故此车 N+1 的脚丫也是底线。 不对,车 N+1 的脚丫被车 N 拉低,车 N+1 的脚丫成了底线,那车 N+2 的脚丫被车 N+1 拉低,也变成底线了。
那车 N+3 的脚丫也被拉低,也变成底线了。……车 N+K 的脚丫也被拉低,也变成底线了。 那要是车 N+K 拉号角呢?车 N+K 的脚丫被拉低,但它不能拉车 N+K+1 的脚丫,它务必保持高电平。车 N+K+1 保持高电平。车 N+K+2 拉脚丫,车 N+K+3 拉脚丫,车 N+K+3 拉号角。车 N+K+3 的脚丫被拉低,但它不能拉车 N+K+4 的脚丫,它务必保持高电平。车 N+K+4 保持高电平。 这就对了。车 N+1 到车 N+K 都拉脚丫,车 N+K+1 保持高电平。车 N+K+2 拉脚丫,车 N+K+3 拉脚丫,车 N+K+3 拉号角。车 N+K+3 的脚丫被拉低,但它不能拉车 N+K+4 的脚丫,它务必保持高电平。车 N+K+4 保持高电平。 故此,车 1 的脚丫是底线。车 N 的脚丫被车 1 拉低,故此车 N 的脚丫也是底线。车 N+1 的脚丫被车 N 拉低,故此车 N+1 的脚丫也是底线。车 N+2 的脚丫被车 N+1 拉低,故此车 N+2 的脚丫也是底线。……车 N+K 的脚丫被车 N+K-1 拉低,故此车 N+K 的脚丫也是底线。 车 N+K+1 的脚丫被车 N+K 拉低,故此车 N+K+1 的脚丫也是底线。车 N+K+2 的脚丫被车 N+K+1 拉低,故此车 N+K+2 的脚丫也是底线。车 N+K+3 的脚丫被车 N+K+2 拉低,故此车 N+K+3 的脚丫也是底线。车 N+K+3 拉号角。车 N+K+3 的脚丫被拉低,但它不能拉车 N+K+4 的脚丫,它务必保持高电平。车 N+K+4 保持高电平。 这样一直重复,直到车 N+1。车 N+1 拉脚丫,车 N+2 拉脚丫,车 N+3 拉脚丫,车 N+3 拉号角。车 N+3 的脚丫被拉低,但它不能拉车 N+4 的脚丫,它务必保持高电平。车 N+4 保持高电平。 故此,车 1 的脚丫是底线。车 N 的脚丫被车 1 拉低,故此车 N 的脚丫也是底线。车 N+1 的脚丫被车 N 拉低,故此车 N+1 的脚丫也是底线。车 N+2 的脚丫被车 N+1 拉低,故此车 N+2 的脚丫也是底线。……车 N+K 的脚丫被车 N+K-1 拉低,故此车 N+K 的脚丫也是底线。 车 N+K+1 的脚丫被车 N+K 拉低,故此车 N+K+1 的脚丫也是底线。车 N+K+2 的脚丫被车 N+K+1 拉低,故此车 N+K+2 的脚丫也是底线。车 N+K+3 的脚丫被车 N+K+2 拉低,故此车 N+K+3 的脚丫也是底线。车 N+K+3 拉号角。车 N+K+3 的脚丫被拉低,但它不能拉车 N+K+4 的脚丫,它务必保持高电平。车 N+K+4 保持高电平。 这样一直重复,直到车 N+1。车 N+1 拉脚丫,车 N+2 拉脚丫,车 N+3 拉脚丫,车 N+3 拉号角。车 N+3 的脚丫被拉低,但它不能拉车 N+4 的脚丫,它务必保持高电平。车 N+4 保持高电平。 故此,车 1 的脚丫是底线。车 N 的脚丫被车 1 拉低,故此车 N 的脚丫也是底线。车 N+1 的脚丫被车 N 拉低,故此车 N+1 的脚丫也是底线。车 N+2 的脚丫被车 N+1 拉低,故此车 N+2 的脚丫也是底线。……车 N+K 的脚丫被车 N+K-1 拉低,故此车 N+K 的脚丫也是底线。 车 N+K+1 的脚丫被车 N+K 拉低,故此车 N+K+1 的脚丫也是底线。车 N+K+2 的脚丫被车 N+K+1 拉低,故此车 N+K+2 的脚丫也是底线。车 N+K+3 的脚丫被车 N+K+2 拉低,故此车 N+K+3 的脚丫也是底线。车 N+K+3 拉号角。车 N+K+3 的脚丫被拉低,但它不能拉车 N+K+4 的脚丫,它务必保持高电平。车 N+K+4 保持高电平。 这样一直重复,直到车 N+1。车 N+1 拉脚丫,车 N+2 拉脚丫,车 N+3 拉脚丫,车 N+3 拉号角。车 N+3 的脚丫被拉低,但它不能拉车 N+4 的脚丫,它务必保持高电平。车 N+4 保持高电平。 故此,车 1 的脚丫是底线。车 N 的脚丫被车 1 拉低,故此车 N 的脚丫也是底线。车 N+1 的脚丫被车 N 拉低,故此车 N+1 的脚丫也是底线。车 N+2 的脚丫被车 N+1 拉低,故此车 N+2 的脚丫也是底线。……车 N+K 的脚丫被车 N+K-1 拉低,故此车 N+K 的脚丫也是底线。 车 N+K+1 的脚丫被车 N+K 拉低,故此车 N+K+1 的脚丫也是底线。车 N+K+2 的脚丫被车 N+K+1 拉低,故此车 N+K+2 的脚丫也是底线。车 N+K+3 的脚丫被车 N+K+2 拉低,故此车 N+K+3 的脚丫也是底线。车 N+K+3 拉号角。车 N+K+3 的脚丫被拉低,但它不能拉车 N+K+4 的脚丫,它务必保持高电平。车 N+K+4 保持高电平。 这样一直重复,直到车 N+1。车 N+1 拉脚丫,车 N+2 拉脚丫,车 N+3 拉脚丫,车 N+3 拉号角。车 N+3 的脚丫被拉低,但它不能拉车 N+4 的脚丫,它务必保持高电平。车 N+4 保持高电平。 故此,车 1 的脚丫是底线。车 N 的脚丫被车 1 拉低,故此车 N 的脚丫也是底线。车 N+1 的脚丫被车 N 拉低,故此车 N+1 的脚丫也是底线。车 N+2 的脚丫被车 N+1 拉低,故此车 N+2 的脚丫也是底线。……车 N+K 的脚丫被车 N+K-1