云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > 用stm32库函数编写的modbus源代码

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

  • 62 次阅读
  • 3 次下载
  • 2026/4/23 7:13:06

//启动数据发送

USART_ITConfig(USART1, USART_IT_TC, ENABLE);//开启数据发送

for(i=Address,j=4;i

*(pointer_2+j)=(u8)(HoldReg[i]>>8);//先放高位 *(pointer_2+j+1)=(u8)(HoldReg[i]&0x00FF);//再放低位

//写入校验码

SendKey=CRC16(pointer_2+1,*pointer_2-2); //将计算出来的校验码装入输出数据缓存中

*(pointer_2+(*pointer_2-1))=(u8)(SendKey>>8); *(pointer_2+(*pointer_2))=(u8)(SendKey&0x00FF);

中断

} else

} else { }

ErrorHandle(2,pointer_2);//错误起始地址

} else { }

ErrorHandle(3,pointer_2);//错误读取数量

}

{ }

Comu_Busy=0;

/* 函数功能:读取输入寄存器(模拟量输入)

函数输入:两个指针,pointer_1指向用来存放输入信息帧的数组,

pointer_2用来指向存放输出信息帧的数组(两个数组的第一个元

素都用来存放信息帧的有效字节个数) */

void ReadInputReg(u8 *pointer_1,u8 *pointer_2)//pointer_1用作输入,pointer_2用作输出 {

u16 Address=0;//待读取寄存器起始地址(HoldReg[i],i为0-99对应地址从0

后面的元素按照Modbus协议组织。

函数输出:无。

到99)

Address=(u16)(*(pointer_1+3))*256+(*(pointer_1+4));//先得到寄存器起始地址 Num=(u16)(*(pointer_1+5))*256+(*(pointer_1+6));//先得到要读取的寄存器个u16 Num=0;//要读取的寄存器个数 u16 SendKey;//要发送数据的校验值

u32 PortTemp;//用来存放从端口取过来的数据,临时计算用 u16 ReadData=0;//用来临时存放从端口读来的数据 u32 CalTemp=0;//用来临时计算

if(*(pointer_1)==8) //如果接收到的字节数不是8个,就是一个错误帧 {

if(Address<2) //只要地址小于2,就是合法地址 {

if(Address+Num<=2&&Num>0) //只要地址加数量大于0小于2,就是

*(pointer_2+2)=0x04;//第三个字节为功能码

合法数量

{

//用于for循环 u8i; u8 j;

*(pointer_2+3)=Num*2;//第四个字节为要发送的字节个数 *(pointer_2)=1+1+1+Num*2+2;//有效字节个数等于丛机地址+功

能码+字节个数+寄存器信息+CRC校验

//将端口ADC1和ADC2的数据预先读入到临时的数据缓存中 ReadData=ADC_GetConversionValue(ADC2); PortTemp=(u32)(ReadData); PortTemp=PortTemp<<16;

ReadData=ADC_GetConversionValue(ADC1); PortTemp=PortTemp|(u32)(ReadData);

//将PortTemp中的数据先进行预处理 PortTemp=PortTemp<<(Address*16); for(i=4,j=Num*2;j>0;i++,j-=2) {

CalTemp=(u16)(PortTemp<<16);

}

*(pointer_2+i)=(u8)(CalTemp>>8);//先放高位 *(pointer_2+i+1)=(u8)(CalTemp&0x00FF);//再放低位

//写入校验码

SendKey=CRC16(pointer_2+1,*pointer_2-2); //将计算出来的校验码装入输出数据缓存中

*(pointer_2+(*pointer_2-1))=(u8)(SendKey>>8); *(pointer_2+(*pointer_2))=(u8)(SendKey&0x00FF);

//启动数据发送

USART_ITConfig(USART1, USART_IT_TC, ENABLE);//开启数据发送

中断

}

} else { }

ErrorHandle(3,pointer_2);//错误读取数量

} else { }

ErrorHandle(2,pointer_2);//错误起始地址

else { }

Comu_Busy=0;

搜索更多关于: 用stm32库函数编写的modbus源代码 的文档
  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

//启动数据发送 USART_ITConfig(USART1, USART_IT_TC, ENABLE);//开启数据发送 for(i=Address,j=4;i>8);//先放高位 *(pointer_2+j+1)=(u8)(HoldReg[

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com