完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
只看该作者
举报
你好,能看下你modbus功能码03通过串口助手的从机调试代码嘛,谢谢
/*功能码3函数*/ void Modbus_Fun3() { u16 F3_Addr; u8 F3_Num; //主机要读取的字节数量 u8 F3_NumByte; // 从机要回复的自己数量,串口回复数量应该在256-1-2=253之间 u8 i = 0,j; u8 F3_Return_Num;//正常应答从机返回的总字节数 u16 F3_Crc_Value; F3_Addr = modbus.rcbuf[2]*256 + modbus.rcbuf[3]*1; //起始地址 if(F3_Addr>=0x00 && F3_Addr<=0xFF) //判断地址是否处于协议要求的地址范围内(功能码3地址应该处于0x0000 至 0xFFFF之间) { F3_Num = modbus.rcbuf[4]*256 + modbus.rcbuf[5]*1; //读取数量 if(F3_Num >= 0 && F3_Num <= 0x7D ) //读取寄存器数量 { //开始填写需要回复的数据到发送缓冲区 modbus.Sendbuf[i++]=modbus.myadd;//第一填充本从机地址 modbus.Sendbuf[i++]=0x03;//第二、填充运行的功能码 F3_NumByte = (F3_Num*2)%256; //有效数据数=寄存器数量*2 modbus.Sendbuf[i++]=F3_NumByte;//第三、填充字节数, for(j = 0;j < F3_Num;j ++) //填充主机需要的数据 { modbus.Sendbuf[i++] = F3_RegValue[F3_Addr + j] /256; modbus.Sendbuf[i++] = F3_RegValue[F3_Addr + j] %256; } F3_Crc_Value = crc16( modbus.Sendbuf, i ); //计算返回数据的CRC //注意本来crc16( uchar *puchMsg, uint usDataLen )已经把低位放在前面了 modbus.Sendbuf[i++] = F3_Crc_Value / 256;//填充CRC校验低位, modbus.Sendbuf[i++] = F3_Crc_Value % 256;//填充CRC校验高位 for(F3_Return_Num = 0;F3_Return_Num < i;F3_Return_Num ++)//从机发送数据 { USART_SendData(USART1,modbus.Sendbuf[F3_Return_Num]); while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) ==RESET); } } else //如果要求读取的寄存器数量不在规定数量之内 { u8 F3_unusual_NumReg,i; u16 F3_Unusual_Return_CRC; modbus.Sendbuf[i++] = modbus.myadd;//第一填充本从机地址 modbus.Sendbuf[i++] = (modbus.rcbuf[1] | 0x80);//第二、填充运行的功能码+0x80 异常码 modbus.Sendbuf[i++] = 0x03; //填充异常代码 F3_Unusual_Return_CRC = crc16( modbus.Sendbuf, i ); modbus.Sendbuf[i++] = F3_Unusual_Return_CRC / 256;//填充CRC校验低位, modbus.Sendbuf = F3_Unusual_Return_CRC % 256;//填充CRC校验高位 for(F3_unusual_NumReg = 0;F3_unusual_NumReg <= i;F3_unusual_NumReg ++) { USART_SendData(USART1,modbus.Sendbuf[F3_unusual_NumReg]); //地址 while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) ==RESET); } } } else //如果地址范围不在规定地址区间内 { u8 F3_unusual_Addr,i; u16 F3_Unusual_Addr_CRC; modbus.Sendbuf[i++] = modbus.myadd;//第一填充本从机地址 modbus.Sendbuf[i++] = (modbus.rcbuf[1] | 0x80);//第二、填充运行的功能码+0x80 异常码 modbus.Sendbuf[i++] = 0x02; //填充异常代码 F3_Unusual_Addr_CRC = crc16( modbus.Sendbuf, i ); modbus.Sendbuf[i++] = F3_Unusual_Addr_CRC / 256;//填充CRC校验低位, modbus.Sendbuf = F3_Unusual_Addr_CRC % 256;//填充CRC校验高位 for(F3_unusual_Addr = 0;F3_unusual_Addr <= i;F3_unusual_Addr ++) { USART_SendData(USART1,modbus.Sendbuf[F3_Unusual_Addr_CRC]); //地址 while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) ==RESET); } } }
网上一大堆啊 朋友
发布
电子发烧友网
电子发烧友论坛
查看 »
小黑屋| 手机版| Archiver| 电子发烧友 ( 粤ICP备14022951号 )
GMT+8, 2023-6-8 14:30 , Processed in 1.377887 second(s), Total 98, Slave 75 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com