|
申明:以下文章来自21IC,作者:slotg ,感觉写的不错,特发献给本论坛的朋友们。
几年来规划过几项产品的通讯格式,也都成功的应用在多项产品当中,现提出一些规划的概念供大家参考:
1. 连线系统当中,有一台为主机或是上位机(MASTER),其他台为副机(SLAVE)。
2. MASTER为系统的主控者,所有的资料传输都是由MASTER向SLAVE发出命令要求后才进行资料传输,SLAVE并不主动传送资料。
3. MASTER使用Polling的方式来与SLAVE沟通资料,也就是MASTER一台一台的向SLAVE询问,因此每一台SLAVE都需要有自己的「台号」。
Slave1 ->Slave2 -> Slave3 -> ‧‧‧ -> Slave1
4. 通讯格式如下:
1. 前置码 (2byte)
2. 接收端台号 (1 byte)
3. 传送端台号 (1 byte)
4. 资料长度 (1 byte)
5. 命令码 (1byte)
6. 附加资料 (0~N byte)
7. check_sum (1byte)
底下资料格式为16进制格式
5. 前置码的目的是用来辨识通讯包的开头,这里设定了2个byte长度的前置码(5AA5),当程序收到5AA5时就知道是一个通讯包的开始。
6. 接收端台号表示资料是要对谁做通讯。(一般我们会规划MASTER的台号为00,SLAVE的台号从01开始,FF表示全体SLAVE)
7. 传送端台号表示资料是谁传送出来的。
8. 资料长度为不包括自己,后面还有几个byte的长度。
9. 命令码是MASTER告诉SLAVE该命令要做些什么事。(或是SLAVE回应MASTER该通讯包的意义)
10. 附加资料长度依命令码功能而定。
11. check_sum是从通讯包第一个byte开始资料的累加值,取1个byte长度,这是为了确认通讯包传输过程是否有错误的比对值。
12. 范例1:
MASTER要询问Slave1温度量测值(命令10),因此MASTER发送:
5A A5 01 00 02 10 12
(1) (2) (3) (4) (5) (7)
Slave1收到后回送:温度为30.5度(16进制的131等于10进制的305)
5A A5 00 01 04 10 31 01 45
(1) (2) (3) (4) (5) (6) (7)
13. 范例2:
MASTER要求Slave5输出资料88(命令20)
5A A5 05 00 03 20 88 AF
(1) (2) (3) (4) (5) (6) (7)
Slave5收到后回送:表示收到了
5A A5 00 05 02 20 21
(1) (2) (3) (4) (5) (7)
14. 范例3:全体广播
MASTER要求全体SLAVE重启至状态1(命令F0)
5A A5 FF 00 03 F0 01 F2
(1) (2) (3) (4) (5) (6) (7)
15. 为了确保传输的准确性,除非是全体广播命令,否则SLAVE必须都要回应MASTER的命令,没有回应表示该SLAVE断线。
16. SLAVE程序的设计方式是随时判断线路上的通讯命令(一般会使用中断方式接收),当判断到5A A5时,就知道是一个通讯包的开始,然后再判断下一个台号是否是呼叫自己,不是的话,后续的资料就不再理会,重新等待前置码。是的话就将后续资料读取完毕,读取完后判断check_sum是否正确,然后做出相对应的处理。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|