MODBUS协议中的CRC校验

2023-10-27

一、RTU 檢查碼(CRC)計算器
第一种: RTU 檢查碼(CRC)計算器
在这里插入图片描述
大小端转换后,CRC检查码为:AB 89
说明,这个计算器还是可以用的。

第二种: On-line CRC calculation and free library
在这里插入图片描述
二、运算规则
RTU检查码(CRC)计算,运算规则如下:
步骤1:令16位暂存器(CRC暂存器)= 0xFFFF。
步骤2:异或第一个8位字节的消息指令与低位元16位CRC暂存器,做异或将结果存入CRC暂存器内。
步骤3:右移一位CRC暂存器,将0填入高位元处。
步骤4:检查右移的值,如果是0将步骤3的新值存入CRC暂存器内,否则异或0xA001与CRC暂存器,将结果存入CRC暂存器内。
步骤5:重复步骤3〜步骤4,将8位全部运算完成。
步骤6:重复步骤2〜步骤5,取下一个8位的消息指令,直到所有消息指令运算完成。最后,得到的CRC缓存器的值,即CRC的检查码。值得注意的是CRC的检查码必须交换放置于讯息指令的检查码中。

三、相关代码
两种实现方式 查表实现和计算实现

//计算方式实现
int16_t factory_crc16 ( uint8_t *bufData, uint16_t buflen)
{
    uint16_t TCPCRC = 0xffff;
    uint16_t POLYNOMIAL = 0xa001;
    uint8_t i, j;
   
    for (i = 0; i < buflen; i++)
    {
        TCPCRC ^= bufData[i];
        for (j = 0; j < 8; j++)
        {
            if ((TCPCRC & 0x0001) != 0)
            {
                TCPCRC >>= 1;
                TCPCRC ^= POLYNOMIAL;
            }
            else
            {
                TCPCRC >>= 1;
            }
        }
    }
    return TCPCRC;
}

//查表方式实现
static const uint8_t aucCRCHi[] = {
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,
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, 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,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 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, 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,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40
};

static const uint8_t aucCRCLo[] = {
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, 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, 0x29, 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, 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, 0x96, 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, 0x83,
0x41, 0x81, 0x80, 0x40
};

static uint16_t _bMBCRC16( uint8_t * pucFrame, uint16_t usLen )
{
    uint8_t ucCRCHi = 0xFF;
    uint8_t ucCRCLo = 0xFF;
    int iIndex;

while( usLen-- )
{
    iIndex = ucCRCLo ^ *( pucFrame++ );
    ucCRCLo = ( uint8_t )( ucCRCHi ^ aucCRCHi[iIndex] );
    ucCRCHi = aucCRCLo[iIndex];
}
    return ( uint16_t )( ucCRCHi << 8 | ucCRCLo );
}

四、CRC校验原理及步骤
参看:CRC校验原理及步骤

1、什么是CRC校验?
CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。

2、CRC校验原理:
其根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注意,这里的数也是二进制序列的,下同),生成一个新帧发送给接收端。当然,这个附加的数不是随意的,它要使所生成的新帧能与发送端和接收端共同选定的某个特定数整除(注意,这里不是直接采用二进制除法,而是采用一种称之为模2除法。到达接收端后,再把接收到的新帧除以(同样采用“模2除法”)这个选定的除数。因为在发送端发送数据帧之前就已通过附加一个数,做了“去余”处理(也就已经能整除了),所以结果应该是没有余数。如果有余数,则表明该帧在传输过程中出现了差错。

模2除法:
模2除法与算术除法类似,但每一位除的结果不影响其它位,即不向上一位借位,所以实际上就是异或。在循环冗余校验码(CRC)的计算中有应用到模2除法。

3、CRC校验步骤:
CRC校验中有两个关键点,一是预先确定一个发送送端和接收端都用来作为除数的二进制比特串(或多项式),可以随机选择,也可以使用国际标准,但是最高位和最低位必须为1;二是把原始帧与上面计算出的除数进行模2除法运算,计算出CRC码。

4、具体步骤:
选择合适的除数
看选定除数的二进制位数,然后再要发送的数据帧上面加上这个位数-1位的0,然后用新生成的帧以模2除法的方式除上面的除数,得到的余数就是该帧的CRC校验码。注意,余数的位数一定只比除数位数少一位,也就是CRC校验码位数比除数位数少一位,如果前面位是0也不能省略。
将计算出来的CRC校验码附加在原数据帧后面,构建成一个新的数据帧进行发送;最后接收端在以模2除法方式除以前面选择的除数,如果没有余数,则说明数据帧在传输的过程中没有出错。
5、CRC校验码计算示例:
现假设选择的CRC生成多项式为G(X) = X4 + X3 + 1,要求出二进制序列10110011的CRC校验码。下面是具体的计算过程:
①将多项式转化为二进制序列,由G(X) = X4 + X3 + 1可知二进制一种有五位,第4位、第三位和第零位分别为1,则序列为11001
②多项式的位数位5,则在数据帧的后面加上5-1位0,数据帧变为101100110000,然后使用模2除法除以除数11001,得到余数。
③将计算出来的CRC校验码添加在原始帧的后面,真正的数据帧为101100110100,再把这个数据帧发送到接收端。
④接收端收到数据帧后,用上面选定的除数,用模2除法除去,验证余数是否为0,如果为0,则说明数据帧没有出错。

STM32F4的CRC介绍
STM32F4的循环冗余校验计算单元是根据股东的生成多项式的到任一32位全字的CRC计算结果。在其他应用中,CRC技术主要应用于合适数据传输的或者数据存储的正确性和完整性。标准的EN/IEC60335-1提供了一种核实闪存存储器完整性的方法。CRC计算单元可以在程序运行时计算出软件的标识,之后在连接是生成的参考表示比较,然后存放在指定的存储器空间。
CRC的主要特性
· 使用CRC-32(以太网)多项式:0x4C11DB7
· X32+ X26+ X23+ X22+ X16+ X12+ X11+ X10+ X8+ X7+ X4+ X2+ X+1
· 一个32为数据寄存器用于输入/输出
· CRC计算时间:4个AHB时钟周期(HCLK)
· 通用8位寄存器(可用于存放临时数据)

CRC计算单元含有一个32位数据寄存器。
对该寄存器进行写操作时,作为输入寄存器,可以输入要进行CRC金算的新数据。
对该寄存器进行读操作时,返回上一次CRC的计算结果。
每一次写入数据寄存器,其计算结构是前一次CRC计算结果和新计算结果的组合(队2位字进行CRC计算而不是逐个字节计算)。在CRC计算期间会暂停CPU的写操作,因此可以对寄存器CRC_DR进行背靠背或者连续的写-读操作。可以通过寄存器设置CRC_CR的RESET位来重置寄存器CRC_DR为0xFFFF FFFF。该操作不影响寄存器CRC_IDR没得数据。

STM32F4的CRC库
void CRC_ResetDR(void)复位CRC数据寄存器
uint32_t CRC_CalcCRC(uint32_t Data)计算32位数的CRC
uint32_t CRC_CalcBlockCRC(uint32_t pBuffer[],uint32_t BufferLength)计算多个32位数的CRC
uint32_t CRC_GetCRC(void)返回当前CRC数值
void CRC_SetIDRegister(uint8_t ID_Value)存入一个8位数据到独立寄存器
uint8_t CRC_GetIDRegister(void)从独立数据寄存器读出8为数据

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MODBUS协议中的CRC校验 的相关文章

  • CRC-CCITT 16位Python手动计算

    Problem 我正在为嵌入式设备编写代码 许多 CRC CCITT 16 位计算解决方案都需要库 鉴于使用库几乎是不可能的并且会消耗其资源 因此需要一个函数 可能的解决方案 下面是网上找到的CRC计算 然而 它的实现是不正确的 http
  • 在Python中计算modbus的CRC16

    首先 抱歉 我是初学者 我在 modbus 上得到以下字节序列 01 04 08 00 00 00 09 00 00 00 00f8 0c 该字节序列上粗体的 CRC 是正确的 但是 要检查 创建 CRC 我必须遵循设备规范 其中规定 错误
  • 1.69寸SPI接口240*280TFT液晶显示模块使用中碰到的问题

    1 69寸SPI接口240 280TFT液晶显示模块使用中碰到的问题说明并记录一下 在网上买了1 69寸液晶显示模块 使用spi接口 分辨率240 280 给的参考程序是GPIO模拟的SPI接口 打算先移植到FreeRtos测试 再慢慢使用
  • 串口通讯第一次发送数据多了一字节

    先初始化IO再初始化串口 导致第一次发送时 多出一个字节数据 优化方案 先初始化串口再初始化IO 即可正常通讯
  • 如何在 C#.net 中计算文件的 CRC 值?

    我想在 C net 中使用 32 位算法计算文件的 CRC 值 Algorithm is straightforward rewritten from c class Crc32 public static uint CountCrc by
  • STM32F207 I2C 测试失败

    我正在使用 STM32F207 微控制器在 STM3220G EVAL 板上学习嵌入式开发 我尝试通过连接同一芯片上的两个 I2C2 和 I2C3 模块并发送 接收字符来测试 I2C 接口 这是我当前编写的代码 使用 mdk arm 5 i
  • Freertos低功耗管理

    空闲任务中的低功耗Tickless处理 在整个系统运行得过程中 其中大部分时间都是在执行空闲任务的 空闲任务之所以执行 因为在系统中的其他任务处于阻塞或者被挂起时才会执行 因此可以将空闲任务的执行时间转换成低功耗模式 在其他任务解除阻塞而准
  • python套接字在逐行调试时工作正常,但在完整运行时无法工作[重复]

    这个问题在这里已经有答案了 我正在开发一个项目 该项目涉及传输文件 并为文件的每个块进行 CRC 校验和计算 例如此处为 40960 字节 我的问题是 当我逐行调试代码时 一切正常 但当我完全运行代码时 我在接收器端得到不同的 CRC 校验
  • Arm:objcopy 如何知道 elf 中的哪些部分要包含在二进制或 ihex 中?

    我正在开发一个项目 其中涉及解析arm elf 文件并从中提取部分 显然 elf 文件中有很多部分没有加载到闪存中 但我想知道 objcopy 到底如何知道要在二进制文件中包含哪些部分以直接闪存到闪存中 以arm elf文件的以下reade
  • 嵌入式开发--STM32G4系列片上FLASH的读写

    这个玩意吧 说起来很简单 就是几行代码的事 但楞是折腾了我大半天时间才搞定 原因后面说 先看代码吧 读操作 读操作很简单 以32位方式读取的时候是这样的 data IO uint32 t 0x0800F000 需要注意的是 当以32位方式读
  • STM32H5 Nucleo-144 board开箱

    文章目录 开发板资料下载 目标 点亮LD1 绿 LD2 黄 和LD3 红 三个LED灯 开箱过程 博主使用的是STM32CubeMX配置生成代码 具体操作如下 打开STM32CubeMX File gt New project 选择开发板型
  • 从没有中断引脚并且在测量准备好之前需要一些时间的传感器读取数据的最佳方法

    我正在尝试将压力传感器 MS5803 14BA 与我的板 NUCLEO STM32L073RZ 连接 根据 第 3 页 压力传感器需要几毫秒才能准备好读取测量值 对于我的项目 我对需要大约 10 毫秒来转换原始数据的最高分辨率感兴趣 不幸的
  • 将两个原始值转换为 32 位 IEEE 浮点数

    我正在尝试通过 TCP modbus 解码来自 Shark 100 功率计的一些数据 我已经成功地拉下了我需要的寄存器 并从寄存器中留下了两个原始值 如下所示 17138 59381 从手册中 我知道我需要将这两个数字转换为32位IEEE浮
  • 计算 modbus RTU 3.5 字符时间

    我是 Modbus 新手 正在使用 Modbus RTU 开发应用程序 我想知道如何找出RTU消息帧分离时间 在Modbus RTU规范中 它提到了3 5个字符时间 但是没有更多关于如何决定这个间隔的数据 计算分离时间的步骤是什么 看看第1
  • 具有 PCLMULQDQ 的快速 CRC *未反映*

    我正在尝试写一个PCLMULQDQ 优化的 CRC 32 https www intel com content dam www public us en documents white papers fast crc computatio
  • 从 Android 向 PLC 发送布尔值

    我能够与 PLC 建立连接以从中读取数据 现在有一个问题 那就是我必须编写一种方法来修改PLC中的数据 为了实现这一点 我必须向 PLC 发送两个值 一个 int 值和一个 boolean 值 我通过 net wimpi modbus 包中
  • Modbus 错误:[无效消息] 收到的消息不完整,预计至少 2 个字节(收到 0 个字节)

    Problem pymodbus 主站 客户端可以向从站 服务器发送请求 从属 服务器准备好返回的东西 并等待主控 客户端来接收它们 尽管服务器 从站已准备就绪 但主站 客户端仅返回错误 Modbus 错误 输入 输出 Modbus 错误
  • PWM DMA 到整个 GPIO

    我有一个 STM32F4 我想对一个已与掩码进行 或 运算的 GPIO 端口进行 PWM 处理 所以 也许我们想要 PWM0b00100010一段时间为 200khz 但随后 10khz 后 我们现在想要 PWM0b00010001 然后
  • HAL_Delay() 陷入无限循环

    我被 HAL Delay 函数困住了 当我调用此函数 HAL Delay 时 控制陷入无限循环 在寻找问题的过程中 我发现了这个 http www openstm32 org forumthread2145 threadId2146 htt
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d

随机推荐

  • MySQL添加字段和修改字段的方法

    原文地址 http database 51cto com art 201011 234549 htm MySQL添加字段的方法并不复杂 下面将为您详细介绍MySQL添加字段和修改字段等操作的实现方法 希望对您学习MySQL添加字段方面会有所
  • HBase建表函数createTable的几点说明

    HBase建表函数提供了四个重载函数 分别是 void createTable HTableDescriptor desc void createTable HTableDescriptor desc byte startKey byte
  • ctf.show web3

    打开题目 出现提示 php文件 考虑文件包含漏洞 输入参数 url etc passwd 这个报错界面出来了 说明存在文件包含漏洞 构造url值 php input 使用php协议 使用burp抓包 使用ls命令查看php下的文件 得到文件
  • 认认真真推荐几个高质量人工智能方向的优质原创公众号

    人工智能与计算机编程和数学相关性比较大 网络上的资料比较繁杂 想系统的学习人工智能谈何容易 今天给大家推荐9个原创公众号 这些公众号定期会发些高质量原创 希望可以让你更高效的学习 AI有道 一个值得关注的 AI 技术的公众号 作者红色石头是
  • 分布式session的4种解决方案

    分布式session的4种解决方案 1 cookie和session cookie和session都是用来跟踪用户身份信息的会话方式 cookie存储的数据保存在本地客户端 用户获取容易 但安全性不高 存储数据小 session存储的数据保
  • matlab plot三维图形

    偶尔 我们会用到三维图形 目前我所了解的matlab中有三种方式可以实现 分别是scatter plot3和meshgrid 具体用法如下 1 scatter x y z 其中x y z为同纬度的向量 生成的三维图是点的形式 2 x 1 0
  • Simulink单元测试

    本文使用Matlab2018a版本 一 主要使用Simulink中的Analysis下的Test Harness和Test Manager 1 创建Test Harness 前提 有测试模型 1 在测试模型里 直接右击 gt Test Ha
  • Ubuntu 18.04安装CUDA 11.4.0 cuDNN 8.2.2

    CUDA和cuDNN为NVIDIA支持GPU运算以及深度神经网络计算加速的算法库 通常需要安装以支持利用GPU加速神经网络的训练和推理 安装前需要确定主机显卡为NVIDIA显卡 且驱动安装无误 通过nvidia smi查看显卡信息和适合的C
  • 使用pyLDAvis可视化LDA结果,与解决FileNotFoundError: [Errno 2] No such file or directory: ‘https://cdn.jsdel....

    建议安装 pip install pyLDAvis 2 1 2 否则会报错 FileNotFoundError Errno 2 No such file or directory https cdn jsdelivr net gh bmab
  • java math类 平方_Java Math类

    首页 gt 基础教程 gt 常用类 gt 常用 Number Math类 Java Math类 Java 的 Math 包含了用于执行基本数学运算的属性和方法 如初等指数 对数 平方根和三角函数 这些方法基本可以分为三类 三角函数方法 指数
  • 深入理解Java虚拟机jvm-对象如何进入老年代

    HotSpot虚拟机中多数收集器都采用了分代收集来管理堆内存 那内存回收时就必须能决策哪些存 活对象应当放在新生代 哪些存活对象放在老年代中 为做到这点 虚拟机给每个对象定义了一个对象年龄 Age 计数器 存储在对象头中 对象通常在Eden
  • 视频插帧—学习笔记(算法+配置+云服务+Google-Colab)

    恰好碰到同学项目需要 了解了一下关于利用深度学习视频插帧的相关知识 在这里做一个简单的记录 目录 一 方法 论文 1 DAIN Depth Aware Video Frame Interpolation 2 FLAVR Flow Agnos
  • 自己动手实现简易STL

    自己动手实现简易STL STL六个组件 迭代器 算法 容器 迭代器部分 适配器 仿函数 额外的工作 小结 之前学习C 看侯老师的书的时候实现了一下STL的基本组件 包括了6个组件 allocator iterator container t
  • buuctf/re/近日总结/rome,pyre等(详细解释)

    rome 检测到无壳 32位 直接用IDA打开 转到main函数 int func int result eax int v1 4 esp 14h ebp 44h unsigned int8 v2 esp 24h ebp 34h BYREF
  • Pandas方法(未完待续....)

    DataFrame方法参数解释 dropna axis 0 how any thresh None subset None inplace False axis 默认0 0代表行 1代表列 how 有all 或者 any all全部为NA则
  • 体验vSphere 6之1-安装VMware ESXi 6 RC版

    体验vSphere 6之1 安装VMware ESXi 6 RC版 在2015年 各个公司都会发布一系列新的产品 例如Microsoft会发布Windows 10 VMware会发布vSphere 6系列 现在这些产品都已经有了测试版 今天
  • LLVM系列第十六章:写一个简单的编译器

    系列文章目录 LLVM系列第一章 编译LLVM源码 LLVM系列第二章 模块Module LLVM系列第三章 函数Function LLVM系列第四章 逻辑代码块Block LLVM系列第五章 全局变量Global Variable LLV
  • 用 flex 和 瀑布流 解决高度不同的元素浮动导致页面混乱问题

    当元素的高度各不相同并且设置了浮动 页面展示如下 flex布局 瀑布流布局 瀑布流动态加载图片 flex布局 红框所画图片在第一行放不下 属于第二行的元素 但是由于浮动的特性 导致它出现在了这个位置 如果想让它另起一行顶头展示 可以使用fl
  • 1.3 Linux文件系统

    一 Linux文件系统结构 Linux下都是文件 所以没有Windows一样的盘 有的只有文件夹 cd 进入根目录 ls 查看根目录 下的文件及文件夹 bin 存储了很多系统命令 usr sbin 也存储了许多系统命令 sbin 超级用户
  • MODBUS协议中的CRC校验

    一 RTU 檢查碼 CRC 計算器 第一种 RTU 檢查碼 CRC 計算器 大小端转换后 CRC检查码为 AB 89 说明 这个计算器还是可以用的 第二种 On line CRC calculation and free library 二