历史上的今天

今天是:2024年10月07日(星期一)

正在发生

2018年10月07日 | Atmega16中使用modbus协议

发布者:数字思维 来源: 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的时间设定

推荐阅读

一、盒仔机器人BOXZ,昵称盒仔,是一款开源的互动娱乐平台!百度一下,有很多盒仔的制作教程,基本都是用arduino制作完成的。假期没事,带着宝宝们用51制作了一个廉价的BOXZ。先上张图:从图上不难看出,为了宝宝们易于接受,我把盒仔的手机摇控改成了用线控的方法,做了一个简易的摇控器。二、材料准备以上原器件,某宝网上都有。另外,制作中需要用到壁...
在AI换脸软件ZAO和旷视校园人脸识别的风波后,17万人脸数据被公开挂在网上商城出售的消息“接踵而至”,人脸突然成了“危险品”。无处不在的人脸识别,当采集人脸数据的渠道越来越广,很多人会疑惑,我们的人脸数据最终都流向了哪里?在刷脸解锁手机,付款,进出入高铁站、机场的时代,你的脸可能在研究人员的数据集中,也可能在暗网的黑产交易中,也可能...
综合编译自HPC与Techcrunch不知是否巧合,十一期间,Nvidia和Arm都前后举行了开发者大会,Nvidia CEO黄仁勋前脚刚参加完GTC的主题演讲后,又与Arm CEO Simon Segars在Arm开发者大会上尽情畅谈,包括AI、数据中心、并购以及其他等等。黄仁勋:Nvidia与Arm结合为了人工智能和超级计算的创新黄仁勋承诺将保留Arm在剑桥的总部,同时将投资5200万美元打造英...
机器人编程其实是一个很大的范围。 机器人编程涉及的学科很多,集成应用(机器人编程和生产工艺)、机器人研发、电气、、机械、、等等。 机器人编程要学的哪些? 1.工业机器人应用编程,就学对应厂家的,如ABB的RAD,,这个要平台动手实操。 2.机器人算法开发,就得学习/C++,或者; 3.机器人控制器开发,C/C++,RTX等,也有在 ROS下开发的,界面M...

史海拾趣

问答坊 | AI 解惑

开关电源的尖峰干扰及其抑制

摘要:介绍几种抑制尖峰干扰的方法。通过产品试用表明,该方法有一定的实用性。 关键词:纹波滤波器二极管抑制电源纹波会干扰电子设备的正常工作,引起诸如计算机死机、数据处理出错及控制系统失灵等故障,给生产和科研酿成难以估量的损失,因此必 ...…

查看全部问答∨

xilinx EDK guide

好东西要分享啊!…

查看全部问答∨

C++入门

入门级教程,写的很好,不怕你是初学者…

查看全部问答∨

如何设置默认连接的WIFI路由器

各位大虾,请问在GSPI8686注册表中,如何可以设置默认连接wifi网络?谢谢!…

查看全部问答∨

截短文件大小失败

HANDLE hFile=CreateFile(L"BC.txt",GENERIC_WRITE|GENERIC_READ,FILE_SHARE_READ,NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL);//EVC下这里用CreateFileForMapping if(hFile==INVALID_HANDLE_VALUE) { MessageBox(L"Create file failed! ...…

查看全部问答∨

TI北京研讨会随想:DM8168——新一代高性能多媒体处理器

2010年8月9日,全球最大的芯片供应商德州仪器 (TI)在新世纪日航饭店举行了“TI技术研讨会(北京)“站的活动。整个研讨会分五个主题会场。在MCU/DSP主题讨论会上,TI公司DSP业务发展经理郑小龙先生介绍了TI最新的媒体处理器TMS320DM8168。 DM8168 ...…

查看全部问答∨

atr711只接32.768K晶振可以工作吗

                                 如题…

查看全部问答∨

STM32的任何端口都可以作为外部中断输入么?

                                 比如说像51里的INT0,在STM32里面这样的中断引脚是怎么定位的?另外最多可以有多少个外部中断输入?…

查看全部问答∨

tiny6410的地电位正常通电的情况下相对人体有75V!

最近正在学习tiny6410,今天将开发板上电后不小心碰了一下地引脚,被电了一下,只是有点麻麻的感觉。于是用万用表测量。首先使用直流档,测得地和人体的电位差为40mv。接下来用交流档,测得地和人体的电位为75V。然后将排插的开关断开,用万用表交 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved