本帖最后由 slotg 于 2013-10-29 11:00 编辑
几年来规划过几项产品的通讯格式,也都成功的应用在多项产品当中,现提出一些规划的概念供大家参考:
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 46 (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 26 (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是否正确,然后做出相对应的处理。
slotg
|