Atmega16中使用modbus协议

发布者:数字思维最新更新时间:2018-10-07 来源: eefocus关键字:Atmega16中  modbus协议 手机看文章 扫描二维码
随时随地手机看文章

调试工具:Modbus Poll


编程软件:Atmel Studio 7


理解:PC中的Modbus Poll是主机,而AVR芯片作为从机


此处有两种串行传输模式:RTU和ASCII


此处使用了RTU模式,这种模式的主要优点是较高的数据密度,在相同的波特率下比ASCII 模式有更高的吞吐率。每个报文必须以连续的字符流传送。


//以下是必要的函数


void usart_init(uint baud)//波特率


{


UCSRA = 0X00;


UCSRB = 0X00;                                 


UCSRC = 0X86;// 访问UCSRC  异步  奇偶禁止 停止位1位  字符8位


baud = fosk/16/baud-1;//得到UBRR   


UBRRL=baud;


UBRRH=baud>>8;  


UCSRB=(1<


SREG|=(1<<7);//全局中断开放


DDRD|=(1<<1);//PD1  TXD配置为输出模式


}


void usart_send(uchar *buf,uchar len)


{


while(len--)//发送所有字节


{                                //等待发送缓冲器为空


while(!(UCSRA&((1<


UDR=*buf++;//发送一个字节数据


}


}


uchar usart_read(uchar *buf, uchar len)


{


   uchar i;


   

   if (len > cntRxd)  //指定读取长度大于实际接收到的数据长度时,

   

{                  //读取长度设置为实际接收到的数据长度


   len = cntRxd;


   }


   for (i=0; i


   {


   *buf++ = bufRxd[i];


   }


   cntRxd = 0;  //接收计数器清零


   


   return len;  //返回实际读取长度


}


void UartRxMonitor(uchar ms)//定时器1发生一次中断则进入一次该函数(记得放入定时器的中断函数)


{


static uchar cntbkp = 0;


static uchar idletmr = 0;


if (cntRxd > 0)  //usart中断发生后,接收到数据,接收计数器大于零时,监控总线空闲时间


{


if (cntbkp != cntRxd)  //接收计数器改变,即刚接收到数据时,清零空闲计时


{


cntbkp = cntRxd;


idletmr = 0;//清空空闲计时


}


else                   //接收计数器未改变,即总线空闲时,累积空闲时间


{


if (idletmr < 22)  //1/19200*3.5*10


{                  


idletmr += ms;


if (idletmr >= 22)  //判定一帧接收完毕


{


flagFrame = 1;  //设置帧接收完成标志


}


}


}


}


else


{


cntbkp = 0;


}


}


void usart_driver()//此函数放入while(1)中(该函数网上有)


{


关键点需要按照自己的写,记得收和发都需要经过CRC校验(网上有现成程序crc16.c);


Modbus poll一发指令,就会触发ISR (USART_RXC_vect)函数,把指令放入bufRxd[];


等到flagFrame=1,启动usart_read()函数,把指令读到AVR;


把AVR采样得到的数放入数组,发指令的时候;


 比如:发指令 01 04   00 00   00 01   31 CA   // 设备地址01 功能码04  寄存器地址0  读取1个


 响应就是 01 04  02  00 0E  38 F4    //设备地址01 功能码04 字节数2   高字节00  低字节0E


                                                  //采样数值数码管显示为14,对应了0X0E                                


AVR采样得到的数值发回给PC机,并在Modbus poll上显示出来;


}


ISR (USART_RXC_vect)


{


if (cntRxd < sizeof(bufRxd)) //接收缓冲区尚未用完      bufRxd[]是char类型    


{                           


bufRxd[cntRxd++] = UDR;


}


}


关键字:Atmega16中  modbus协议 引用地址:Atmega16中使用modbus协议

上一篇:Atmega8a的采样(查询法)
下一篇:ATmega16定时器1的时间设定

推荐阅读最新更新时间:2024-03-16 16:15

基于嵌入式Linux的无纸记录仪通信设计
    在工业自动化控制系统中,记录仪起着十分重要的作用,它可以实时采集、监测和记录一些影响工艺过程和产品质量的重要参数,被广泛应用于石化、冶金、电力、机械、医药、轻工业等行业。随着电子技术的不断发展,记录仪已从传统的有纸模拟式发展到如今的无纸数字式 。与传统的有纸记录仪相比,无纸记录仪无机械磨损、显示直观、使用方便、故障率低和设备耗材少,因此被越来越多的应用于工业控制领域。       随着工业过程自动化的高速发展,企业对无纸记录仪提出了越来越高的要求,基于8位单片机的无纸记录仪的功能已远远达不到用户的要求。嵌入式ARM微处理核的32位RISC处理器以其强大的性能丰富的接口以及优异的性价比等诸多优势,而被越来越多的应用于无纸记录
[嵌入式]
PIC单片机与触摸屏串行通信的MODBUS协议实现
摘要:介绍一种在PIC单片机与触摸屏之间采用Modbus协议实现异步串行通信的方法。简单介绍了Modbus通信协议,给出了硬件电路连接图、程序流程图以及用PIC单片机C语言编写的部分通信程序。实际使用证明该方法数据传输稳定可靠,并提供了良好的人机交互环境。 关键词:触摸屏 PIC单片机 Modbus协议 通信 工控中经常需要观察系统的运行状态或者修改运行参数。触摸屏能够直观、生动地显示运行参数和运行状态,而且通过触摸屏画面可以直接修改系统运行参数,人机交互性好。单片机广泛应用于工控领域中,与触摸屏配合,可组成良好的人机交互环境。触摸屏和单片机通信,需要根据触摸屏采用的通信协议为单片机编写相应的通信程序。Modbus协议是美国M
[单片机]
基于AVR128的简单Modbus协议实现
Modbus通讯协议是由Modicon公司在1979年开发的,应用于工业现场控制的总线协议。Modbus通讯系统包括带有可编程控制的芯片节点和公共传输线组成,其目的是用于多节点数据的采集和监控。Modbus协议采用主从模式,通讯系统中有一个主机对多个节点从机进行监控,从机节点最多支持247个。每个从机均有自己独立的从机地址,而且改地址能够被主机识别。 能够支持Modbus协议的通讯系统有RS-232,RS-422,RS-485等。同时Modbus协议具有标准、开放、免费、帧格式简单等特点而被广大工程师所采用。 Modbus协议中数据传输采用ASCII和RTU两种模式。其中ASCII传输方式表示的数据通俗易懂,便于和PC机直
[单片机]
基于AVR128的简单<font color='red'>Modbus协议</font>实现
基于Modbus协议实现单片机与PLC之间的通讯
1 引言 HMI(人机界面)以其体积小,高性能,强实时等特点,越来越多的应用于工业自动化系统和设备中。它有字母、汉字、图形和图片等不同的显示,界面简单友好。配有长寿命的薄膜按钮键盘,操作简单。它一般采用具有集成度高、速度快、高可靠且价格低等优点的单片机 作为其核心控制器,以实现实时快速处理。 PLC和单片机结合不仅可以提 PLC的数据处理能力,还可以给用户带来友好简洁的界面。本文以 Modbus通讯协议为例,详细讨论了一个人机系统中,如何用C51实现单片机和PLC之间通讯的实例。 2 Modbus通讯协议 Modbus协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络和其它设备之间可以通信
[工业控制]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved