您当前的位置:五五电子网电子知识单片机-工控设备综合-其它主机和多个从机之间的串行数据传输的实现 正文
主机和多个从机之间的串行数据传输的实现

主机和多个从机之间的串行数据传输的实现

点击数:7323 次   录入时间:03-04 11:37:01   整理:http://www.55dianzi.com   综合-其它

  该例的硬件电路分为主机电路和从机电路。主机和从机的原理图基本一致,从机需要增加本机地址设置的电路,否则每个从机需要不同的程序,给实际应用带来不便。在采用不同的通信标准时,还需要进行相应的电平转换,也可以对传输信号进行光电隔离,多机通信中,通常采用RS-422或RS-485串行标准总线进行数据传输。
  
  主机的从机部分电路,如下图所示。

单片机多机通信系统从机部分电路图

  图中,单片机89C51的Pl口的低4位用于从机的地址设定,通过拨动开关可最多设定16个地址。比如四位开关都接通时,则读P0口可获得低4位0000,此时本机的地址可设定为OXFO,当从机复位初始化时,可读取PO口的数据获得本机地址,使用时从机地址可随时设定,而无需通过更改软件代码。
  
  与双机通信相比,多机通信增加了从机的数目,发送的数据有数据帧和地址帧,实现起来较双机通信复杂。利用单片机串行口工作方式3实现多机通信,关键是区分何时发送的是数据帧还是地址帧,这主要通过串口控制寄存器SCON中的SM2位实现。
  
  本例设计的通信协议如下:
  
  通信双方使用的波特率为9600bit/s,串行口采用工作方式3,接收和发送均采用查询方式,使用主从式通信。
  
  ·双机开始数据传输时,主机先发送地址帧等待从机应答。
  
  ·各从机初始化时都处于只接收地址帧的状态。接收到地址帧后,将接收到的地址与本机地址相比较,如果相符,则向主机发送应答信号,并开始接收数据;如果收到的地址与自身地址不同,则处于继续等待地址帧状态。
  
  ·从机在接收完数据后,将根据最后的校验结果判断数据接收是否正确,若校验正确,则向主机发送数据正确信号。
  
  由以上协议可知,在通信过程中需要使用一些应答信号,如下表所示。

  当传送数据时,规定一次固定传送N个数据,其中第N-1个数据位为校验位,格式如下图所示。

  校验方法采用常用的校验和,即将前N-1个数据相加,不考虑进位,发送数据时生成,作为第N-1个数据发送,接收方同样采用该算法生成校验字,最后比较,若相同,表示通信成功,否则失败。
  
  主机的程序流程图如下图所示。
  
  主要由以下子程序构成。
  
  ·voidserial_init():完成初始化串口的功能。
  
  ·voidsend_addrframe():完成发送地址字节功能。
  
  ·void send_data_frame():完成发送数据字节功能

14785214

 



www.55dianzi.com

  主机的相关程序如下:

  主函数main()程序代码如下:

  1.串行口初始化程序serial_init()
  
  串行口初始化程序serial_init()完成初始化串口的功能,定时器Tl工作在自动重装方式,作为波特率发送器,串行口工作在方式2,波特率为9 600bit/s。程序代码如下:

  2.发送地址帧函数send_addrframe()
  
  发送地址帧函数send_addrframe()完成发送地址字节功能。注意发送地址信息时,TB8位置1,程序代码如下:

  3.发送数据帧函数send_addr_frame()
  
  发送数据帧函数send_data_frame()完成发送数据字节功能。程序首先计算校验字节,然后发送数据字节(注意此时TB8为0),最后发送校验字节,程序代码如下:

  各个从机除地址不同外,其他都相同,从机的程序流程图如下图所示。


  
  主要由以下子程序构成。
  
  ·unsigned char recv_data_frame():完成接收数据帧并进行校验的功能。
  
  ·voidsend_ack():完成发送数据的功能。
  
  ·voidrecv_addrframe():完成接收地址帧的功能。

  ·void serial_init():完成初始化串行口的功能。
  
  从机的主要程序及代码如下:

 

 

 



www.55dianzi.com

www.55dianzi.com

  主程序中serial_init()函数初始化完毕后,等待主机发送的地址字节,若接收到与本机相同的地址字节,发送地址收到应答,然后再接收数据字节,接收完毕后对数据字节进行校验,校验正确则向主机发送数据正确,否则发送数据错误。程序代码如下:

  1.接收地址帧函数recv_data_frame()
  
  接收地址帧函数recv_data_frame0完成接收数据帧并进行校验的功能。程序首先置SM2位为0,然后接收数据,接收完毕后,计算接收到数据帧的校验和,并与主机发送的校验和比较,若相等,说明接收数据正确,返回DATA_ACK,否则返回DATA_ERR数据错误标志,程序代码如下:

[1] [2]  下一页


本文关键字:主机  综合-其它单片机-工控设备 - 综合-其它

《主机和多个从机之间的串行数据传输的实现》相关文章>>>