用stm32库函数编写的modbus源代码

用stm32库函数编写的modbus源代码

ID:11687941

大小:54.07 KB

页数:38页

时间:2018-07-13

用stm32库函数编写的modbus源代码_第1页
用stm32库函数编写的modbus源代码_第2页
用stm32库函数编写的modbus源代码_第3页
用stm32库函数编写的modbus源代码_第4页
用stm32库函数编写的modbus源代码_第5页
资源描述:

《用stm32库函数编写的modbus源代码》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、用stm32库函数编写的modbus源代码说在前面的话:1.请勿盲目抄袭。这个协议使用了一个定时器,所以在别处请不要再使用,如果定时器不够用,可以做虚拟定时器。也就是采用一个物理的定时器产生时基。在这个定时器的中断函数中可以给相应的多个定时器自加1.每个虚拟定时器可以用两个变量分别控制打开关闭,和计时。这个已经试验通过了可行的。其实就跟我们使用物理的定时器一样,只不过物理的定时器是用晶振产生时基。2.这段代码已经调试通过了,也硬件试验过,没有问题,如果你出现问题了,看看你在主函数的的各种基本配置有没有完成。如果要使用06和10号功能,

2、你还需要在主函数中建立一个100个元素的数组,每个元素是16位。3.写这个文档的时候,这个协议已经是半年前完成的了。所以有些东西记得不是很清楚了,如果说错了,请以实际为准。只是不想让这份代码死在电脑中了,所以才想起来要拿出来分享,支持开源精神。4.如果实在实在是没有弄出来,请联系我,可以共同交流,我的邮箱:xiaozuoadamszju@163.com#include"stm32f10x.h"/*此Modbus协议暂时只支持RTU模式,只支持作为Modbus从设备。暂时支持的功能码(16进制)如下表所示:01.读线圈状态(读多个输出位

3、的状态,有效地位为0-31)02.读输入位状态(读多个输入位的状态,有效地位为0-31)03.读保持寄存器(读多个保持寄存器的数值,有效地位为0-99)04.读输入寄存器(读多个输入寄存器的数值,有效地址为0-1)05.强制单个线圈(强制单个输出位的状态,有效地位为0-31)06.预制单个寄存器(设定一个寄存器的数值,有效地址为0-99)0F.强制多个线圈(强制多个输出位的状态,有效地址为0-31)10.预制多个寄存器(设定多个寄存器的数值,有效地址为0-99)暂时支持的错误代码为:01不合法功能代码从机接收的是一种不能执行功能代码。

4、发出查询命令后,该代码指示无程序功能。(不支持的功能代码)02不合法数据地址接收的数据地址,是从机不允许的地址。(起始地址不在有效范围内)03不合法数据查询数据区的值是从机不允许的值。(在起始地址的基础上,这个数量是不合法的)供用户调用的函数有:1.voidModInit(u8Id);//用于Modbus初始化,在函数调用前,必须初始化函数,用于Main函数中2.voidModRcv(void);//用于modbus信息接收,放在串口接收中断3.voidModSend(void);//用于modbus信息接收,放在串口发送中断例如:v

5、oidUSART1_IRQHandler(void)//USART1中断{if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET){voidModRcv(void);………………}if(USART_GetITStatus(USART1,USART_IT_TC)!=RESET){voidModSend(void);//用于modbus信息接收………………}}*///modbus用通讯参数u8Tim_Out;//大于3.5个字符时间,保守取3ms(波特率9600的时候大约2点几毫秒)u8Rcv_

6、Complete;//一帧是否已经接受完成u8Send_Complete;//一帧是否已经发送完成u8Com_busy;//通讯繁忙,表示上一帧还未处理结束u8Rcv_Buffer[210];//用来存放接收到的完整的一帧数据(第一个字节用来存放接收到的有效字节数,也就是数组中的有效字节数)u8Send_Buffer[210];//用来存放待发送的完整的一帧数据(第一个字节用来存放待发送的有效字节数,也就是数组中的有效字节数)u8Rcv_Data;//用来存放接收的一个字节u8Send_Data;//用来存放要发送的一字节u8Mod_

7、Id;//用来标志作为从站的站号u8Rcv_Num;//用来表示接收的一帧的有效字节数(从功能码到CRC校验)u8Send_Num;//用来表示待发送的一帧的字节数u8*PointToRcvBuf;//用来指向接收的数据缓存u8*PointToSendBuf;//用来指向带发送的数据缓存u8Comu_Busy;//用来表示能否接收下一帧数据u8HaveMes;externu16HoldReg[100];//CRC校验查表用参数/*CRC高位字节值表*/staticu8auchCRCHi[]={0x00,0xC1,0x81,0x40,0

8、x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。