打印
[MCU]

通讯格式规划概念

[复制链接]
1872|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

通讯格式规划概念与经验谈 v1.1.pdf

144.33 KB

相关帖子

沙发
guzuguang| | 2013-10-22 17:12 | 只看该作者
很不错的  很值得学习

使用特权

评论回复
板凳
qazokmty| | 2013-10-22 18:42 | 只看该作者
good   学习学习学习

使用特权

评论回复
地板
Imakey| | 2013-10-22 20:19 | 只看该作者
工程手记,这些最值得学习了!

使用特权

评论回复
5
followme001| | 2013-10-22 21:34 | 只看该作者
不错的东西。

使用特权

评论回复
6
受不了了| | 2013-10-22 22:21 | 只看该作者
个人不太赞成玩这种非标的协议

使用特权

评论回复
7
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的累加和。

使用特权

评论回复
8
slotg|  楼主 | 2013-10-23 09:19 | 只看该作者
cjseng 发表于 2013-10-23 09:16
我觉得挺好的,MODBUS差不多也是这个格式。
我在项目中的自定义通讯格式跟这个也差不多,具体如下:
0XFF、 ...

感谢分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

1177

帖子

6

粉丝