avr单片机中使用MODBUS协议的方法.docx

上传人:李医生 文档编号:11695772 上传时间:2021-08-31 格式:DOCX 页数:5 大小:68.76KB
返回 下载 相关 举报
avr单片机中使用MODBUS协议的方法.docx_第1页
第1页 / 共5页
avr单片机中使用MODBUS协议的方法.docx_第2页
第2页 / 共5页
avr单片机中使用MODBUS协议的方法.docx_第3页
第3页 / 共5页
avr单片机中使用MODBUS协议的方法.docx_第4页
第4页 / 共5页
avr单片机中使用MODBUS协议的方法.docx_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《avr单片机中使用MODBUS协议的方法.docx》由会员分享,可在线阅读,更多相关《avr单片机中使用MODBUS协议的方法.docx(5页珍藏版)》请在三一文库上搜索。

1、有幸做了个项目,其中使用到了单片机和上位机通讯的程序,上位机用组态实现功能,探索了些 方法,写出来和大家分享一下,这些知识本不是什么秘密,本人参考了许多资料,自己整合了一下。 每种程序都是算法多样,最终功能实现就行。大家做单片机串口通讯时是不是总想有一种以不变应万变的思想,就是在底层单片机硬件和软 件不变的情况下,去适应任何上位机软件系统,当然可以实现,这就需要用到标准的通讯协议 了,以下我就和大家分享一下我做的modbus协议(单片机端),如果上位机用组态软件的情况下,你直接使用通讯协议就行它会自动和单片机通讯。大家在设计单片机程序时首先要定义好数据结构,先构想一下需要哪些采集数据,上位机

2、需要查询什么数据,数据的类型和全局与否,运算的精度等等。然后把上位机需要采集的数据用 一个数组管理起来,便于modbus协议的实现。单片机里串口通讯程序尽量用查询发送,中断接收的方式,要定义发送缓冲区和接收缓冲区,以便提高系统效率。以下程序用gcc实 现,单片机用avr单片机。ISR(USARTO_RX_vect)/串口 0接收中断服务程序 (volatile unsigned char status, data;cli () ;/关中断status = UCSROA; /ucsrOa 赋值状态标志data = UDRO;/接收的数据放入data变量usart0_rx_complete=0;/

3、接收完成标志赋值0,还没有完成if (status & (FRAMING_ERRORO PARITY_ERRORO DATA_OVERRUNO) =0)/ 如果各 标志位正确则, 执行以下usart0_rx_count+;/接收缓冲区指针加一 switch (usart0_rx_count)(case 1:if(data=add第一个字节是地址,读入内部本机地址进行比较 usartO_rx_buf0 =data; TIMSK0=0x01;/ 启动定时器 0 ,进行超时控制 )elseusartO rx count=0;break;case 2:if (data=0x03) | | (data=

4、0x01) | (data=0x05) | | (data=OxlO)=O)/ 如果第位不等于读指令0x03, 01,0 5,1 0功能码,则清接收缓冲区指针 usartO rx count=0; else/等于这几个功能码则进行,则将他放入接收数组,并预计接收数组长度,不是 10码时都是8个字节usartO_rx_bufl=data; if (data!=0x10) rxO buf size=8; break;case 3:usartO_rx_buf2=data;break;case 4:usartO_rx_buf3=data;break;case 5:usartO_rx_buf4=data

5、;break;case 6:usartO_rx_buf5=data;break;case 7:usartO_rx_buf 6=data ;/10码时接收的字节计数if (usartO_rx_buf 1 0x10) rxO_buf_si ze=9+usart0_rx_buf6; break;case 8:usartO_rx_buf7 =data;/l,用 10 功能码时有效的数据位,system_reg_data 的数据,这里规定最多接收26个字节(不带crc )break; case 9: usartO_rx_buf8=data;/2 break; case 10:usartO_rx_buf9

6、=data;/3 break; case 11:usartO_rx_buf10=data;/4 break; case 12:usartO_rx_buf11=data;/5 break; case 13:usartO_rx_buf12=data;/6 break; case 14:usartO_rx_buf13=data;/7 break; case 15:usartO_rx_buf14=data;/8 break; case 16:usartO_rx_buf15=data;/9 break; case 17:usartO_rx_buf 16=data;/10 break; case 18:u

7、sartO_rx_buf17=data;/ll break; case 19:usartO_rx_buf 18=data;/12 break; case 20:usartO_rx_buf 19=data ;/13 break; case 21:usartO_rx_buf20=data;/14 break; case 22:usartO_rx_buf21=data;/15 break;case 23: usartO_rx_buf22=data;/16 break; case 24: usartO_rx_buf23=data;/I7 break; case 25: usartO_rx_buf24=

8、data;/18 break; case 26: usartO_rx_buf25=data;/19 break; case 27: usartO_rx_buf26J =data;/20 break; case 28: usartO_rx_buf27=data;/21 break; case 29: usartO_rx_buf28=data;/22 break; case 30: usart0_rx_buf29=data;/23 break; case 31: usart0_rx_buf30J =data;/24 break; case 32: usart0_rx_buf31J =data;/2

9、5 break; case 33: usart0_rx_buf32=data;/26 break; case 34: usartO_rx_buf33=data;/27 break; case 35: usart0_rx_buf34=data;/28 break;if (usar10_rx_count=rx0_buf_size)/串 口 0 接收到了指定个数的数组则(usart0_rx_count=0; /接收缓冲区指针清零usartO_rx_complete=l;/ 串 口 0 接收完标志time0_num=0;/ 串口 0的中断次数清零。它是超时控制的依据TIMSK0=0x00;/ 收到数据

10、后则停止定时器0不进行超时控制 elseusartO rx count=0;)seiO ; /开中断以上中断接收程序可以实现上位机发来的0x03 , 01,0 5,1 0功能码指令,并且可以自动判断上位机发来10功能码的包长。大家首先要深入了解modbus通讯协议的内涵,仔细体会各行程 序的含义。其中本人加入了对通讯的超时控制,实际应用中很有必要。前面已经将上位机发来的命令,用中断接收的方式存入了单片机的接收缓冲区,中断服务程序不能执 行太长时间,所以要将对指令的解读放入了主程序里。把对modbus指令的解读程序列出,如下,只给出框架,因为每种应用是不一样的,需自己加入。void run_mo

11、dbus(void) switch (usart0_rx_bufLI)/判断主机发来的modbus功能码是什么case 0x01:/读继电器输出的当前状要加入回传数据break;case 0x03:/ 功能码 03要加入回传数据break;case 0x05:/05 功能码要加入回传数据break;case 0xl0:/10 功能码要加入回传数据break;)以上程序完全依赖一个提供给上位机数据的数组,自己要仔细排列好数据顺序,定义好长度。这里的程序使用一年有余完全正确和稳定。以上是基于串口实现的,信息高速发达的今天串口已经力不从心了。关于通讯,建议大家面向未 来,了解一下can总线网络通信,嵌入式工业以太网网络通信、zigbee无线网络通信、IrDA无线遥 控通信、wifi无线网络通信、gprs通信等等,本人喜欢zigbee ,精力有限不能全学啊。有心得 会继续分享。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1