VB实现CRC冗余校验技术详解

版权申诉
0 下载量 7 浏览量 更新于2024-11-15 收藏 1.12MB RAR 举报
资源摘要信息: "CRC.rar_VB中CRC" 关键词:VB、CRC、冗余校验、串行通讯 知识点详细说明: 1. VB(Visual Basic)简介: Visual Basic(VB)是由微软公司开发的一种事件驱动编程语言,它是***的基础。VB以其易于学习和使用的特性,特别是在创建Windows应用程序方面,受到许多初学者和专业开发者的青睐。由于VB是一种面向对象的编程语言,它支持封装、继承和多态等面向对象的特性。 2. CRC(循环冗余校验)概念: CRC是一种基于多项式的冗余校验方法,广泛用于数据通信和存储领域中检测数据完整性。CRC算法通过将数据视为一个长的二进制数,然后用预先定义好的生成多项式去除,得到余数(即CRC码),附加到原始数据后进行传输或存储。接收方再使用相同的生成多项式对数据(包括CRC码)进行运算,如果得到的余数为零,则认为数据在传输或存储过程中未发生错误。 3. CRC冗余校验在串行通讯中的应用: 串行通讯是一种在两个设备之间通过串行数据线发送和接收数据的通讯方式,常见的串行接口包括RS-232、RS-485等。在串行通讯中,数据通常被分成一个个字节进行传输。由于通信线路的噪音或干扰等因素,数据在传输过程中可能会出现错误,影响数据的准确性和可靠性。使用CRC冗余校验可以帮助接收方检测到这些错误,提高数据传输的可靠性。 4. VB中实现CRC的方法: 在VB中实现CRC,一般有以下几种方法: - 利用现成的VB库函数,直接调用进行CRC计算。 - 编写自己的CRC算法函数,这通常需要对多项式计算有一定的了解。 - 使用第三方工具或组件提供的CRC算法。 具体到本次提供的文件“CRC.rar_VB中CRC”,文件内应该包含了VB语言编写的CRC算法代码,这些代码能够帮助开发者在VB项目中快速实现CRC校验功能。 5. 串行通讯中CRC校验的实现步骤: 在串行通讯中实现CRC校验一般涉及以下步骤: - 发送方在发送数据前,先计算数据的CRC值。 - 将计算得到的CRC值附加到原始数据的末尾。 - 通过串行通讯将数据发送给接收方。 - 接收方接收到数据后,用相同的CRC算法重新计算接收到数据的CRC值。 - 将计算得到的CRC值与接收到的CRC值进行对比,如果相同则认为数据传输正确无误,否则数据传输过程中发生了错误。 6. CRC算法的实现细节: CRC算法的实现主要涉及到数据位的处理、生成多项式的选取以及余数的计算等。在编程实现时,可以通过位移操作和异或运算来模拟数据的多项式除法过程。生成多项式的选择对于CRC校验的能力至关重要,不同的多项式会得到不同的检测效果,常用的多项式有CRC-16、CRC-32等。 7. VB实现CRC的优点和局限性: 使用VB实现CRC的优点在于开发效率高,方便快捷,易于理解和调试。然而,VB作为解释型语言,在处理大数据量或高频度通信时,可能会因为性能问题受到一定限制。因此,在一些对性能要求极高的场合,开发者可能会选择使用C/C++等编译型语言来实现CRC算法。 通过上述内容的介绍,我们了解了VB中实现CRC冗余校验的原理、实现方式以及在串行通讯中的应用。开发者可以根据实际需求选择合适的实现方法,并通过实例代码或相关库函数提高开发效率和通信可靠性。
2023-05-27 上传

//XW_crc_p.v `pragma protect begin module DW_crc_p( data_in, crc_in, crc_ok, crc_out ); parameter integer data_width = 16; parameter integer poly_size = 16; parameter integer crc_cfg = 7; parameter integer bit_order = 3; parameter integer poly_coef0 = 4129; parameter integer poly_coef1 = 0; parameter integer poly_coef2 = 0; parameter integer poly_coef3 = 0; input [data_width-1:0] data_in; input [poly_size-1:0] crc_in; output crc_ok; output [poly_size-1:0] crc_out; `define DW_max_data_crc_1 (data_width>poly_size?data_width:poly_size) wire [poly_size-1:0] crc_in_inv; wire [poly_size-1:0] crc_reg; wire [poly_size-1:0] crc_out_inv; wire [poly_size-1:0] crc_chk_crc_in; reg [poly_size-1:0] crc_inv_alt; reg [poly_size-1:0] crc_polynomial; `include "bit_order_crc_function.inc" `include "bit_order_data_function.inc" `include "calculate_crc_w_in_function.inc" `include "calculate_crc_function.inc" `include "calculate_crc_crc_function.inc" generate //begin genvar bit_idx; reg [63:0] crc_polynomial64; reg [15:0] coef0; reg [15:0] coef1; reg [15:0] coef2; reg [15:0] coef3; assign coef0= poly_coef0; assign coef0= poly_coef1; assign coef0= poly_coef2; assign coef0= poly_coef3; assign crc_polynomial64 = {coef3, coef2, coef1, coef0}; assign crc_pollynomial = crc_polynomial64[poly_size-1:0]; case(crc_cfg/2) 0: assign crc_inv_alt = {poly_size{1'b0}}; 1: for(bit_idx = 0; bit_idx<poly_sizel bit_idx=bit_idx+1) assign crc_inv_alt[bit_idx] = (bit_idx % 2)? 1'b0:1'b1; 2: for(bit_idx=0; bit_idx<poly_size; bit_idx=bit_idx+1) assign crc_inv_alt[bit_idx] = (bit_idx % 2)?1'b1:1'b0; 3: assign crc_inv_alt = { poly_size{1'b1}}; endcase endgenerate assign crc_in_inv = bit_order_crc(crc_in) ^ crc_inv_alt; assign crc_reg = calculate_crc(bit_order_data(data_in)); assign crc_out_inv = crc_reg; assign crc_out = bit_order_crc(crc_out_inv)^ crc_inv_alt; assign crc_chk_crc_in = calculate_crc_crc(crc_reg, crc_in_inv); assign crc_ok = (crc_chk_crc_in ==0); `undef DW_max_data_crc_1 endmodule `pragma protect end can you write a testbench for this piece of CRC verilog code so that this verilog file and the testbench can be used togerther by vcs to verify the correctness of this verilog file?

2023-06-14 上传

import serial import modbus_tk.defines as cst from modbus_tk import modbus_rtu import struct # 打开两个串口 com1 = serial.Serial(port='com2', baudrate=38400, bytesize=8, parity='N', stopbits=1) com2 = serial.Serial(port='com3', baudrate=38400, bytesize=8, parity='N', stopbits=1) # 创建Modbus RTU主机(master) master = modbus_rtu.RtuMaster(com1) master.set_timeout(1.0) master.set_verbose(True) # 读取保持寄存器数据 red = master.execute(1, cst.READ_HOLDING_REGISTERS, 0, 9) print(red) # 将字节数组划分为若干个长度为4的子数组 # def hex_f(a,b): # # g1=b # # z=a+g1#高低16位组合 # # z1=hex(z)[2:]#取0x后边的部分 # # # print(z1) # # return struct.unpack('!f', z1.decode('hex'))[0]#返回浮点数 # # e = hex_f(red[0],red[1]) # # print(e) red1 = master.execute(1, cst.READ_HOLDING_REGISTERS, 0, 9)[0] # 这里可以修改需要读取的功能码 print(red1) new = int(red1 * 0.8) print(new) red =master.execute(1, function_code=cst.WRITE_MULTIPLE_REGISTERS, starting_address=0, output_value=[new]) # 读取输入寄存器数据 input_regs = master.execute(1, cst.READ_INPUT_REGISTERS, 0, 9) print(input_regs,1) # 读取输入线圈数据 input_bits = master.execute(1, cst.READ_COILS, 0, 9) print(input_bits,2) # 读取输出线圈数据 output_bits = master.execute(1, cst.READ_DISCRETE_INPUTS, 0, 9) print(output_bits,3) # 将所有读取数据打包为Modbus RTU消息并写入com2串口 data = red + input_regs + input_bits + output_bits com2.write(master._do_crc(data)) # 关闭串口 com1.close() com2.close()AttributeError: 'RtuMaster' object has no attribute '_do_crc'咋修改不报错

2023-05-27 上传
2023-05-27 上传