avr单片机中使用MODBUS协议的方法.doc
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《avr单片机中使用MODBUS协议的方法.doc》由会员分享,可在线阅读,更多相关《avr单片机中使用MODBUS协议的方法.doc(6页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 Avr单片机中使用modbus协议的方法 有幸做了个项目,其中使用到了单片机和上位机通讯的程序,上位机用组态实现功能,探索了些方法,写出来和大家分享一下,这些知识本不是什么秘密,本人参考了许多资料,自己整合了一下。每种程序都是算法多样,最终功能实现就行。大家做单片机串口通讯时是不是总想有一种以不变应万变的思想,就是在底层单片机硬件和软件不变的情况下,去适应任何上位机软件系统,当然可以实现,这就需要用到标准的通讯协议了,以下我就和大家分享一下我做的modbus协议(单片机端),如果上位机用组态软件的情况下,你直接使用通讯协议就行它会自动和单片机通讯。 大家在设计单片机程序时首先要定义好数据结构
2、,先构想一下需要哪些采集数据,上位机需要查询什么数据,数据的类型和全局与否,运算的精度等等。然后把上位机需要采集的数据用一个数组管理起来,便于modbus协议的实现。单片机里串口通讯程序尽量用查询发送,中断接收的方式,要定义发送缓冲区和接收缓冲区,以便提高系统效率。以下程序用gcc实现,单片机用avr单片机。ISR(USART0_RX_vect)/串口0接收中断服务程序 volatile unsigned char status,data;cli();/关中断 status = UCSR0A;/ucsr0a赋值状态标志 data = UDR0;/接收的数据放入data变量 usart0_rx_
3、complete=0;/接收完成标志赋值0,还没有完成 if (status & (FRAMING_ERROR0 | PARITY_ERROR0 | DATA_OVERRUN0)=0)/如果各标志位正确则,执行以下 usart0_rx_count+;/接收缓冲区指针加一 switch (usart0_rx_count) case 1: if(data=add/第一个字节是地址,读入内部本机地址进行比较 usart0_rx_buf0=data; TIMSK0=0x01;/启动定时器0,进行超时控制 else usart0_rx_count=0; break; case 2: if (data=0
4、x03)|(data=0x01)|(data=0x05)|(data=0x10)=0)/如果第一位不等于读指令0x03,01,功能码,则清接收缓冲区指针usart0_rx_count=0; else/等于这几个功能码则进行,则将他放入接收数组,并预计接收数组长度,不是10码时都是8个字节usart0_rx_buf1=data;if (data!=0x10)rx0_buf_size=8; break; case 3: usart0_rx_buf2=data; break; case 4: usart0_rx_buf3=data; break; case 5: usart0_rx_buf4=dat
5、a; break; case 6: usart0_rx_buf5=data; break; case 7: usart0_rx_buf6=data;/10码时接收的字节计数 if (usart0_rx_buf1=0x10)rx0_buf_size=9+usart0_rx_buf6; break; case 8: usart0_rx_buf7=data;/1,用10功能码时有效的数据位,system_reg_data的数据,这里规定最多接收26个字节(不带crc) break; case 9: usart0_rx_buf8=data;/2 break; case 10: usart0_rx_bu
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- avr 单片机 使用 MODBUS 协议 方法
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内