1、6个字节部分称为“MBAP报文头”示例:0051 0000 00090051 是客户端发出的校验信息,服务端原内容返回即可0000 表示modbus-tcp协议0009 表示后面还有9个字节后面部分:01 10 0001 0001 02 00 00 01 设备地址10 表示10指令0001 起始地址0001 写寄存器数量02 字节计数00 00 数据响应指令:0051 0000 0006 01 10 0001 0001System.h:#ifndef _SYSTEM_H_#define _SYSTEM_H_#include stm32f10x.h/= 不常改动项 =/* stm32f10x.h
2、 第505、506、507行已经定义了u32,u16和u8 */typedef unsigned char u8;/typedef unsigned short int u16;/typedef unsigned int u32;/typedef unsigned char INT8U;/typedef unsigned short int INT16U;/typedef unsigned int INT32U;/typedef signed char int8_t;/typedef signed short int int16_t;/typedef signed int int32_t;/t
3、ypedef signed long long int int64_ttypedef unsigned long long int u64;typedef unsigned char bool_t;#define FALSE 0#define TRUE !FALSE#define NULL 0#endifCRC_Check.h#ifndef _CRC_CHECK_H_#define _CRC_CHECK_H_system.hu16 CRC16_Verify(u8 *puchMsg,u16 usDataLen);CRC_Check.cCRC_Check.h/* 高位表*/static const
4、 u8 auchCRCHi = 0x00,0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80,0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,0x80, 0x41,
5、0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00,0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80,0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x8
6、1, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x40,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0xC0,0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80,
7、0x41, 0x00,0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x40 ;* 低位表static const u8
8、auchCRCLo = 0x00,0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04,0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08,0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D,0x1C, 0xDC, 0x14
9、, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, 0x11,0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37,0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B,0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0
10、x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E,0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, 0x22,0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62,0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F
11、, 0x6E,0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B,0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, 0x77,0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91, 0x51,0x93, 0x53, 0x52, 0x92, 0x
12、96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 0x5D,0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48,0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, 0x44,0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43,
13、 0x83, 0x41, 0x81, 0x80,;/* 16位CRC校验函数,查表法*/u16 CRC16_Verify(u8 *puchMsg,u16 usDataLen) u8 uchCRCHi = 0xFF ; u8 uchCRCLo = 0xFF ; u16 uIndex ; while (usDataLen-) uIndex = uchCRCHi *puchMsg+ ; uchCRCHi = uchCRCLo auchCRCHiuIndex ; uchCRCLo = auchCRCLouIndex ; / return (u16)(uchCRCLo) 8) | uchCRCHi) ;
14、 return (u16)(uchCRCHi) = MODBUS_BUFFER_LEN/2) return 0; for(i=start; i=end; i+) if(Modbus_WRecordi/8 & (u8)1(i%8) return 1; return 0;* 写modbus寄存器(16位)写入状态 起始地址* sta: 写入状态,0=无写入操作,1=有写入操作。void Modbus_Write_WRecord(u16 start,u16 length,u8 sta) if(length = 0) return;= MODBUS_BUFFER_LEN/2) return; if(s
15、ta) Modbus_WRecordi/8 |= (u8)1(i%8); else Modbus_WRecordi/8 &= (u8)1 MODBUS_BUFFER_LEN) return 0; p_data = Modbus_Buffer + addr; for(i=0;length; bufferi = p_datai; return 1;* 写modbus缓存(8位)将buffer数组的数据写入Modbus_Buffer。写入长度0=写入失败,1=写入成功。u8 Modbus_Write_Buffer(u8 *buffer,u16 addr,u16 length) u8 *p_save;
16、 p_save = Modbus_Buffer + addr; p_savei = bufferi;* 16位变量存储顺序转换u16 Modbus_16BitsSwapEndian(u16 num) if(Modbus_Swap_Endian) return num8; else return num;* 32位变量存储顺序转换typedef union char arr4; int32_t int32; float f;MODBUS_UNION32;u32 Modbus_32BitsSwapEndian(u32 num) u8 temp; MODBUS_UNION32 res; res.int32 = num; temp = res.arr0; res.arr0 = res.arr3; res.arr3 = temp; temp = res.arr1;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1