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
文章来源:https://www.toymoban.com/news/detail-759628.html
到了这里,关于lua脚本串口收发与CRC16校验及使用方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!