金牌会员
 
- 积分
- 2038
- 金钱
- 2038
- 注册时间
- 2017-8-2
- 在线时间
- 522 小时
|
发表于 2018-7-17 09:45:28
|
显示全部楼层
1.首先你得弄懂单片机直接是如何用串口通讯的。串口通讯的意义何在。
2.你得弄懂单片机串口通讯的协议是何物,存在意义为何,如何制定。
3.MODBUS,无非就是有个单片机是老大,其他几个单片机是小弟,老大给小弟下命令是通过串口通讯,至于如何下命令就是协议内容。从电路上看:主机能给所有的从机通过串口发送数据,而从机只能发给主机数据,发送给其他从机必须通过主机实现。
给你详细讲讲:
老大叫小弟的时候,是不是小弟们都听得见?是的,单片机之间的通讯也是如此。主机给从机发命令,不是主机单独给1个从机发命令,是给所有从机发命令,这从电路上也看得出来。所以主机发命令时,所有的从机都能接收到命令。这和老大下命令小弟们都听到是一个道理;
至于老大让“谁”去“干嘛”,是怎么传达的呢?究竟该谁去执行命令?想象一下,老大要明确地表达清楚,应该这么说:“老二,去把某人干了!”单片机也一样。主机给从机发命令时,肯定会加一位标志位,从机们接收到后会先判断这个标志位对应的是不是自己,如是则执行后续的命令,如不是,则“左耳进,右耳出”(啥都不干),老大没叫你呢,吵吵啥是吧。
这时老二办完事,到老大面前,回复说:“老大,事办完了。”一个合格的通讯协议都得有回复操作成功或失败的环节,从机完成主机下的命令后,要回复主机操作成功或者失败,好让主机判断下一步操作。
简单的例子:
主机发送一串命令帧到各从机:0x51 0x02 0x01 0x03 0xfb
0x51:枕头,如果你不知道枕头干嘛用,你还是先学学最基本的协议吧。
0x02:从机序号,代表需要执行命令的从机,相当于“上文中老二的名字”。
0x01:数据位,或者说是命令位,代表要执行的命令为何。
0x03:校验和,除枕头和枕尾外其他数据的和。这里是0x02+0x01=0x03。用于检测帧是否受到外界影响而发生数值改变。
0xfb:枕尾。
从机接收到数据后,首先判断枕头枕尾是否相符。如不符说明是异常帧,直接丢弃。如符合,继续判断从机序号。如果判断与自己的从机序号相等,则说明是从机发给自己的命令帧。即代表“老二”的从机检测到从机序号是0x02,发现是自己的序号,就知道这是老大给自己的命令,其他从机如“老三”、“老四”接收到的也是0x02,知道是老大发给老二的命令,所以“左耳进右耳出”。然后“老二”这个从机知道老大命令自己后,就接着判断数据位是啥,也就是说“老大”让自己干啥。做完老大的命令后,要发一个回复帧。然后是检验校验和(自己将接收到的数据加一次,判断是否和校验和相等),如检测出不相等,则说明是异常帧要求主机重发(对应的场景是老大说的话因为一些外部噪音影响老二没有听清,问老大你说啥?)。如相等则执行命令。
回复帧例子:
0x51 0x01 0x01 0x02 0xfb
0x51:枕头
0x01:命令位,即代表老大交代自己要做的事
0x01:操作位,0x01代表成功,0x02代表失败
0x02:校验和
0xfb:枕尾
主机接收到后判断一下帧中的各位数据就能知道自己要求的什么命令操作成功了没有。 |
|