演示CAN协议转换器读写原生CAN协议数据的例程,读取CAN设备发送的数据,向CAN设备写入数据

关键词:CAN协议转换/转换模块/转换器,Lua编程,DroneCAN/UAVCAN/CAN转换器,Ardupilot,Px4,Pixhawk,UartAssist,读写CAN协议数据,DroneCAN协议与原生CAN协议数据转换,DroneCAN协议与自定义CAN协议数据转换

Keywords:Demonstrates a case of reading and writing CAN protocol data, CAN protocol conversion/converter/conversion module, Lua programming, DroneCAN/UAVCAN/CAN converter, Ardupilot, Px4, Pixhawk, UartAssist, Read and write CAN protocol data, convert DroneCAN protocol and native CAN protocol data, convert DroneCAN protocol and custom CAN protocol data

Ключевые слова:Демонстрируется случай чтения и записи данных протокола CAN, Модуль преобразования/конвертера/преобразования протокола CAN, программирование Lua, преобразователь DroneCAN/UAVCAN/CAN, Ardupilot, Px4, Pixhawk, UartAssis, Чтение и запись данных протокола CAN, преобразование протокола DroneCAN и данных протокола CAN, преобразование протокола DroneCAN и данных пользовательского протокола CAN

哈喽大家好,我是Mokel。这是Pogo-CAN转换器/转换模块(can-convertor转换器)系列视频的第三期。在第一期视频我们介绍了can-convertor转换器,第二期视频中我们演示了读写DroneCAN协议数据的例程。这期视频中我将演示在can-convertor转换器中如何通过Lua代码读写原生CAN协议数据。

这期视频中我将用到Pogo-CAN协议转换器/转换模块(can-convertor转换器)、Pogo-DroneCAN调试器(canv2调试器)、GH1.25-4P双头反向端子线以及两根typeC转USB线。

你可以在淘宝搜索“CAN协议转换 px4”找到Pogo-CAN转换器商品或者直接点击评论区置顶链接(https://item.taobao.com/item.htm?spm=a21n57.1.0.0.7e56523cjhl6Oc&id=750897861626&ns=1&abbucket=17#detail)跳转到商品。

该商品也上架了俄罗斯电商平台OZON,你可以通过搜索关键词“Модуль преобразования cоглашение CAN”找到商品或者直接点击评论区置顶链接(https://www.ozon.ru/product/modul-preobrazovaniya-coglashenie-can-podderzhka-px4-pixhawk-ardupilot-podderzhka-programmirovaniya-1346610729/?asb=a7D3xKAAFCBoCKqQPIHhDhA7YESO2M9%252BDg4SWOxhKmk%253D&asb2=dtTUZykkKGWFh2Dos3wDcpH9qvmxF3jrRLoQjbqXhHyDWLPydKdYk1CiwF1q9MHCZ98QmDvbtyMlFo8dsqXSiw0iL-tFl3ZFWsg5n72DgGiT61hWqEPZ_fN-hOpkPNTi&avtc=1&avte=2&avts=1703401190&keywords=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C+%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F+c%D0%BE%D0%B3%D0%BB%D0%B0%D1%88%D0%B5%D0%BD%D0%B8%D0%B5+CAN)跳转到商品。

同时,你可以在淘宝搜索“DroneCAN调试器”找到Pogo-DroneCAN调试器(canv2调试器),也可以通过评论区置顶链接(https://item.taobao.com/item.htm?spm=a21n57.1.0.0.2b9a523cYE9t78&id=734695507467&ns=1&abbucket=15#detail)直接跳转商品。该商品也上架了俄罗斯电商平台OZON,你可以通过搜索关键词“Отладчик DroneCAN”找到该商品,也可以通过评论区置顶链接(https://www.ozon.ru/product/otladchik-dronecan-uavcan-konverter-usb-can-izmenenie-proshivki-s-pomoshchyu-qgc-1346580712/?asb=Oaqy7GWh%252BuG5Uct4DT5YEaFYsnMz6G%252Fs7Or0MSlWDhw%253D&asb2=8OXO2usSNqJRQIWXLtovWVB92lxf2fcf01rcW64dRBUB00ytZba_n5caH5gOrcj_OAQ1ShXm3WPGz5O50L9Ck1ipLgk3QMcbK7fBpzXdlII8Ao00psQcK1RhANh79JFT&avtc=1&avte=2&avts=1703434129&keywords=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA+DroneCAN)跳转商品。

can-convertor转换器连接CAN设备时,我们可以通过编写Lua代码读写原生CAN协议数据。在教程中我们使用canv2调试器模拟CAN设备来和can-convertor转换器进行原生CAN数据收发操作。canv2调试器默认功能是转换DroneCAN协议和SLCAN协议,所以我们不能直接使用canv2调试器来进行例程演示。Pogo官方关于canv2调试器教程中有提到canv2调试器支持搭载candleLight_fw固件,在CAN协议生态中candleLight_fw固件是调试原生CAN协议的一个很好的解决方案,通过配套的cangaroo上位机,我们可以很方便的对原生CAN协议数据进行调试。更多关于candleLight_fw固件和cangaroo上位机的信息可以在CANable官网(https://canable.io/updater/)中查看。

我们需要将canv2调试器更新为candleLight_fw固件,我会在下文演示如何为canv2调试器刷固件,而can-convertor转换器仍然搭载着官方默认固件can-convertor.bin(https://gitee.com/pogo-tech/can-convertor-lua/releases)。

演示中,我们除了用到上面提到的上位机cangaroo,我们还会用到UartAssist串口调试助手。在之前教程中我们已经完成了UartAssist的安装,这里就不做过多的赘述了。

我们接下来要完成cangaroo上位机的安装,以及将我们的canv2调试器搭载的固件更新为candleLight_fw。

我们通过Pogo官方提供的资源安装cangaroo,打开Pogo官方gitee代码仓库release(https://gitee.com/pogo-tech/can-convertor-lua/releases),其中提供了cangaroo压缩包资源,点击下载。下载完成后,解压压缩包,在解压后的文件夹内可以看到cangaroo.exe文件。点击cangaroo.exe便可以运行cangaroo。

在Pogo官方代码仓库中同样为我们提供了candleLight_fw固件资源。打开gitee代码仓库release(https://gitee.com/pogo-tech/candle-light_fw/releases/tag/can_v2-0.1),找到我们需要的固件,点击candleLight_fw.bin下载固件。

我们将使用QGroundControl软件来更新canv2调试器的固件,你可以查看之前的视频(利用QGC (QGroundControl) 刷Pogo-DroneCAN调试器固件,官方提供slcan、convertdevice_xCAN_fw、candleLight_fw等多种CAN协议固件_candlelight fw can-CSDN博客)获取QGroundControl软件资源。打开QGroundControl,点击操作窗口左上角QGroundControl软件图标,点击Vehicle Setup按钮,进入更新固件界面。点击左上角固件按钮,等待设备连接。

将canv2调试器通过TypeC线连接到电脑,然后QGroundControl窗口中会弹出固件设置子窗口,我们选择高级设置,再将下拉框中的选项修改为自定义固件文件,点击确定。

此时选择我们要更新的固件,选择candleLight_fw.bin文件,点击打开,便开始更新canv2调试器的固件。当我们看到升级完成提示,说明canv2调试器已经更新为candleLight_fw固件。

连接我们的设备,通过GH1.25-4P双头反向端子线将can-convertor转换器的CAN1口和canv2调试器连接起来。然后将两根typeC转USB线连接到两个设备。

设备连接完成,接下来可以开始第一个例程“CAN_Read”。将can-convertor转换器通过TypeC线连接到电脑,将pogo.lua替换为下述代码,具体替换步骤参考前两期教程。

local can_num = 1

candrv.set_BitRate(can_num, 1000)
candrv.set_Protocol(can_num, 0)
candrv.enable(can_num)

local data = { 0, 0, 0, 0, 0, 0, 0, 0 }

while true do
    candrv.recv(can_num)

    local id = candrv.get_ID(can_num)
    local len = candrv.get_Len(can_num)
    local is_ext = candrv.get_IDE(can_num)

    print("id=", id)
    print("len=", len)
    print("is_ext=", is_ext)

    for i = 1, len, 1 do
        data[i] = candrv.get_Data(1, i - 1)
        print("data", i, data[i])
    end

    delay(500)
end

代码中,通过candrv.set_BitRate()、candrv.set_Protocol()、candrv.enable()三个函数分别将转换器的通信波特率设置为1000K,通信协议设置为原生CAN协议,以及使能转换器CAN1口(代码中CAN口参数can_num的值可以为0或1,分别对应转换器上的CAN0口和CAN1口,脚本中声明的can_num值为1,表示CAN1口)。 

在can-convertor转换器中存在一个内存空间用来保存从CAN口接收到的数据。逻辑代码部分,首先通过candrv.recv()函数将CAN1口从canv2调试器接收到的数据保存下来。之后通过candrv.get_ID()、candrv.get_Len()和candrv.get_IDE()等一系列get函数解析并获取该内存空间中的数据ID、数据长度以及是否是扩展帧等数据。再之后使用print()函数打印获取到的数据。最后代码会根据数据长度,循环获取数据的每一位,并打印出来。

pogo.lua代码已经替换完成,然后我们打开UartAssist串口调试助手,将can-convertor转换器端通过TypeC线连接到电脑,并在UartAssist选中它开始调试。

此时UartAssist的数据日志窗口中,我们可以看到id、len、is_ext的值都为0,说明can-convertor转换器并没有接收到canv2调试器发送的数据。

我们再将canv2调试器端连接到电脑上,打开cangaroo上位机,点击cangaroo窗口左上角的measurement,再点击下拉框中的start measurement按钮,此时我们窗口会弹出一个调试配置页面。选中cangaroo检测到的接口candle0,并将波特率设置成和Lua代码中定义的波特率一样的值。由于我们在Lua代码中传给candrv.set_BitRate()函数的参数值为1000,且单位为K,所以我们选择波特率为1000000。配置完成,点击OK,进入调试界面,此时我们在调试界面的Log窗口中可以看到打印的两条信息,说明我们设备连接成功。

连接成功后,我们通过cangaroo上位机操作canv2调试器。我们在Transmit View窗口中配置canv2调试器向can-convertor转换器发送的数据,首先通过将Address框中的数置为111,从而把canv2调试器的节点ID设置为111,之后将发送的Payload数据设置为11,22,33,44,55,66,77,88,Extended选项框则是声明发送的数据是否是扩展帧,我们暂时不勾选它。

点击Transmit View窗口左下角的Send Repeated按钮,canv2调试器开始不断向can-convertor转换器发送原生CAN协议数据,且在左侧的Log窗口可以看到调试器发送的数据。

我们通过在UartAssist中打印的can-convertor转换器的调试数据,判断是否成功接收到canv2调试器发送的数据。我们看到在UartAssist中打印的id、len字段不再是0,且日志中打印了在cangaroo设置的Payload数据。这里需要说明一下,在cangaroo中设置的是16进制数据,而在UartAssist中则是以10进制显示,所以我们看到UartAssist打印的调试信息中,id以及data值和cangaroo中设置的值存在差别。can-convertor转换器成功通过Lua脚本获取canv2调试器发送的数据并打印出来。

接下来是“CAN_Send_and_Recv”例程,将演示通过Lua脚本让can-convertor转换器向CAN设备发送原生CAN协议数据,先将pogo.lua的代码替换以下代码:

local can_num = 1

candrv.set_BitRate(can_num, 1000)
candrv.set_Protocol(can_num, 0)
candrv.enable(can_num)


while true do
    candrv.recv(can_num)

    local len = candrv.get_Len(can_num)

    if (len > 0) then
        local id = candrv.get_ID(can_num)

        if (candrv.get_IDE(can_num)) then
            candrv.set_ExtID(can_num, id + 1)
        else
            candrv.set_StdID(can_num, id + 1)
        end

        candrv.set_Len(can_num, len)

        for i = 1, len, 1 do
            candrv.set_Data(can_num, i - 1, candrv.get_Data(can_num, i - 1))
        end

        candrv.send(can_num)
    end

    delay(100)
end

在can-convertor转换器中不仅存在一个内存空间用来存储转换器接收到的数据,还为发送数据提供了一个内存空间。Pogo官方封装了一系列函数帮助我们操作这两个内存空间。如同candrv.recv()函数会将CAN口接收到的数据保存到内存空间中,candrv.send()方法会将内存空间中的待发送数据发送给指定CAN口连接的设备。除此之外,我们还可以通过一系列get或set函数获取或设置内存空间的数据。比如说,我们可以通过candrv.get_ID()和candrv.get_IDE()函数获取内存空间中接收到的数据的id值以及它是否是扩展帧数据。再比如说,我们通过candrv.set_ExtID()函数将指定CAN口的待发送数据设置为扩展帧数据并设置数据id,或者通过candrv.set_Data()函数为指定CAN口的待发送数据设置数据某一位的值。

在脚本中首先通过candrv.recv(can_num)函数将CAN1口接收到的canv2调试器数据保存下来,之后调用candrv.get_Len()函数获取接收到的数据的长度,当接收到数据长度大于0时,获取该数据的id值,再判断该数据是否是扩展帧数据;如果是的话,通过candrv.set_ExtID(can_num, id + 1)函数将待发送回去的数据设置为扩展帧数据且将其id值置为接收到的数据的id值加一;如果不是的话,通过candrv.set_StdID(can_num, id + 1)函数发送标准数据帧,数据id同样为接收到的数据的id值加一;完成待发送数据的id值设置之后,代码会通过在for循环中调用candrv.set_Data()函数,设置待发送数据的每一位的值,且值和接收到的数据同一位上的值相同,最后我们再调用candrv.send()函数将设置好的数据发送回去。

我们来进行实际的演示,打开UartAssist串口调试助手,将can-convertor转换器端连接到电脑上,UartAssist中选中转换器后开始调试。之后再将canv2调试器端连到电脑,打开cangaroo,点击start Measurement开始配置canv2调试器,将调试器通信的波特率设置为1000000,然后点击“OK”。

我们在Transmit View窗口中设置canv2调试器的发送数据,并点击Send Repeated按钮不断向发送can-convertor转换器发送数据。Lua脚本中,转换器根据接收到的数据设置返回数据,并通过candrv.send()函数将重新设置后的数据发送回canv2调试器。我们可以通过cangaroo的主窗口看到发送回去的数据;记得去掉aggregate by ID选项框的勾选,否则会只显示一条数据。

cangaroo中成功打印了正确的返回数据,例程演示成功。

本期视频就到这里了,更多原生CAN协议相关例程可以在Pogo官方gitee仓库(https://gitee.com/pogo-tech/can-convertor-lua)中找到,你你可以参照官方例程编写更多自定义功能。我们下期视频,不见不散。

  • 20
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值