历史上的今天
返回首页

历史上的今天

今天是:2025年03月01日(星期六)

2018年03月01日 | 利用数据帧实现单片机间的多机通信

2018-03-01 来源:eefocus

  单片机多机通信除了采用SM2和RB8组合的方式来实现多机通信外,在实际的使用中,还经常利用数据帧中包含地址信息来区分不同从机的方法实现单片机间的多机通信。主机发送的数据帧中包含地址信息,主机发送后,所有的从机都能接收到,每个从机将自身的地址与接收的数据帧中包含的地址相比较,如果与自身的地址相同,则进行对应的处理。否则将这帧数据丢弃,串行口继续等待接收数据。当然也可以根据实际功能需要,部分从机也可以根据数据帧的地址信息来决定是否接收数据帧,实现主机向部分从机“广播”的功能。


  由于此种通信方式采用在数据帧中包含有地址字节信息来区分各从机,因此只与软件有关,硬件接口与多机通信方法一完全一样。
  
  主机、从机一次发送数据为多个数据组成的一个数据帧,数据帧中包含起始、结束标志、地址、应答信息等,主机或从机接收完一数据帧后,根据数据帧中的标志和地址决定是否保存。接收保存后的数据,由数据帧的功能字节来说明数据字节的意义或者下一步的操作等。
  
  根据以上原理,定义数据帧的格式如下图所示。

  单片机间多机通信方法一中,主机、从机的地位区分明显,主机从机的任务不同,而本节介绍的这种方法,主机从机的界限并不是很明显,只要数据帧中标志和地址字节变化,就可以向指定地址的主机或者从机发送数据帧,接收到数据的从机可根据需要决定是否保存这帧数据。
  
  根据本节介绍的多机通信的原理,对图10-12中数据帧的各字节定义如下。
  
  ·数据帧以8位字节为基本数据单位,采用十六进制。
  
  ·起始字节:0XAA。
  
  ·主从标志:为0X0F表明这是主机发送的数据帧;为0XF0说明这是从机发送的数据帧。实际上也可以以地址来区分是从机还是主机发送的数据帧。
  
  ·功能:数据字节的功能作用,若无数据字节,功能字节就为0x00,采用压缩BCD数据格式。
  
  ·校验和:包括起始字节和结束字节在内的本数据帧的校验和,不包括校验字节本身。
  
  ·采用的校验算法:将不包括校验和在内的一帧数据相加,丢弃进位,将计算得到的值作为校验字节。
  
  ·帧长度:数据字节的长度。
  
  ·地址:如果是主机发送到从机,此字节是要接收数据的从机地址。如果是从机发送到主机,此字节是发送数据的从机的地址,一般采用十六进制。
  
  ·结束字节:0XDD。
  
  例如主机向地址为Oxl0的从机发送数据0x12,0x34,功能字节为0x55,则发送的一帧数据如下图所示。

  以下是采用此种数据帧格式的从机单片机程序,发送、接收均采用中断方式。设单片机的晶振频率为11.059 2MHz,通信的波特率为9 600bit/s,主机、从机的串行口均采用方式1。

  在程序发送部分,首先按照通信协议准备数据帧头,然后加入要发送的数据,计算校验和,最后发送整个数据帧,流程图如下图所示。

流程图

  程序中串行口接收部分较复杂,流程图如下图所示。


流程图

  程序中从串行口接收数据时使用了状态机,用来区分是接收数据还是接收数据帧头。接收时,当接收到起始字节和帧长度后,如果有数据字节存在,程序将转变为接收数据字节的状态,接收完指定的数据长度后,再转化为接收结束字节的状态。

  主要程序及代码如下:

  1.串行中断服务子程序voidseri_isr()
  
  串行中断服务子程序serijsr()函数完成接收制定格式的数据。程序中根据接收数据的状态来区分接收的是数据帧头还是数据帧中的数据,接收完一帧数据后,计算校验和并判断校验数据是否正确。程序代码如下:

  2.主程序voiDMAin()
  
  主程序中完成串行口初始化,取得从机地址后,发送4字节的数据“test”,如果主机响应并且本机接收到的数据帧正确,则执行下一步操作,程序代码如下:


  3.计算校验和子程序ucharcalc_chksum()
  
  计算校验和子程序calc_chksum()对除校验字节外的整个数据帧的数据计算得到校验和,然后添加到数据帧中校验字节部分,程序代码如下:

  4.串行口发送子程序void seri_send()
  
  串行口发送子程序seri_send()按照数据帧的格式将数据添加到sendbuf发送缓冲中。程序首先准备数据帧头,将p指针开始长度为data_len的数据加入到sendbuf数发送缓冲中,然后计算数据校验和,将校验和也加入到发送数据缓冲中,将发送缓冲中的数据发送出去,程序代码如下:

  5.串口初始化子程序voidseri_init()
  
  串口初始化子程序seri_init()初始化串口工作在方式l,波特率为9600bit/s,接收状态和接收缓冲初始化等,程序代码如下:

  6.读取数据子程序voidget_client_addr()
  
  由于每个从机的地址不同,get_client_addr()函数从P0口读取的数据作为从机地址,保存在全局变量client_addr变量中,程序代码如下:

  主机的发送接收程序与此类似,根据协议在数据帧中的标志和地址中加入不同的数据表明这是主机发送的数据,然后在数据字节中添加上数据即可。
  
  本方法构成的多机通信,单片机串口一般工作在方式1即可,由于有专门的校验和,因此,第9位的校验位已经没有必要了。
  
  通信时发送数据包需要一定的次序和规则,若主机正在发送数据的同时,从机也发送数据,或者多个从机同时发送数据,都会造成数据冲突,导致通信错误,因此通信时主机和从机不仅要发送协议规定格式的数据帧,还要根据不同的状态来决定何时发送数据。如果采用RS-485通信方式,由于该方式是半双工的,主从双方的数据交换—般采用应答式的,因此不会出现冲突的现象。
  
  各从机地址的生成,也可不用二进制拨动开关,而是通过现场系统的调试临时生成,并将该地址信息存入非易失性的存储器中。

推荐阅读

史海拾趣

HB公司的发展小趣事

理念:作为一家负责任的企业,Hartmann Codier GmbH始终将环保理念贯穿于产品研发、生产和销售的全过程中。公司严格遵守RoHS/WEEE等国际环保标准,杜绝使用或包含六种有毒重金属物质。

实践:在产品设计阶段,公司就充分考虑环保因素,采用环保材料和工艺;在生产过程中,公司加强了对废弃物的处理和回收利用;在产品销售后,公司还提供了完善的回收服务。这些措施不仅降低了产品对环境的影响,还提升了企业的社会形象。

Helium公司的发展小趣事

随着Helium在物联网领域的不断突破和发展,其市场认可度逐渐提升。在2021年,Helium通过Token销售完成了1.11亿美元的融资;次年年初,又以12亿美元估值完成了2亿美元的D轮融资。这些融资的成功不仅为Helium提供了充足的资金支持,也进一步验证了其在物联网和区块链领域的商业价值和发展潜力。同时,Helium还吸引了众多明星机构和投资者的青睐,为其未来的发展奠定了坚实的基础。

EG & G Inc公司的发展小趣事

EG & G Inc公司成立于20世纪早期,最初专注于电子设备的研发和生产。公司凭借其技术优势和创新能力,在电子行业中逐渐崭露头角。在成立初期,EG & G Inc就与多家知名企业和研究机构建立了合作关系,共同推动电子技术的发展和应用。这些合作关系不仅为公司带来了技术上的支持,也为其在市场上的扩张奠定了基础。

安谱隆(Ampleon)公司的发展小趣事

在独立发展后,安谱隆不断推出创新产品,巩固其在射频市场的地位。2015年12月,安谱隆推出了基于0.5μm工艺、额定功率为10至200W的GaN on SiC射频功率晶体管。这一产品的推出不仅展示了安谱隆在射频技术方面的领先实力,也为其在移动通信、广播电视等领域的应用提供了强有力的支持。

正泰公司的发展小趣事

随着工业4.0时代的到来,正泰公司积极推进智能制造转型。以海宁工厂为例,正泰通过引入自动化生产线和信息化管理系统,提高了生产效率和产品质量。同时,公司还加大了对智能制造技术的研发和应用力度,推动生产过程的数字化、网络化、智能化。这一转型不仅提升了公司的生产效率和市场竞争力,也为公司的未来发展奠定了坚实的基础。

以上五个故事只是正泰公司发展过程中的冰山一角,但它们充分展示了正泰公司在电子行业中不断创新、追求卓越的精神风貌和坚定决心。

倍思特(BEST)公司的发展小趣事

随着工业4.0时代的到来,正泰公司积极推进智能制造转型。以海宁工厂为例,正泰通过引入自动化生产线和信息化管理系统,提高了生产效率和产品质量。同时,公司还加大了对智能制造技术的研发和应用力度,推动生产过程的数字化、网络化、智能化。这一转型不仅提升了公司的生产效率和市场竞争力,也为公司的未来发展奠定了坚实的基础。

以上五个故事只是正泰公司发展过程中的冰山一角,但它们充分展示了正泰公司在电子行业中不断创新、追求卓越的精神风貌和坚定决心。

问答坊 | AI 解惑

单片机控制GSM模块

我最近在做单片机控制GSM模块的实验,先做的是单片机通过串口与GSM模块连接,谁知道单片机通过串口发送什么数据可以发送短信呢? 希望有高手指点!!!…

查看全部问答>

wince u盘?FAT32?

尊敬的斑竹及各位大牛们好,小弟一直关注次论坛!现在想问个问题?我的wince5.0系统现在可以识别u盘了,但是如果是FAT32格式的u盘识别时间要1分半钟(有时候可能还长),如果是FAt格式的u盘很快就识别了时间大概是10秒左右,我已经测试了n遍都是这样 ...…

查看全部问答>

求助优龙BIOS,nand_boot_beg段分析!

我对汇编不是很熟悉,看论坛里面有几个DX搞过这个,所以想请教下: 情况是:用AXD调试,bios可以起来!烧写到nandflash中后,就不可以了,所以就是nand_boot_beg段有问题了, 没有将nandflash中的代码搬到ram中去! nand_boot_beg代码如下 nand ...…

查看全部问答>

委托开发工业机器人控制系统,有兴趣的请回复QQ79500116

委托开发工业机器人控制系统,有兴趣的请回复QQ79500116…

查看全部问答>

Windows ce 下的一个简单的驱动设计问题

我的设备的物理地址基址是0x3800 0000,映射成虚拟地址是0x9000 0000 和0x B000 0000 我设计的流接口驱动程序使用VirtualAlloc()函数、VirtualCopy()以及MmMapIoSpace()函数应该怎么映射地址?…

查看全部问答>

linux硬件环境搭建好,在开发板上交叉编译运行自己的程序,却显示/bin/sh:./hello not found.

小弟终于搭建好uboot+linux2.6+busybox的硬件环境,用nfs系统成功驱动。 我自己编了简单的c程序,测试运行情况。 我在linux主机用arm-linux-gcc编译后,复制到开发板根目录运行 却显示 /bin/sh: ./hello  not found 请问是交叉编译 ...…

查看全部问答>

关于COM口的问题

串口硬件资源的问题,它有个输入/输出范围是03F8-03FF,但是书上好象只说串口芯片8251A只有两个字节的范围,就是命令/状态字缓冲器和数据缓冲器呀,这这么解释呢?还有就是想弄明白输入/输出地址范围和内存范围,网卡也是IO设备,怎么会变成内存范围呢?…

查看全部问答>

congigure讲解

Linux环境下的软件安装,并不是一件容易的事情;如果通过源代码编译后在安装,当然事情就更为复杂一些;现在安装各种软件的教程都非常普遍;但万变不离其中,对基础知识的扎实掌握,安装各种软件的问题就迎刃而解了。Configure脚本配置工具就是基础 ...…

查看全部问答>

求教M3高速AD采样的实现

本人菜鸟,请高手指点。有个M3(lm3s8962)小系统,要高速进行AD采样搜集,>=600K 采样频率。AD本身采样频率大于100MSPS,再加上SDRAM做数据缓冲。请问用M3能否实现?采用什么接口接受AD数据。SDRAM那里有什么要注意的?谢谢!…

查看全部问答>

如何实现ARM与DSP+FPGA通信

 在工业控制系统中,ARM,DSP,FPGA共在同一块板中,非常常见,怎样合理安排上面资源,请教大家?…

查看全部问答>