lua脚本串口收发与CRC16校验及使用方法

lua脚本CRC16校验

--calculate CRC16校验
--@data : t, data to be verified
--@n    : number of verified
--@return : check result
function add_crc16(start, n, data)
	
	local carry_flag, a = 0
    local result = 0xffff
    local i = start

	while(true)
	do
		result = result ~ data[i]
		for j = 0, 7
        do
            a = result
            carry_flag = a & 0x0001
            result = result >> 1
            if carry_flag == 1
            then
                 result = result ~ 0xa001
            end
        end
		
		i = i + 1
		if i == start + n
		then
			break
		end
	end

    return result
end

lua脚本串口发送与CRC16校验使用方法

function UartSendBuf()
	local BUF= {
   }--数据缓冲区
	local send_crc16 = 0
	local cmd_head   = 0x5A --帧头
	local cmd_end    = 0xA5 --帧尾
	
	BUF[0] = cmd_head
	BUF[1] = 0x01
	BUF[2] = 0x02
	BUF[3] = 0x03
	BUF[4] = 0x03
	
	send_crc16 = add_crc16(1, 4, BUF)--计算BUF[1]至BUF[4]CRC校验值
	--send_crc16 = add_crc16(0, 4, BUF)--计算BUF[0]至BUF[4]CRC校验值
	BUF[5] = (send_crc16 >> 8) & 0xFF
	BUF[6] = (send_crc16 >> 0) & 0xFF
	BUF[7] = cmd_end
	uart_send_data(BUF)
end

lua脚本串口接收与CRC16校验使用方法

local buff         = {
   }--数据缓冲区
local cmd_length   = 0 --帧长度
local cmd_head_tag = 0
local cmd_end_tag  = 0 --帧尾标识

-- 系统函数: 串口接收函数
function on_uart_recv_data(packet)

	local cmd_head = 0xA5  --帧头
	local cmd_end  = 0x5A  --帧尾
	local recv_packet_size = (#(packet))
	local check16          = 0
	
	for i = 0, recv_packet_size 
	do
		if packet[i] == cmd_head and cmd_head_tag == 0
		then
			cmd_head_tag = 1
		end
		
		if cmd_head_tag == 1
		then
			buff[cmd_length] = packet[i]
			cmd_length = cmd_length + 1
			cmd_end_tag = (cmd_end_tag << 8) | (packet[i])
			if (cmd_end_tag & cmd_end)== cmd_end
			then
				check16 = ((buff[cmd_length - 3] << 8) | buff[cmd_length - 2]) & 0xFFFF 
				print('CODE= '..string.format('%04X', check16))
				print('check16_is = '..string.format('%04X', add_crc16(0, cmd_length - 3, buff)))  --打印包含帧头校验值,不含校验位、帧尾
				--print('check16_is = '..string.format('%04X', add_crc16(1, cmd_length - 3, buff)))  --打印不包含帧头、校验位、帧尾、校验值。
				if check16 == add_crc16(0, cmd_length - 3, buff) --包含帧头校验
				--if check16 == add_crc16(1, cmd_length - 3, buff) --不包含帧头校验
				then
					--your code start
					--Processmessage(buff)
					--your code start end	
					buff         = {
   }
					cmd_length   = 0
					cmd_end_tag  = 0
					cmd_head_tag = 0	
				end
			end
		end
	end
end

相关推荐

  1. lua脚本串口收发CRC16校验使用方法

    2023-12-11 08:46:04       47 阅读
  2. Python实现ANSI CRC16校验算法

    2023-12-11 08:46:04       41 阅读
  3. <span style='color:red;'>crc</span><span style='color:red;'>校验</span>

    crc校验

    2023-12-11 08:46:04      43 阅读
  4. Redis使用Lua脚本

    2023-12-11 08:46:04       64 阅读
  5. Lua脚本使用

    2023-12-11 08:46:04       38 阅读
  6. modbus CRC16校验计算法查表法

    2023-12-11 08:46:04       47 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-11 08:46:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-11 08:46:04       106 阅读
  3. 在Django里面运行非项目文件

    2023-12-11 08:46:04       87 阅读
  4. Python语言-面向对象

    2023-12-11 08:46:04       96 阅读

热门阅读

  1. 基于curl 使用http多线程下载大文件

    2023-12-11 08:46:04       61 阅读
  2. 聊聊AsyncHttpClient的exception

    2023-12-11 08:46:04       48 阅读
  3. .__deepcopy__()函数-深拷贝

    2023-12-11 08:46:04       64 阅读
  4. Strange-Towers-of-Hanoi

    2023-12-11 08:46:04       53 阅读
  5. 20231210 随机矩阵和M矩阵

    2023-12-11 08:46:04       58 阅读