历史上的今天
返回首页

历史上的今天

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

正在发生

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

2018-10-07 来源:eefocus

调试工具: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;


}


}


推荐阅读

史海拾趣

Global Navigation Systems公司的发展小趣事
安装远程无线防盗报警系统时,首先需要将入侵探测器安装在需要防范的门窗等位置,并确保其能够准确检测到异常情况。然后,将微型无线报警发射机安装在探测器附近,并确保其能够接收到探测器的信号并发射出去。最后,将无线报警接收控制器安装在便于监控和接收报警信息的位置,并进行相应的调试和设置。在安装过程中,需要注意避免电磁干扰和信号衰减等问题,确保系统的稳定性和可靠性。
ELPIDA公司的发展小趣事

在成立初期,ELPIDA凭借其强大的技术实力和规模效应,迅速在全球DRAM市场中占据了重要地位。公司不断推出创新产品,扩大市场份额,成为行业内的重要参与者。然而,随着市场竞争的加剧和技术的快速变化,ELPIDA也面临着巨大的挑战。

Cables To Go公司的发展小趣事

在电子行业的激烈竞争中,Cables To Go公司以其卓越的产品品质和创新精神脱颖而出。公司从成立之初就注重产品研发,不断推出符合市场需求的高品质线缆产品。通过严格把控原材料采购和制造工艺,Cables To Go确保了每一根线缆都具备出色的性能和稳定性。同时,公司还积极投入研发,推出了一系列具有创新性的线缆解决方案,满足了客户多样化的需求。

成都成电硅海公司的发展小趣事

在电子行业中,产品质量是企业生存和发展的关键。成都成电硅海公司深知这一点,因此在生产过程中严格把控每一个环节。公司引进了先进的生产设备和技术,建立了完善的质量检测体系。每一批产品出厂前都要经过严格的质量检测,确保产品性能的稳定和可靠。这种对品质的执着追求,使得成都成电硅海公司的产品在市场上赢得了良好的口碑。

Eureka Microelectronics Inc公司的发展小趣事

Eureka一直重视研发实力的提升和技术创新。公司拥有一支专业的研发团队,致力于新技术的研发和应用。近年来,Eureka在人工智能、物联网等领域取得了多项技术突破,推出了一系列具有竞争力的新产品。这些技术的突破和应用,不仅提升了Eureka的产品性能和质量,也推动了公司在行业内的领先地位。

Analog Modules Inc公司的发展小趣事

Eureka在追求经济效益的同时,也积极履行社会责任。公司注重环保和可持续发展,致力于减少生产过程中的能源消耗和废弃物排放。同时,Eureka也积极参与公益活动,为社会做出积极贡献。这些努力不仅提升了公司的社会形象,也促进了公司的可持续发展。

请注意,以上故事仅为虚构,并非Eureka公司的实际历史。如有需要,请查阅相关公开资料或联系Eureka公司以获取准确信息。

问答坊 | AI 解惑

5口以太网交换机原理图

哥们今天刚按照实物反推出的,主芯片为DM9081的5口以太网交换机原理图.PROTEL99SE格式. [ 本帖最后由 西门 于 2009-5-12 18:31 编辑 ]…

查看全部问答>

关于OP07

哪位可以给我讲讲这电路上面的二极管是什么作用啊,特别是为什么要在OP07反馈和输出端加上IN4148…

查看全部问答>

一种用N+1条线实现矩阵键盘的方法

键盘输入作为最常用的输入设备仍有其不可替代的作用。下面首先对传统键盘作一个简单的介绍。 (1)传统键盘的介绍键盘的结构通常有两种形式:线性键盘和矩阵键盘。在不同的场合下,这两种键盘均得到了广泛的应用。线性键盘由若干个独立的按键组成, ...…

查看全部问答>

Platform Builder 4.2中自带的S3C2410BSP可以用于S3C2440么?

Platform Builder 4.2中自带的S3C2410 BSP可以用于S3C2440么? 或者哪里有下载用于S3C2440 BSP for PB4.2的?…

查看全部问答>

我做了一块485通讯板子,帮我看看?

     专业做单片机软硬件开发                地址:哈尔滨市 南岗区 会展中心             ...…

查看全部问答>

学习之MSP430中断

中断是MSP430微处理器的一大特色,有效地利用中断可以简化程序和提高执行效率。 MS430 的中断比较多,几乎每个外围模块都能够产生中断。MSP430 可以在没有事件发生时进入低功耗状态,事件发生时,通过中断唤醒CPU ,事件处理完毕后,CPU 再次进 ...…

查看全部问答>

请教:TI的M4单片机中的自带ROM里的程序是出厂就烧制好的吗?

用户自己能不能更改这个ROM内容,或者供用户使用?…

查看全部问答>

UDA1341驱动问题

有人用FPGA驱动过UDA1341吗?UDA1341芯片的L3MODE,L3CLOCK.L3DATA三个信号引脚对AD,DA有影响吗?…

查看全部问答>

ADuC7061中断方式实现串口通信

/******************************* * name: * function: * return: ********************************/ #include \"string.h\" #include \"global.h\" #include \"function.h\" #include #include unsigned char UartDataRecevice; un ...…

查看全部问答>

有人熟悉这块单片机板子么?Inter 8086的

在大四毕业季后,俺和同学去淘学长们遗留的“废品”。得此物,一查PDF,什么上世纪70年代的PDF,板子上印的是2009年做的。茫然呀…

查看全部问答>