文件名称:
用stm32库函数编写的modbus源代码.pdf
开发工具:
文件大小: 4mb
下载次数: 0
上传时间: 2019-07-16
详细说明:用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最新版进行解压.
- 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
- 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
- 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.