您好,欢迎光临本网站![请登录][注册会员]  
文件名称: 用stm32库函数编写的modbus源代码.pdf
  所属分类: C
  开发工具:
  文件大小: 4mb
  下载次数: 0
  上传时间: 2019-07-16
  提 供 者: zyic****
 详细说明:用stm32库函数编写的modbus源代码。01、03、06、10、码方式都支持。void ModRcv void if(USART GetlTStatus(USARTl, USART IT TC)=RESET void GodSend(oid);/)于 modbus信息接收 // modbus用通讯参数 u8Tim_out;/于3.5个字符时间,保守取3ms(波特率9600的时候大约2点几 毫秒) u8Rcv_ Complete;//帧是否已经接受完成 u8 Send Complete/′帧是否已经发送完成 u8 Com busy;/通讯繁忙,表示上一帧还未处理结束 u8Rcv_ Buffer[210];/)来存放接收到的完整的一帧数据(第一个字节用来存放 接收到的有效字节数,也就是数组中的有效字节数) U8send_ Buffer[210]//用来存放待发送的完整的一帧数据(第一个字节用来存放 待发送的有效字节数,也就是数组中的有效字节数) u8 RCy Data;/)来存放接收的一个字节 u8send_Data;/)来存放要发送的一字节 u8Modd;/)来标志作为从站的站号 u8RcvˇNum;/)用来表示接收的一帧的有效字节数(从功能码到CRC校验) u8 Send num;//用来表示待发送的一帧的字节数 u8* Point ToRcyBuf;//用来指向接收的数据缓存 u8* Point Tosend Buf;//用来指向带发送的数据缓存 u8comu_Busy/用来表示能否接收下一帧数据 u8 HaveMes extern u16 HoldReg[100]; ∥/CRC校验查表用参数 /CRC高位字节值表* static u8 auch[= 0×00,0xc10x810x40,0×01,0XC0,0X80,0×410X×01,0xC0 0X80,0×41,0X00,0XC1,0x81,0x40,0×01,0XC00X800×41, 0×00,0xC10x81,0x40,0X00,0xC1,0×81,0x400×01,oxCo, 080,0×41,0X01,0xC0,0x80,0×41,000,0XC1,0x810×40, 0x00,0xC1,0x81,0x40,0x01,0xC0,0x800X×41,0x00,oxC1, 0x810X40,0x01,0xC00x80,0×41,0x01,xCox80,0×41, 0×00,0xC1,0x81,0x40,0x010xCo,0x80,0×41,0×000xC1, 0X81,0X40,0x00,0xC10x81,0×40,0×01,0XCox800X41, 0×00,0XC1,0X81,ox40,0x01,0xCO,0x80,0X×410X01,0XCo 080.0x410x000XC1.0x81.0x40,0X000XC1.0x81.0x40 0x01,0XC0,0x80,0X×41,0x01,0xC0,0x80,0×41,0x00,0xC1 0X81,0x40,0X01,0xC0,0x80,0×41,0x00,0xC1,ox81,ox40, 0×00,0xC1,0x81,ox40,0×01,0xCo,0×800X41,0X01,0XCo, 0x80,0x41.0x00,0XC1,0x81.0×40,0X00,0XC1,0X81,0x40 0×010XC0,0X80,0X41,0x00,0XC10×81,0Xx400X×01,OXCo, 0X80,0X41,0x01,0xC0,0x80,0×41,0x00,0XC1,0x81,0X40, 0×000XC10x810x40,0x010XC0,0X80,0X410×01,0XC0, 0X80,0×41,0×00,0XC1,0x81,0X40,0X01,0xco,0x80,0X41, 0x00,0xc1,0x81,0x40,0x00,0xC1,0x81,0x40,0X01,0xC0 0×800×41.00c0810x4002C0×80×41, 0x01,0XC00X800X41,0x000XC10x810X40.0x01.0xC0 0×80,0×41,0x00,0xC10x81,0x40,0x00,0xC1,x81,ox40 0×01,0xC0,0x80,0x41,0x01,0xC0,0x80,0×410x00,0xc1, 0×81,0X40,0X000Xc10x810×40,0×01,0xc0,0x80,0x41, 0x00,0xC1,0x81,0x40,0x01,0xCo,0x80,0X41,ox010xc0, 0X80,0X41x00,0xC1,0x81,0X40 }; /*CRC低位字节值表* static u8 auch CRClo[=( 0×00,0XC0,0XC1,0xo1,0xC3,0X03,0x02,0xC2,0xC6,0×06 0x07 0xC7, 0X05,0XC5, 0xC4, 0x04, 0XCC, OXOC, OXOD OXCD OXOF, OXCF OXCE, OXOE, OXOA. OXCA, OXCB, OXOB, 0XC9, 0X09 0x080xC80xD8,0x18,0×19,0XD9,0x1B0XDB,0xDA0x1A, Ox1E, OXDE, OXDFOX1F0XDD 0X1D,OX1C, OXDC, OX14, 0xD4 0XD5,0×150XD70×17,0x160xD6,0XD20X120X13,0xD3, 0x11,0xD1,0xD0,0x10,0XF0,0×30,0x31,0xF10x330xF3, 0XF2,OX32,0X36,0XF60xF7,0x37,0xF5,0x350x340xF4, OX3C, 0x FC, OxFD, OX3D,Ox FF,OX3FOX3E, OxFE,OX FA, OX3A, 0X3B,0XFB,0x390xF90XF8,0x38,0x28,0xE80XE90x29, OxEB. 0X2B, OX2A, OXEA, OXEE, OX2E, OX2E OX EF. OX2D, OXED 0XEC,0×2c0xE40x240x25,0XE5,0X270XE7,0XE6,0X26, 0X22,0XE20xE3,0X23XE1,0x21,0x20,0xE0,0XA0,0x60, 0X61,0XA10x63,0XA30XA2,0X62,0X66,0XA6,0XA70X67, OxA5, 0x65, 0X64, 0xA4, 0X6C, 0XAC, OXAD, 0X6D, OXAFOX6F 0X6E, OXAE, OXAA, 0X6A, 0X6B,OXAB, 0X69, 0XA9, 0XA8, 0X68, Ox78, 0x B8, 0x B9, 0x79,0xBB 0X7B. OX7A, OX BA,OXBE,OXZE OxZE.. OX7D, OXBD OXBC, OX7C, 0xB4, 0X74,0X750xB5 0X77,0×B70xB6,0X76,0X72,0XB2,0xB3,0x73,0XB1,0X71, 0×70,0XB0,0x500x900x91,0x51,0x93,0×53,0X52,0x92, 096,0X56,0×57,0×97,0x55,0x95,0x94,0X54,0X9C0X5C 0x5D 0X9D, 0X5F0X9F 0X9E, OX5E, 0X 5A. 0X9A. 0X9B, 0X5B 0×99,0x59,0X580x980x88,0×48,0×49,0X89,0X4B,0x8B OX8A, 0x4A, Ox4E,OX8E Ox8FOx4F0X8D, 0x4D, 0x4C, 0x80 0×440x84,0x850×450x87,0×47,0X46,0X86,0X820X42, 0×43,0X83,0X410x810x80,0X40 ∥/声明 modbus的函数 void ModInit(u8d;//用于 Modbus初始化,参数ld为站号(1-255) void Mod Rcv(void);/)于 modbus信息接收 void ModSend(void);/)于 modbus信息接收 void MessageHandle(u8* pointer in,u8* pointer out);∥处理收到的信息帧 void ReadOutputBit(u8* pointer1,u8* pointer_2//读线圈 void ReadInputBit(u8* pointer_1,u8* pointer2)/)输入位 void ReadHoldingReg(u8* pointer_1,u8* pointer2);//读保持寄存器 void ReadInputReg(u8* pointer_1,u8* pointer_2);/输入寄存器 void Force Single Coil|u8* pointer_1,u8* pointer_2);//强制单个线圈 void PresetsingleReg(u8* pointer_1,u8* pointer2);//预制单个寄存器 void force mulcoil(u8* pointer_1,u8* pointer2);//强制多个线圈 void presetmu|Reg(u8* pointer_1,u8* pointer_2//预制多个寄存器 void ErrorHandle(u8Mode,u8* Pointer);/{误信息帧处理 u16CRC16(u8* puch Msg,u8 us DataLen/)于计算CRC校验码 /函数功能:用于 Modbus初始化 函数输入:|d为 Modbus站号。 函 数 输 出 无 void Modlnit(u8 ld modbus参数初始化 PointToRcv Buf=Rcv Buffer PointTosend Buf=send Buffer: send_Num=1;∥/发送的数据顺序(输出数组的第几个数) Mod_d=d:/号设置 Rcy Buffer[1]=Mod Id; Send Buffer[1]=Mod ld; Comu busy= /函数功能:用于 Modbus信息接收 函数输入:无。 函 数 输 出 无 void ModRcv(void Havemes=1;//表示接收到了信息 ReV Data=USART ReceiveData(USarT1) if( Comu busy!=1)∥/如果不忙,可以接收下一帧信息 TIM_Cmd(TIM2, DISABLE) TIM Set Counter(TIM2, O); f(m_out!=0)&&( Rcy Data=Modd∥/如果间隔时间超过了3.5个 字符,同时接受的字节和自己的站号一致,则认为接收开始 Rcv Complete=o;/表示数据帧接收开始 RCV Num=0;//接收数据个数初始化 RCy Num+;/同时个数加 f(0=-Tim_out&&(0= Rcv Complete)∥/如果处于接收一帧的正常过 程中 if( Rcv Num<100) Rcv Buffer[Rcv Num+1= Rcy Data;/)将数据放入接收数组中 Roy Num+:/同时个数加一 else Rcv Complete=l: Comu Busy=l; Rcv Buffer[o]=Rcv Num; *( PointTosend Buf+2)=*( Point ToRcy buf+2);/1取功能码 ErrorHandle(6, PointTosend Buf;//表示超出了字节数(从机设 备忙碌) CV Num Tim Out=0: TIM Cmd(TM2, ENABLE)://开启45ms计时(三个半字符的保守估计) /*函数功能:用于 Modbus信息发送 函数输入:无。 函数输出:无。 void GodSend (void Send Data=*(PointToSend Buf+Send Num USART Send Data(USART1, Send Data Send num++ if(Send Num>(* Point Buf)∥发送已经完成 Comu busy PointToSend Buf=0 RoV Num=0 Send Num=1 ∥/启动数据发送 USART_ ITConfig( USART1, USART T TC, D| SABLE);/,关闭数据发送中断 /*函数功能: Modbus专用定时器(TM2) 函数输入:无。 函数输出:无 void TIM2 IRQHandler(void) f( TIM GetlTstatus(TM2, TIM IT Update)!=RSET)∥检查指定的TM中断发 生与否:TM中断源 TIM_ ClearlTPending Bit(TM2, TIM IT Update);/清除TMx的中断待 处理位:TM中断源 Tim Out=l; TIM Cmd(TIM2, DISABLE) TIM SetCounter(TIM2,0); RoV Complete=1 RcV Buffer[o]=Rcv num; if(Have Mes! =0&&Rcv_ Num>4) Comu_ Busy=l: MessageHandle( PointToRcvBuf, Point ToSend Buf); /*函数功能:CRC校验用函数 函数输入: puchMsgg是要进行CRC校验的消息, usDataLen是消息中字节数 函数输出 计算出来的CRC校验码。 u16CRC16(u8* puchMsgg, u8 usDataLen/ ouch Msg是要进行CRC校验的消息, usDataLen是消息中字节数
(系统自动生成,下载前可以参看下载内容)

下载文件列表

相关说明

  • 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
  • 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度
  • 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
  • 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
  • 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
  • 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.
 输入关键字,在本站1000多万海量源码库中尽情搜索: