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

这篇具有很好参考价值的文章主要介绍了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[0] == cmd_head and cmd_head_tag == 0 --帧头判断  2023年12月13修复原packet[i] == cmd_head改为packet[0] == cmd_head,绝对位置第一个字节判断帧头
		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)== buff[7] --帧尾判断 2023年12月13修复原(cmd_end_tag & cmd_end)== cmd_end改为(cmd_end_tag & cmd_end)== buff[7],绝对位置最后一个字节判断帧尾,避免buff[2]~buff[6]中收到和帧尾同样的数据
			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
				else --出错清掉接收标记
					buff         = {}
					cmd_length   = 0
					cmd_end_tag  = 0
					cmd_head_tag = 0	
				end
			end
		end
	end
end

文章来源地址https://www.toymoban.com/news/detail-759628.html

到了这里,关于lua脚本串口收发与CRC16校验及使用方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MODBUS RTU 通信协议 CRC16校验算法

    CRC校验码是一个2个字节(16位二进制)的数。 发送端:发送的数据计算CRC校验码----发送:数据+CRC校验码 接收端:收到数据后重新计算CRC校验码,然后和接收到数据中的CRC校验码进行比较,判断是否相等。 如果不相等:数据传输过程中出错,给出错误应答。 CRC16 校验源码

    2024年02月16日
    浏览(52)
  • CRC16/ModBus校验与C语言实现方法

    目录 一、什么是CRC16/Modbus校验 二、CRC16/Modbus校验的计算步骤 三、CRC16/Modbus校验的C语言实现         CRC16/Modbus校验在设备通信时可以验证数据帧的完整性,从而避免错误数据。其应用十分广泛,主要应用于Modbus通信协议等,类似的校验方法还有许多,例如和校验,本文主

    2024年02月07日
    浏览(45)
  • MODBUS模型下CRC-16校验C/C++程序实现

    看了很多相关博客,例如http://t.csdn.cn/Ek3RV 又例如http://t.csdn.cn/HGUmo 这些文章所提供的代码似乎都是没有错误的,但很多文章的文字描述和代码并不对应。因此我也整理了一下,也当做是给自己做个笔记。 CRC校验按位计算的程序很好理解,写起来也比较简单,就是把模二除法

    2024年02月16日
    浏览(52)
  • C语言CRC-16 CCITT-FALSE格式校验函数

    CRC-16校验产生2个字节长度的数据校验码,通过计算得到的校验码和获得的校验码比较,用于验证获得的数据的正确性。基本的CRC-16校验算法实现,参考: C语言标准CRC-16校验函数。 不同应用规范通过对输入数据前处理和输出数据后处理的方式不同,又产生了不同的应用规范校

    2024年02月12日
    浏览(48)
  • 【STM32通讯系列--串口通讯】使用标准库、HAL库实现任意长度数据的收发(包含帧头、帧尾校验,配套完整开源程序)

    【数据组成】串口的通讯协议由开始位,数据位,校验位,结束位构成。 【数据结构】一般以一个低电平作为一帧数据的起始,接着跟随 8 位或者 9 位数据位,之后为校验位,分为奇校验,偶校验和无校验,最后以一个先高后低的脉冲表示结束位,长度可以设置为 0.5,1,

    2024年02月14日
    浏览(46)
  • JS十六进制转浮点、字符串转为ArrayBuffer、ArrayBuffer转16进制字符串、16进制转10进制、crc校验位、十六进制转中文字符串(小程序、浏览器)、十六进制字符串转ascall字串

    h5实现一键复制文本到剪切板 ArrayBuffer转16进制字符串: 字符串转为ArrayBuffer对象 十六进制转10进制 浮点型转十六进制: 将某段字符串使用某字符补齐 十六进制转带符号(-负号)整型 带符号(负号)整数转十六进制字符串(得到8个字符十六进制字符串) 带符号(负号)整数转

    2024年02月09日
    浏览(54)
  • (python)数据校验-CRC32校验

    目录 前言 数据校验概念 CRC校验算法 CRC计算原理 算法逻辑 流程图 CRC算法种类 代码实现CRC算法 python实现算法① python实现算法② 总结         在二次开发eCan上位机应用时,遇到了采用CRC(全称是循环冗余校验)32算法 校验文件传输完整性 的场景,浅浅地记录一下使用心得.  

    2023年04月16日
    浏览(74)
  • ZYNQ PS使用axi uartlite进行串口收发

    由于使用的ZYNQ PS部分只有两个串口,其中一个还当成了控制台用,串口不够用,于是使用PL的逻辑部分并利用IP核:AXI UARTLITE 为PS增加串口数量,并添加了AXI TIMER。 Vivado和Vitis为2020,PS为裸机使用。 包含以下内容: 1、Vivado的配置 2、axi uartlite代码 3、axi timer代码 4、利用IP核:

    2024年04月12日
    浏览(42)
  • CRC校验码计算,以常用CRC-8为例

    CRC即循环冗余校验码 :是数据通信领域中最常用的一种查错校验码,其 特征是信息字段和校验字段的长度可以任意选定。 CRC校验原理 :在要发送的帧后面附加一个数,生成一个新帧发送给接收端。它要 使所生成的新帧能与发送端和接收端共同选定的某个特定数整除 (注意

    2023年04月14日
    浏览(41)
  • 使用脚本收发 protobuf 协议数据

    最近做了一个 ipv6 相关的功能,发现使用 getifaddrs 获取的本地 ipv6 地址有可能不是真实的网络 ipv6 地址: 例如上图中通过 getifaddrs 获得了多个本地 ipv6 地址,其中 fe80 开头的已知是本地 ipv6 地址,被排除;还有 2408 这种,其实也是 \\\"假 ipv6\\\" 地址,对应的设备并不能访问 ipv6

    2024年02月08日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包