- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在用 C 编写一个 MODBUS CRC16 计算器。我之前有一个 python 可以执行此操作,我想将它转换为 C。我在网上找到了一些代码,但它没有给我正确的答案。
对于我的 python 代码,我将其作为我的 CRC16.py
#!/usr/bin/env python
def calc(data):
crc_table=[0x0000,0xC0C1,0xC181,0x0140,0xC301,0x03C0,0x0280,0xC241,0xC601,0x06C0,0x0780,0xC741,0x0500,0xC5C1,0xC481,0x0440,0xCC01,0x0CC0,0x0D80,0xCD41,0x0F00,0xCFC1,0xCE81,0x0E40,0x0A00,0xCAC1,0xCB81,0x0B40,0xC901,0x09C0,0x0880,0xC841,0xD801,0x18C0,0x1980,0xD941,0x1B00,0xDBC1,0xDA81,0x1A40,0x1E00,0xDEC1,0xDF81,0x1F40,0xDD01,0x1DC0,0x1C80,0xDC41,0x1400,0xD4C1,0xD581,0x1540,0xD701,0x17C0,0x1680,0xD641,0xD201,0x12C0,0x1380,0xD341,0x1100,0xD1C1,0xD081,0x1040,0xF001,0x30C0,0x3180,0xF141,0x3300,0xF3C1,0xF281,0x3240,0x3600,0xF6C1,0xF781,0x3740,0xF501,0x35C0,0x3480,0xF441,0x3C00,0xFCC1,0xFD81,0x3D40,0xFF01,0x3FC0,0x3E80,0xFE41,0xFA01,0x3AC0,0x3B80,0xFB41,0x3900,0xF9C1,0xF881,0x3840,0x2800,0xE8C1,0xE981,0x2940,0xEB01,0x2BC0,0x2A80,0xEA41,0xEE01,0x2EC0,0x2F80,0xEF41,0x2D00,0xEDC1,0xEC81,0x2C40,0xE401,0x24C0,0x2580,0xE541,0x2700,0xE7C1,0xE681,0x2640,0x2200,0xE2C1,0xE381,0x2340,0xE101,0x21C0,0x2080,0xE041,0xA001,0x60C0,0x6180,0xA141,0x6300,0xA3C1,0xA281,0x6240,0x6600,0xA6C1,0xA781,0x6740,0xA501,0x65C0,0x6480,0xA441,0x6C00,0xACC1,0xAD81,0x6D40,0xAF01,0x6FC0,0x6E80,0xAE41,0xAA01,0x6AC0,0x6B80,0xAB41,0x6900,0xA9C1,0xA881,0x6840,0x7800,0xB8C1,0xB981,0x7940,0xBB01,0x7BC0,0x7A80,0xBA41,0xBE01,0x7EC0,0x7F80,0xBF41,0x7D00,0xBDC1,0xBC81,0x7C40,0xB401,0x74C0,0x7580,0xB541,0x7700,0xB7C1,0xB681,0x7640,0x7200,0xB2C1,0xB381,0x7340,0xB101,0x71C0,0x7080,0xB041,0x5000,0x90C1,0x9181,0x5140,0x9301,0x53C0,0x5280,0x9241,0x9601,0x56C0,0x5780,0x9741,0x5500,0x95C1,0x9481,0x5440,0x9C01,0x5CC0,0x5D80,0x9D41,0x5F00,0x9FC1,0x9E81,0x5E40,0x5A00,0x9AC1,0x9B81,0x5B40,0x9901,0x59C0,0x5880,0x9841,0x8801,0x48C0,0x4980,0x8941,0x4B00,0x8BC1,0x8A81,0x4A40,0x4E00,0x8EC1,0x8F81,0x4F40,0x8D01,0x4DC0,0x4C80,0x8C41,0x4400,0x84C1,0x8581,0x4540,0x8701,0x47C0,0x4680,0x8641,0x8201,0x42C0,0x4380,0x8341,0x4100,0x81C1,0x8081,0x4040]
crc_hi=0xFF
crc_lo=0xFF
for w in data:
index=crc_lo ^ ord(w)
crc_val=crc_table[index]
crc_temp=crc_val/256
crc_val_low=crc_val-(crc_temp*256)
crc_lo=crc_val_low ^ crc_hi
crc_hi=crc_temp
crc=crc_hi*256 +crc_lo
return crc
接下来,我将使用一个脚本来输入我的变量:
import math
import subprocess
import serial
import time
from time import sleep
import struct
import CRC16
import sys
address = chr(0x01)
function_code = chr(0x04)
start_at_reg = chr(0x10) + chr(0x06)
num_of_reg = chr(0x00) + chr(0x02)
read_device = address + function_code + start_at_reg + num_of_reg
crc = CRC16.calc(read_device)
crc_hi = crc/256
crc_lo = crc & 0xFF
print "meter add: " +str(ord(address))
print "crc_lo: " +str(hex(crc_lo))
print "crc_hi: " +str(hex(crc_hi))
这会给我:
>>
meter add: 1
crc_lo: 0x95
crc_hi: 0xa
现在,我在网上找到了这个计算 CRC16 的 C 代码:
WORD CRC16 (const BYTE *nData, WORD wLength)
{
static const WORD wCRCTable[] = {0x0000,0xC0C1,0xC181,0x0140,0xC301,0x03C0,0x0280,0xC241,0xC601,0x06C0,0x0780,0xC741,0x0500,0xC5C1,0xC481,0x0440,0xCC01,0x0CC0,0x0D80,0xCD41,0x0F00,0xCFC1,0xCE81,0x0E40,0x0A00,0xCAC1,0xCB81,0x0B40,0xC901,0x09C0,0x0880,0xC841,0xD801,0x18C0,0x1980,0xD941,0x1B00,0xDBC1,0xDA81,0x1A40,0x1E00,0xDEC1,0xDF81,0x1F40,0xDD01,0x1DC0,0x1C80,0xDC41,0x1400,0xD4C1,0xD581,0x1540,0xD701,0x17C0,0x1680,0xD641,0xD201,0x12C0,0x1380,0xD341,0x1100,0xD1C1,0xD081,0x1040,0xF001,0x30C0,0x3180,0xF141,0x3300,0xF3C1,0xF281,0x3240,0x3600,0xF6C1,0xF781,0x3740,0xF501,0x35C0,0x3480,0xF441,0x3C00,0xFCC1,0xFD81,0x3D40,0xFF01,0x3FC0,0x3E80,0xFE41,0xFA01,0x3AC0,0x3B80,0xFB41,0x3900,0xF9C1,0xF881,0x3840,0x2800,0xE8C1,0xE981,0x2940,0xEB01,0x2BC0,0x2A80,0xEA41,0xEE01,0x2EC0,0x2F80,0xEF41,0x2D00,0xEDC1,0xEC81,0x2C40,0xE401,0x24C0,0x2580,0xE541,0x2700,0xE7C1,0xE681,0x2640,0x2200,0xE2C1,0xE381,0x2340,0xE101,0x21C0,0x2080,0xE041,0xA001,0x60C0,0x6180,0xA141,0x6300,0xA3C1,0xA281,0x6240,0x6600,0xA6C1,0xA781,0x6740,0xA501,0x65C0,0x6480,0xA441,0x6C00,0xACC1,0xAD81,0x6D40,0xAF01,0x6FC0,0x6E80,0xAE41,0xAA01,0x6AC0,0x6B80,0xAB41,0x6900,0xA9C1,0xA881,0x6840,0x7800,0xB8C1,0xB981,0x7940,0xBB01,0x7BC0,0x7A80,0xBA41,0xBE01,0x7EC0,0x7F80,0xBF41,0x7D00,0xBDC1,0xBC81,0x7C40,0xB401,0x74C0,0x7580,0xB541,0x7700,0xB7C1,0xB681,0x7640,0x7200,0xB2C1,0xB381,0x7340,0xB101,0x71C0,0x7080,0xB041,0x5000,0x90C1,0x9181,0x5140,0x9301,0x53C0,0x5280,0x9241,0x9601,0x56C0,0x5780,0x9741,0x5500,0x95C1,0x9481,0x5440,0x9C01,0x5CC0,0x5D80,0x9D41,0x5F00,0x9FC1,0x9E81,0x5E40,0x5A00,0x9AC1,0x9B81,0x5B40,0x9901,0x59C0,0x5880,0x9841,0x8801,0x48C0,0x4980,0x8941,0x4B00,0x8BC1,0x8A81,0x4A40,0x4E00,0x8EC1,0x8F81,0x4F40,0x8D01,0x4DC0,0x4C80,0x8C41,0x4400,0x84C1,0x8581,0x4540,0x8701,0x47C0,0x4680,0x8641,0x8201,0x42C0,0x4380,0x8341,0x4100,0x81C1,0x8081,0x4040};
BYTE nTemp;
WORD wCRCWord = 0xFFFF;
while (wLength--)
{
nTemp = *nData++ ^ wCRCWord;
wCRCWord >>= 8;
wCRCWord ^= wCRCTable[nTemp];
}
return wCRCWord;
}
我将该代码保存为头文件“CRC.h”。所以我可以输入我拥有的数据:
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>
#include <stdint.h>
#include <inttypes.h>
#include <stdlib.h>
#ifdef WIN32
/*windows stuff*/
#else
typedef unsigned long WORD;
typedef unsigned char BYTE;
#endif
#include "CRC.h"
int main(){
char query_m[6];
char add = 0x01;
char fnc_code = 0x04;
char reg_hi = 0x10;
char reg_lo = 0x06;
char num_hi = 0x00;
char num_lo = 0x02;
query_m[0] = add;
query_m[1] = fnc_code;
query_m[2] = reg_hi;
query_m[3] = reg_lo;
query_m[4] = num_hi;
query_m [5] = num_lo;
int i;
for(i=0;i<7; i++){
printf("this is query_m[%d]: %d\n", i, query_m[i]);
}
int size_m = 7;
char crc_data;
crc_data = CRC16(query_m, sizeof(query_m));
printf("this is CRC: %d\n", crc_data);
return 0;
}
这给了我 -107 的值。我对C比较陌生,我还在做一些实验
谢谢。
最佳答案
WORD
应该是 unsigned short
(2 字节),而不是 unsigned long
(4 或 8 字节取决于平台)
typedef unsigned short WORD;
正如@paddy 所说,在 for 循环中从 0 循环到 6:
for (i=0; i<6; i++) {
...
}
crc_data
应该是 WORD
类型,而不是 char
WORD crc_data;
在最后一个 printf()
中使用 %04x
printf("this is CRC: %04x\n", crc_data);
关于python - MODBUS RTU CRC16计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39564916/
https://code.google.com/p/stm32modbus/source/browse/#svn%2Ftrunk%2F%20stm32modbus%20--username%20ick
我正在用 C 编写一个 MODBUS CRC16 计算器。我之前有一个 python 可以执行此操作,我想将它转换为 C。我在网上找到了一些代码,但它没有给我正确的答案。 对于我的 python 代码
请为我知道之前讨论过但找不到答案的问题道歉。我正在尝试创建一个应用程序以通过 Modbus RTU 与我们的微 Controller 进行通信。是否有适用于 Android 的 Modbus RTU
我想在 MODBUS RTU 中使用 python 脚本控制执行器掌握。我尝试使用库minimalmodbus进行通信(写位,写入和读取寄存器)与我的奴隶。 当我启动代码时,出现一些错误。那么,有人可
目前我正在使用 Schneider Power Logic 电气设备。我想从设备读取数据并在我的系统中显示值。到目前为止,我发现了 J2mod、Jamod 和 Modbus4Java 库。我使用所有
我正在使用minimalmodbus与 PID controller (Love 16C-3) 进行交流通过 RS485 使用USB-RS485 adapter cable . 但是当尝试读取寄存器时
我正在为系统开发一个自动化测试用例,需要一个自动 modbus 输入设备。 我的用例是实现一个基于 Raspberry pi 的 RTU modbus 从站并连接到 modbus 主站。 当主设备请求
我使用 modbus-tk 创建了一个 modbus slave,如下所示。我使用 Simply modbus 主站软件(http://www.simplymodbus.ca/RTUmaster.ht
我写了一个代码,通过 ModBUS RTU 与 9600 波特率的主设备进行通信。我下载了一个模拟程序,它是 ModBUS Slave。我可以通过这种方式与PC通信。我可以用我的微 Controlle
我正在实现一个软件,我可以通过串口在 Modbus RTU 协议(protocol)中读取和写入数据。为此,我需要计算字节串末尾的两个 CRC 字节,但我无法做到这一点。 在网上搜索,我发现了两个似乎
刚接触 Modbus 并使用 Modbus RTU 开发应用程序。我想知道如何找出RTU消息帧分离时间。在 Modbus RTU 规范中,它提到了 3.5 个字符的时间,但没有更多关于我如何决定这个间
我想通过 Modbus 协议(protocol)在 Raspberry PI(从机)和我的 PC(主机)之间建立通信。目前,我正在使用 modbus-tk (python) 来设置通信协议(proto
我正在尝试在 Digi Module connect me 9210 设备中实现 Modbus RTU Master。为此,我使用 libmodbus 库。 我必须在 NetOs 中提供什么设备名称才
我的问题会很奇怪,所以我很抱歉。 我将在名为“DiGi Module Connect Me 9210”的电子设备中实现 Modbus RTU Master。我将从该设备向 PIC 请求一些数据,如节点
我正在尝试设置一个接受 modbus RTU 轮询的监听器。 我发现了很多与modbus相关的npm库,但它们都与其他modbus从站的轮询有关,或者充当modbus TCP服务器。我需要模拟modb
我正在尝试编写 modbus slave 并遇到一个问题:我正确地接收了来自 master 的请求,但是当我尝试响应时,它看起来像是错误地发送到串行端口,因为当我插入 RS485 嗅探器时 - 我明白
我编写了一些简单的代码来从计时器的 2 个寄存器中获取信息。 我正在向 OVEN 发送下一个命令: 10 03 00 16 00 02 26 8E 并期望得到下一个响应(尝试使用 OpenSCADA
我正在使用 modbus-tk 通过 RS-485 网络通过 Modbus RTU 与设备进行串行通信。 我正在尝试弄清楚如何使用函数 23,READ_WRITE_MULTIPLE_REGISTERS
我是 Python 的初学者 (仅供引用),并尝试使用 minimalmodbus 库 (Python + Mac) 与 Gefran 800P 程序员/ Controller 进行通信。我正在使用
我是一名优秀的程序员,十分优秀!