硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1059|回复: 9
收起左侧

[CAN助手] H7TOOL CAN 波形显示

[复制链接]

9

主题

17

回帖

49

积分

初级会员

积分
49
发表于 2022-11-14 12:37:40 | 显示全部楼层 |阅读模式
image.png 求教一下各位大佬,上位机通过CAN通信接收到8字节数据,前四字节是一个变量,后四字节是一个变量,我想将数据移位处理后画出两个变量的波形。红框是我添加的程序,但实际没有波形,https://www.armbbs.cn/forum.php? ... BCAN%2B%B2%A8%D0%CE 我看到了这篇帖子。也模仿着写了一下。求教哪里出了错,波形显示不出来
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107262
QQ
发表于 2022-11-14 15:20:49 | 显示全部楼层
方便的话,把你的代码贴出来下,今晚,最晚明天上午我测试下。
回复

使用道具 举报

747

主题

1049

回帖

3295

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3295
发表于 2022-11-14 15:24:29 | 显示全部楼层
请检查下解码器有没编译错误。另外请插入解密器完整代码。局部看不出问题。
回复

使用道具 举报

9

主题

17

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2022-11-14 16:30:30 | 显示全部楼层
------------------------------------------------------------------
-- 安富莱开发板V7的CANFD 双波特率例子解码器
------------------------------------------------------------------

--分窗标志定义
WIN_0 = 0x0001
WIN_1 = 0x0002
WIN_2 = 0x0004
WIN_3 = 0x0008
WIN_4 = 0x0010
WIN_5 = 0x0020
WIN_6 = 0x0040
WIN_7 = 0x0080
WIN_8 =  0x0100
WIN_9 =  0x0200
WIN_10 = 0x0400
WIN_11 = 0x0800
WIN_12 = 0x1000
WIN_13 = 0x2000
WIN_14 = 0x4000
WIN_15 = 0x8000

--CAN 解码函数,返回的字符串将展示到数据窗口
--id  帧ID
--std_ext 0-标准帧 1-扩展帧
--data_remote 0-数据帧 1-远程帧
--datalen 数据长度 字节
--data_bin 二进制数据
--函数返回:ret1解码字符串,ret2分窗控制字,波形数据字符串
function can_decoder(id, std_ext, data_remote, datalen, data_bin)
        local ret1 = ""                --返回值1 解码显示结果
        local ret2 = 0          --返回值2 分窗标志
        local bin = {}
        local i
        local str_wave = ""       

        local pos    --位置
        local speed  --速度


        --将字符串转换到整数数组存放
        for i = 1,#data_bin,1 do
                bin = tonumber(string.byte(data_bin, i,i))
        end
       
        --计算解码结果,将显示在数据包后面
    if (id == 0x001) then --下位机设置的CAN帧ID
        pos = bit.shl(bin[0],24) + bit.shl(bin[1],16) + bit.shl(bin[2],8) + bin[3]
        speed = bit.shl(bin[4],24) + bit.shl(bin[5],16) + bit.shl(bin[6],8) + bin[7]
        str_wave = string.format("%d,%d\r\n", pos,speed)

        end       
        if (id == 0x111) then               
                if (bin[2] == 0) then
                        ret1 = string.format("关闭蜂鸣器")
                else
                        ret1 = string.format("控制蜂鸣器叫%d几次", bin[2])
                end
        elseif (id == 0x222) then       
                if (bin[2] == 1) then
                        ret1 = string.format("点亮LED%d", bin[3])
                else
                        ret1 = string.format("熄灭LED%d", bin[3])
                end
        end
       
        --计算分窗标志,决定数据包同步到哪些子窗口
        if (id == 0x111) then                        --控制蜂鸣器的显示到窗口0
                ret2 = ret2 | WIN_0       
        elseif (id == 0x222) then        --控制LED的指令显示到窗口1
                ret2 = ret2 | WIN_1
        end

        return ret1, ret2, str_wave
end
我就是在V7_CANFD的lua源文件添加了红色这几句
回复

使用道具 举报

9

主题

17

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2022-11-14 16:32:55 | 显示全部楼层
image.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107262
QQ
发表于 2022-11-14 16:38:11 | 显示全部楼层
L.Y1997 发表于 2022-11-14 16:30
------------------------------------------------------------------
-- 安富莱开发板V7的CANFD 双波特 ...

好的,待我测试后回复你。
ps:这个函数bit.shl是你自己封装的? 我们当前的是不支持这个的。
回复

使用道具 举报

9

主题

17

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2022-11-14 16:45:07 | 显示全部楼层
麻烦您了大佬,主要我对LUA并不熟悉,也排不出哪里的错。bit.shl我看到有几个帖子用,所以我试一下,后来改成直接对bin[]去×2^n然后相加,也没出来。能力尚浅
回复

使用道具 举报

747

主题

1049

回帖

3295

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3295
发表于 2022-11-14 23:49:45 | 显示全部楼层
PC界面已经显示lua解码器第46行语法错误。

正确写法:

--bin = {0,1,2,3,4,5,6,7}  --输入变量

pos   = (bin[1] << 24) + (bin[2] << 16) + (bin[3] << 8) + bin[4]
speed = (bin[5] << 24) + (bin[6] << 16) + (bin[7] << 8) + bin[8]
str_wave = string.format("%d,%d\r\n", pos,speed)

--print(str_wave)  --测试
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107262
QQ
发表于 2022-11-15 00:02:41 | 显示全部楼层
传递过来的data_bin不是原始数值,是字符,要转换,也就是代码里面调用的bin = tonumber(string.byte(data_bin, i,i)),就是这个功能。

完整代码如下:
[Lua] 纯文本查看 复制代码
------------------------------------------------------------------
-- 安富莱开发板V6的CAN例子解码器
------------------------------------------------------------------

--分窗标志定义
WIN_0 = 0x0001
WIN_1 = 0x0002
WIN_2 = 0x0004
WIN_3 = 0x0008
WIN_4 = 0x0010
WIN_5 = 0x0020
WIN_6 = 0x0040
WIN_7 = 0x0080
WIN_8 =  0x0100
WIN_9 =  0x0200
WIN_10 = 0x0400
WIN_11 = 0x0800
WIN_12 = 0x1000
WIN_13 = 0x2000
WIN_14 = 0x4000
WIN_15 = 0x8000

bin = {}	--全局变量

g_id = 0
g_std_ext = 0
g_data_remote = 0

--CAN 解码函数,返回的字符串将展示到数据窗口
--id 帧ID
--std_ext 0表示标准帧, 1表示扩展帧
--data_remote 0表示数据帧, 1表示远程帧
--datalen 数据长度,字节
--data_bin 二进制数据
--函数返回: ret1解码字符串 , ret2分窗控制字, 波形数据字符串
function can_decoder(id, std_ext, data_remote, datalen, data_bin)
	local ret1 = ""		--返回值1 解码显示结果
	local ret2 = 0  	--返回值2 分窗标志
	local bin = {}
	local i
	local str_wave = ""	
	local pos    --位置
	local speed  --速度
	
	g_id = id
	g_std_ext = std_ext
	g_data_remote = data_remote
	
	--#将字符串转换到整数数组存放
	for i = 1,#data_bin,1 do
		bin[i] = tonumber(string.byte(data_bin, i, i))
	end	
	
	--计算解码结果,将显示在数据包后面
	if (id == 0x321) then
		pos = bin[1] << 24 + bin[2] << 16 + bin[3] << 8 + bin[4]
		speed = bin[5] << 24 + bin[6] << 16 + bin[7] << 8 + bin[8]
		str_wave = string.format("%d,%d\r\n", pos, speed)
		--判断数据域
		if (bin[1] == 0x00) then
			ret1 = "控制LED1点亮"
		elseif (bin[1] == 0x01) then
			ret1 = "控制LED2点亮"
		elseif (bin[1] == 0x02) then
			ret1 = "控制LED3点亮"
		elseif (bin[1] == 0x03) then
			ret1 = "控制LED4点亮"		
		end
	end

	--计算分窗标志, 决定数据包同步显示到哪些子窗口
	if (bin[1] == 0x00) then
		ret2 = ret2 | WIN_0
	elseif (bin[1] == 0x01) then
		ret2 = ret2 | WIN_1
	elseif (bin[1] == 0x02) then
		ret2 = ret2 | WIN_2
	elseif (bin[1] == 0x03) then
		ret2 = ret2 | WIN_3
	end

	return ret1, ret2, str_wave
end




效果:

image.png
回复

使用道具 举报

9

主题

17

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2022-11-15 13:40:28 | 显示全部楼层
image.png 波形出来了。谢谢两位大佬!万分感谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-23 12:32 , Processed in 0.356172 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表