[MCU] 通讯格式规划概念

[复制链接]
2232|7
 楼主| slotg 发表于 2013-10-20 23:10 | 显示全部楼层 |阅读模式
本帖最后由 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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
guzuguang 发表于 2013-10-22 17:12 | 显示全部楼层
很不错的  很值得学习
qazokmty 发表于 2013-10-22 18:42 | 显示全部楼层
good   学习学习学习
Imakey 发表于 2013-10-22 20:19 来自手机 | 显示全部楼层
工程手记,这些最值得学习了!
followme001 发表于 2013-10-22 21:34 | 显示全部楼层
不错的东西。
受不了了 发表于 2013-10-22 22:21 来自手机 | 显示全部楼层
个人不太赞成玩这种非标的协议
cjseng 发表于 2013-10-23 09:16 | 显示全部楼层
我觉得挺好的,MODBUS差不多也是这个格式。
我在项目中的自定义通讯格式跟这个也差不多,具体如下:
0XFF、0XFF、0XFF、0XFF、S_ADDRESS、D_ADDRESS、COMM0、COMM1、NUMBH、NUMBL、DATA0、DATA1……DATAn、SUMH、SUML。
其中
  0XFF、0XFF、0XFF、0XFF表示一帧数据的开头;
  S_ADDRESS表示发送端地址;
  D_ADDRESS表示接收端地址;
  COMM0、COMM1表示指令;
  NUMBH、NUMBL表示数据帧的长度(除了帧头4个0XFF,包括SUMH、SUML);
  DATA0、DATA1……DATAn表示数据(可以没有数据);
  SUMH、SUML表示S_ADDRESS、D_ADDRESS、COMM0、COMM1、NUMBH、NUMBL、DATA0、DATA1……DATAn的累加和。
 楼主| slotg 发表于 2013-10-23 09:19 | 显示全部楼层
cjseng 发表于 2013-10-23 09:16
我觉得挺好的,MODBUS差不多也是这个格式。
我在项目中的自定义通讯格式跟这个也差不多,具体如下:
0XFF、 ...

感谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

1177

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部